分享

怎样调试确定Segmentation fault的程序位置

 昵称28625772 2018-07-17
EsrCreate时遇到段错误导致程序崩溃
signal(SIGSEGV, signal_handler);
void sig_function(int sig)
{
void *array[100];
size_t size;
char **strframe ;
size_t i;
if(sig == SIGSEGV)
{
EDEBUG(0, "get illegal instruction or segmation fault: %d\n", sig);
size = backtrace (array, 100);
EDEBUG(0, "backtrace() returned %d addresses\n", size);
strframe= backtrace_symbols (array, size);
if(strframe==NULL)
{
perror("backtrace_symbols");
        exit(EXIT_FAILURE);
}
for(i = 0; i < size; i++)
{
    EDEBUG(0, "frame [%02d] -- %s\n", i, strframe[i]);
}
}
free(strframe);
signal(sig, SIG_DFL);
    raise(sig);

}
通过以上程序代码打印程序运行轨迹和崩溃地址
将源代码目录的c文件编译生产.o文件
powerpc-none-linux-gnuspe-c++ -g --rdynamic -c main.cpp
使用一下命令连接生成带debug信息的可执行文件
powerpc-none-linux-gnuspe-c++ -o demo  m_pthread.o main.o aitalk.o -lpthread -lstdc++ -ldl  ./Aitalk/Lib/Aitalk5.a  ./gbuni/gbuni.a 
使用以下命令反汇编生产汇编文件
powerpc-none-linux-gnuspe-objdump  -S -D -t demo  >test.txt
然后根据以下程序语音打印地址在汇编文件中查找程序崩溃位置和函数进行调试
=========>>>catch signal 11 <<<=========
Dump stack start...
backtrace() returned 11 addresses
  [00] ./demo [0x10002b88]
  [01] ./demo [0x10002e60]
  [02] [0x100344]
  [03] ./demo [0x100d3a08]
  [04] ./demo [0x1000c960]
  [05] ./demo [0x10006658]
  [06] ./demo [0x100049fc]
  [07] ./demo [0x10004d2c]
  [08] ./demo [0x10002a90]
  [09] /lib/libc.so.6 [0xfbbfd18]
  [10] /lib/libc.so.6 [0xfbbfe34]
Dump stack end...
Segmentation fault
[user@P10xxCPB home]$ 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多