下面是一个小例子,说明了程序出现段错误时,如何打印程序的堆栈信息。

#include

#include

#include

#include

static void WidebrightSegvHandler(int signum)

{

void *array[10];

size_t size;

char **strings;

size_t i, j;

signal(signum, SIG_DFL); /* 还原默认的信号处理handler */

size = backtrace (array, 10);

strings = (char **)backtrace_symbols (array, size);

fprintf(stderr, "widebright received SIGSEGV! Stack trace:\n");

for (i = 0; i < size; i++) {

fprintf(stderr, "%d %s \n",i,strings[i]);

}

free (strings);

exit(1);

}

int invalide_pointer_error(char * p)

{

*p = 'd'; //让这里出现一个访问非法指针的错误

return 0;

}

void error_2(char * p)

{

invalide_pointer_error(p);

}

void error_1(char * p)

{

error_2(p);

}

void error_0(char * p)

{

error_1(p);

}

int main()

{

//设置 信好的处理函数

signal(SIGSEGV, WidebrightSegvHandler); // SIGSEGV 11 CoreInvalid memory reference

signal(SIGABRT, WidebrightSegvHandler); // SIGABRT 6 CoreAbort signal from

char *a = NULL;

error_0(a);

exit(0);

}

然后为了定位错误,我们需要加上-g参数编译一个带调试信息的版本,程序运行后打印堆栈信息如下

widebright received SIGSEGV! Stack trace:

0 ./a.out [0x8048580]

1 [0xb7fb3400]

2 ./a.out [0x8048636]

3 ./a.out [0x8048649]

4 ./a.out [0x804865c]

5 ./a.out [0x80486a9]

6 /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe5) [0xb7e52775]

7 ./a.out [0x80484c1]

知道了函数的地址可以有三种方法获取函数所在的文件和名称等相关信息。

使用GDB调试工具定位和调试错误。

info line *0x8048580 打印地址0x8048580处的相关信息。

list *0x8048580 获取地址0x8048580相关的上下文代码信息。

然后便可以确定行号,进行gdb调试了。

使用GCC编译选项生成MAP文件查找地址对应的函数信息。

使用GCC编译选项生成MAP文件查找地址对应的函数信息。在通过gcc/g++间接调用链接程序ld时,所有的ld选项前必须加上“-Wl,”,因为-Map是ld的选项。所以,要让g++生成mapfile,需要增加编译参数“ -Wl,-Map,mapfile”。

例:gcc -o helloworld helloworld.c -Wl,-Map,helloworld.map

然后通过map文件来查看函数的地址和函数名的对应关系了。

使用 Addr2line 将函数地址解析为函数名。 Addr2line 工具(它是标准的 GNU Binutils 中的一部分)是一个可以将指令的地址和可执行映像转换成文件名、函数名和源代码行数的工具。这种功能对于将跟踪地址转换成更有意义的内容来说简直是太棒了。 注意编译程序时需要添加-g选项才可以,也可以添加-Wl 和-map选项。 在调用 Addr2line 工具时,要使用 -e 选项来指定可执行映像是 test。通过使用 -f 选项,可以告诉工具输出函数名。 例如:addr2line 0x08048258 -e test -f

