Linux 获取并分析程序崩溃时的调用堆栈

news/2024/11/20 4:25:21/

http://blog.csdn.net/zsf8701/article/details/8812508

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

[cpp]  view plain copy
  1. #include<stdio.h>  
  2. #include<string.h>  
  3. #include<stdlib.h>  
  4. #include <signal.h>  
  5.   
  6. static void WidebrightSegvHandler(int signum)  
  7. {  
  8.     void *array[10];  
  9.     size_t size;  
  10.     char **strings;  
  11.     size_t i, j;  
  12.   
  13.     signal(signum, SIG_DFL); /* 还原默认的信号处理handler */  
  14.   
  15.     size = backtrace (array, 10);  
  16.     strings = (char **)backtrace_symbols (array, size);  
  17.   
  18.     fprintf(stderr, "widebright received SIGSEGV! Stack trace:\n");  
  19.     for (i = 0; i < size; i++) {  
  20.         fprintf(stderr, "%d %s \n",i,strings[i]);  
  21.     }  
  22.       
  23.     free (strings);  
  24.     exit(1);  
  25. }  
  26.   
  27. int invalide_pointer_error(char * p)  
  28. {  
  29.     *p = 'd'//让这里出现一个访问非法指针的错误  
  30.     return 0;  
  31. }  
  32.   
  33. void error_2(char * p)  
  34. {  
  35.     invalide_pointer_error(p);  
  36. }  
  37.   
  38. void error_1(char * p)  
  39. {  
  40.      error_2(p);  
  41. }  
  42.   
  43. void error_0(char * p)  
  44. {  
  45.      error_1(p);  
  46. }  
  47.   
  48. int main()   
  49. {  
  50.     //设置 信好的处理函数  
  51.     signal(SIGSEGV, WidebrightSegvHandler); // SIGSEGV    11       Core Invalid memory reference  
  52.     signal(SIGABRT, WidebrightSegvHandler); // SIGABRT     6       Core Abort signal from  
  53.       
  54.     char *a = NULL;  
  55.     error_0(a);  
  56.     exit(0);  
  57. }  

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

[cpp]  view plain copy
  1. widebright received SIGSEGV! Stack trace:  
  2. 0 ./a.out [0x8048580]   
  3. 1 [0xb7fb3400]   
  4. 2 ./a.out [0x8048636]   
  5. 3 ./a.out [0x8048649]   
  6. 4 ./a.out [0x804865c]   
  7. 5 ./a.out [0x80486a9]   
  8. 6 /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe5) [0xb7e52775]   
  9. 7 ./a.out [0x80484c1]  

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

  1. 使用GDB调试工具定位和调试错误。
    info line *0x8048580 打印地址0x8048580处的相关信息。
    list *0x8048580 获取地址0x8048580相关的上下文代码信息。
    然后便可以确定行号,进行gdb调试了。
  2. 使用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文件来查看函数的地址和函数名的对应关系了。
  3. 使用 Addr2line 将函数地址解析为函数名。
    Addr2line 工具(它是标准的 GNU Binutils 中的一部分)是一个可以将指令的地址和可执行映像转换成文件名、函数名和源代码行数的工具。这种功能对于将跟踪地址转换成更有意义的内容来说简直是太棒了。
    注意编译程序时需要添加-g选项才可以,也可以添加-Wl 和-map选项。
    在调用 Addr2line 工具时,要使用 -e 选项来指定可执行映像是 test。通过使用 -f 选项,可以告诉工具输出函数名。
    例如:addr2line 0x08048258 -e test -f

http://www.ppmy.cn/news/650999.html

相关文章

ios 架构资料

景总的博客http://blog.csdn.net/justinjing0612 &#xff08;目前任职于天猫国际移动开发CTO&#xff0c;曾就职于平安科技项目经理&#xff0c;对IM和APP性能优化有深刻间接 NSHipster http://nshipster.cn/ Limboy http://feeds.feedbur…

嵌入式Linux使用Busybox init进程启动过程分析

转自&#xff1a; http://blog.csdn.net/shanzhizi/article/details/39082495 一、Busybox Busybo是一个遵循GPLv2协议的开源项目。 Busybox将众多的Linux命令集合进一个很小的可执行程序中&#xff0c;可以用来替换GNU fileutils shellutils等工具集。Busybox中各种命令与相应…

猿题库 iOS 客户端架构设计

转载自&#xff1a; 蓝晨钰的博客 序 猿题库是一个拥有数千万用户的创业公司&#xff0c;从2013年题库项目起步到2015年&#xff0c;团队保持了极高的生产效率&#xff0c;使我们的产品完成了五个大版本和数十个小版本的高速迭代。在如此快速的开发过程中&#xff0c;如何保证…

智能mp5 android系统,新Android智能MP5 蓝晨BM790改版上市

新Android智能MP5 蓝晨BM790改版上市 2011年03月02日 05:01作者&#xff1a;厂商投稿编辑&#xff1a;范源媛文章出处&#xff1a;泡泡网原创 分享 泡泡网MP3频道3月2日 当平板电脑袭卷全球&#xff0c;Android智能平台成为目前MID平板应用系统的第一大派系。蓝晨数码在2011年度…

大像素全景,如何让自己的VR全景变得具有高级感?

一个成功的VR全景作品&#xff0c;如果想要在商业领域上获得一定影响力&#xff0c;那么VR全景本身的质量就是关键&#xff0c;如何让自己的VR全景变得具有高级感呢&#xff1f; 从艺术表达手法上&#xff0c;航拍是对VR全景很好的诠释&#xff0c;通过VR全景航拍&#xff0c;人…

Axure教程—上传文件

本文介绍用Axure制作文件上传效果 预览 预览地址&#xff1a;https://6q4of2.axshare.com 功能 1、点击”文件上传“按钮&#xff0c;显示上传的文件 2、点击”删除“图片&#xff0c;显示提示”是否要删除“&#xff0c;点击”是“&#xff0c;删除数据&#xff0c;点击”否…

当产品进化遇见亿元福利,华帝携手人民日报为消费复苏添了一把火

这个五一黄金周&#xff0c;消费复苏的热火彻底被点燃。统计数据显示&#xff0c;2023年“五一”假期累计超过2.74亿人次出游&#xff0c;消费市场恢复到2019年同期水平。久违的“人间烟火气”再度回归。 除了旅游市场的火爆&#xff0c;同样助燃消费市场的还有全民“厨房焕新…

区块链生态发展

文章目录 前言以太坊的到来什么是图灵完备&#xff1f;什么是智能合约&#xff1f; 以太坊的应用去中心化应用 DApp代币发行 公有链&联盟链区块链应用总结 前言 前面的区块链文章有介绍区块链的诞生以及底层运行原理&#xff0c; 本文主要介绍一下区块链应用的发展&#x…