linux应用程序调试----backtrace

摘要:
打印堆栈是一种常见的调试方法。通常,当系统异常时,我们可以在异常情况下打印堆栈,这非常方便查找错误。首先,我们将介绍简单的回溯方法。稍后,我们可以尝试核心文件+gdb方法。是否将-O0-rdynamic-g-funund-tables-ffunction-sectionsCFLAGS添加到回溯打印堆栈模式编译选项?

打印堆栈是调试的常用方法,一般在系统异常时,我们可以将异常情况下的堆栈打印出来,这样十分方便错误查找。

先介绍下比较简单的backtrace方式,后面有机会可以尝试下core文件+gdb的方式。

backtrace打印堆栈方式

编译选项增加  -O0 -rdynamic -g -funwind-tables -ffunction-sections

CFLAGS ?= -mcpu=ck810 -static -mlittle-endian -Werror -O0 -rdynamic -g -funwind-tables -ffunction-sections

ASFLAGS += -O0

代码添加

#include <signal.h>       /* for signal */  
#include <execinfo.h>     /* for backtrace() */  

#define BACKTRACE_SIZE   32  
  
void dump(void)  
{  
    int j, nptrs;  
    void *buffer[BACKTRACE_SIZE];  
    char **strings;  

    printf("backtrace...
");
    
    nptrs = backtrace(buffer, BACKTRACE_SIZE);  
      
    printf("backtrace() returned %d addresses
", nptrs);  
  
    strings = backtrace_symbols(buffer, nptrs);  
    if (strings == NULL) {  
        perror("backtrace_symbols");  
        exit(EXIT_FAILURE);  
    }  
  
    for (j = 0; j < nptrs; j++)  
        printf("  [%02d] %s
", j, strings[j]);  
  
    free(strings);  
}  



void signal_handler(int signo)  
{  
      
#if 0     
    char buff[64] = {0x00};  
          
    sprintf(buff,"cat /proc/%d/maps", getpid());  
          
    system((const char*) buff);  
#endif    
  
    printf("
=========>>>catch signal %d <<<=========
", signo);  
      
    printf("Dump stack start...
");  
    dump();  
    printf("Dump stack end...
");  

    //exit(-1);
    signal(signo, SIG_DFL); /* 恢复信号默认处理 */  
    raise(signo);           /* 重新发送信号 */  

    printf("app exit
");  
}  

int main(void)
{
  signal(SIGABRT, signal_handler);
  signal(SIGBUS, signal_handler); 
  signal(SIGSEGV, signal_handler); 

}

  

执行结果:

=========>>>catch signal 11 <<<=========
Dump stack start...
backtrace...
backtrace() returned 7 addresses
[00] ./app-demo() [0xbf6e]              // 最后一条指令
[01] ./app-demo() [0xc086]              // 倒数第2调指令
[02] [0x2aac6000]
[03] /lib/libc.so.6(memcpy+0x30) [0x2ab516a0]
[04] ./app-demo() [0xbb62]              // 出问题的地方
[05] ./app-demo() [0x9e92]
[06] /lib/libpthread.so.0(+0x61d0) [0x2aacd1d0]
Dump stack end...
app exit
Segmentation fault

文件分析:

在虚拟机上使用GNU工具中的addr2line工具获取源码位置

# addr2line -e app/app-demo 0xbc62 

# /home/cql/smb/fuxi_h/demo-linux-wjc-20201211/app/main.c:538

附录:

         SIGHUP 1 A 终端挂起或者控制进程终止 
         SIGINT 2 A 键盘中断(如break键被按下) 正常终止
         SIGQUIT 3 C 键盘的退出键被按下 
         SIGILL 4 C 非法指令 
        SIGABRT 6 C 由abort(3)发出的退出指令,异常终止 
         SIGIO 23,29,22 A 某I/O操作现在可以进行了(4.2 BSD)
         SIGKILL 9 AEF 杀死进程的终极方法
        SIGSEGV 11 C 无效的内存引用 
        SIGPIPE 13 A 管道破裂: 写一个没有读端口的管道 
         SIGALRM 14 A 由alarm(2)发出的信号 
        SIGTERM 15 A 终止信号 
         SIGUSR1 30,10,16 A 用户自定义信号1 给用户做进程间通信,不像其他的处理方法被绑定了
         SIGUSR2 31,12,17 A 用户自定义信号2 
         SIGCHLD 20,17,18 B 子进程结束信号 
         SIGCONT 19,18,25 进程继续(曾被停止的进程) 
         SIGSTOP 17,19,23 DEF 终止进程 
         SIGTSTP 18,20,24 D 控制终端(tty)上按下停止键 
         SIGTTIN 21,21,26 D 后台进程企图从控制终端读 
         SIGTTOU 22,22,27 D 后台进程企图从控制终端写       

免责声明:文章转载自《linux应用程序调试----backtrace》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python安装 hanlp +使用 坑坑坑。。。填填填。。。Jenkins+pipeline+参数构建+人工干预确定下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux环境下Gitblit服务搭建及秘钥配置

一、安装gitblit服务 1、下载地址https://pan.baidu.com/s/1wQ3TEE_gw5xZvyFPZB9xFg 2、上传至linux服务器并解压缩 tar xvf gitblit-1.8.0.tar.gz 3、修改defaults.properties文件 vim /usr/local/gitblit-1.8.0/data/defa...

用 S5PV210 学习 Linux (一) 刷机(一)

简介: 习惯了 用 keil 或者 IAR  一键下载 (烧写) 代码,S5PV210 貌似就不能这么简单用 仿真器的 方式 下载代码了,因此 学习 S5PV210 的第一步就是 学习怎么下载代码,下面就是学习过程。2017年3月13日13:11:45,SUOZHANG. 1、因为我的 电脑是 win7 64位,官方三星  DNW刷机 软件没有 很好的 支...

CentOS安装

目前,我们安装Linux操作系统的主要目的是为了更好地了解和学习它。如果条件允许,最好把Linux操作系统安装在一台PC机上;如果条件不允许也没有关系,阿铭会教你使用虚拟机来安装Linux操作系统。 大多数读者朋友比较习惯使用Windows操作系统,所以建议你使用虚拟机来学习Linux。阿铭相信,如果在Windows系统里安装一个虚拟机,然后在虚拟机上安装...

linux(1):VMware虚拟软件下安装centos6.8

前言:Linux是一种自由和开放源代码的类UNIX操作系统,继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。本人学习Linux已经有一段时间了,从一开始的小白到现在的略有所悟,深知小白学习的艰辛,因此打算系统把Linux学习的东西整理一下,发布一系列相关博客。该系列博客不定期更新,如有问题欢迎探讨。 所需一系列工具: win7系统...

Linux Shellcode

Linux Shellcode 本篇主要是以x64系统为例对系统调用中一些功能性函数的解读和实际运用。目前网络上流传的通用shellcode,均使用系统调用实现,在记录整个学习过程的同时分享给大家一起学习探讨。 0x01 Shellcode 简介 0x1 shellcode Shellcode 是一段可以执行特定功能的特殊汇编代码,在设备漏洞利用过程...

linux重新安装python

第一步:下载python2.7  wget https://www.Python.org/ftp/python/2.7.12/Python-2.7.12.tar.xz 第二步: 解压刚刚下载的压缩包 #tar -xvf Python-2.7.12.tar.xz 第三步:新建安装目录 mkdir /usr/local/Python27 第四步: 编译./co...