linux程序崩溃时调用链,Linux 获取并分析程序崩溃时的调用堆栈相关推荐

  1. python调用第三方接口获取数据_python 接口实现 供第三方调用的例子

    python 接口实现 供第三方调用的例子 实验环境 1.环境问题 python 2.7 以上自带的pyunit bottle 作为一个python的简易服务器 在python安装目录 打开命令窗口( ...

  2. linux如何安装交叉工具链,Linux:制作mipsel 交叉工具链 (更新版)

    1.代码结构为: setup ---> 源代码压缩包 src --->源码 ~/code/cross-compile$ ls src/ binutils-2.24 gcc-4.7.1 gd ...

  3. VC MFC程序,在About对话框中获取并显示程序的版本号

    =================================================本文为HeYuanHui原作 转载必须确保本文完整并完整保留原作者信息及本文原始链接! NN:     ...

  4. 小程序token有效期_微信小程序token过期时间后重新获取-微信小程序过期恢复步骤-微信小程序怎么找...

    1. 首先先封装个公用的jsclassConfig{constructor(){}}Config.restUrl'https://wx.knowdao.com';export{Config};2. 再 ...

  5. linux栈溢出漏洞,PWN简单栈溢出漏洞获取shell | kTWO-个人博客

    摘要 本文讲述的是PWN中利用溢出漏洞来执行shell命令的方法教程,本文将以简单的小程序来作为演示,从分析程序到编写payload加以利用,其中还含有二进制程序的保护机制简介. 0x01 前言 经过 ...

  6. vivo 调用链 Agent 原理及实践

    一.项目背景 2017年,vivo互联网研发团队认为调用链系统对实际业务具有较大的价值,于是开始了研发工作.3年的时间,调用链系统整体框架不断演进--本文将介绍vivo调用链系统 Agent 技术原理 ...

  7. linux小红帽系统装打印机驱动,Linux系统详解 第三篇:红帽RHEL的安装

    Linux系统详解 第二篇:红帽RHEL的安装 前言: 本系列文章取材广泛,有来自于互联网的,有来自教科书的,有来自自己的笔记的,也有来自自己对Linux的经验积累的.此系列的文章都是经过长时间的整理 ...

  8. 带哨兵节点的链_限流降级神器-哨兵(sentinel)的资源调用链原理分析

    点击上方 Yoon丶徒手摘星 ,选择 置顶或者星标技术干货每日送达! 我们已经知道了sentinel实现限流降级的原理,其核心就是一堆Slot组成的调用链. 这里大概的介绍下每种Slot的功能职责:N ...

  9. Sentinel 原理:调用链

    我们已经知道了sentinel实现限流降级的原理,其核心就是一堆Slot组成的调用链. 这里大概的介绍下每种Slot的功能职责: NodeSelectorSlot 负责收集资源的路径,并将这些资源的调 ...

最新文章

  1. bos开发时,测试卡在登录界面解决
  2. linux raid更换硬盘,linux系统raid1更换故障硬盘处理过程
  3. 我的世界java版移除猪灵了吗_我的世界:激怒僵尸猪灵有奖励,用菌光体堆肥,修复126个漏洞!...
  4. 【OSChina-MoPaaS应用开发大赛】豪美创新后台业务管理系统
  5. 最简单红米手机如何没root激活XPOSED框架
  6. python程序设计实验配置_20181235 实验三《Python程序设计》实验报告
  7. Java终结符_从零开始写个编译器吧 - TerminalSymbol.java 与 NonTerminalSymbol.java
  8. 二叉树的基本操作(C)
  9. chown、chgrp 更改文件属主属组
  10. 养老院管理系统如何开发详解
  11. 软件项目开发计划编制过程
  12. 论文篇-----高速公路交通流数据质量控制及评价方法
  13. 高度坍塌的产生条件和解决方法
  14. [RK3288][Android6.0] 调试笔记 --- WiFi芯片AP6356S添加
  15. 广域网接口规范(v.35)
  16. 从面向对象设计思想出发理解Spring AOP编程
  17. 封装 多态 类的约束 super
  18. 【Shiro】7、Shiro实现控制用户并发登录并踢人下线
  19. 大专毕业只能进厂吗?
  20. WM6下实现照相机自动拍照

热门文章

  1. html中显示变量的数组,javascript如何判断变量是不是数组?
  2. RxSwift之深入解析dispose源码的实现原理
  3. 【数据结构与算法】之面试必考的“二分算法”系统梳理
  4. 1640. Check Array Formation Through Concatenation 能否连接形成数组
  5. ImportError: No module named ‘pip._internal’
  6. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1105:数组逆序重存放
  7. 【Linux】一步一步学Linux——pmap命令(145)
  8. 【SDL】SDL简介
  9. python mysql数据库操作grid控件_Python学习笔记_02:使用Tkinter连接MySQL数据库实现登陆注册功能...
  10. python全栈开发要学些什么_如何迅速学习Python 全栈开发?