侧边栏壁纸
  • 累计撰写 278 篇文章
  • 累计创建 3 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

【Linux】直接打印堆栈调试信息

xuanxuan
2022-07-15 / 0 评论 / 0 点赞 / 5 阅读 / 1635 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2024-02-14,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

直接打印堆栈调试信息

测试代码如下:

#include <stdio.h>
#include <signal.h>

//信号钩子函数,获取栈信息,然后打印
void handle_segv(int signum){
    void *array[100];
    size_t size;
    char **strings;
    size_t i;

    signal(signum,SIG_DFL);
    size = backtrace(array,100);
    strings = (char**)backtrace_symbols(array,size);

    fprintf(stderr,"Launcher received SIG:%d Stack trace:\n",signum);
    for(i = 0;i <size;i++){
        fprintf(stderr,"%d %s\n",i,strings[i]);
    }
    free(strings);
}
int func(int* p){
    int y = *p;
    return y;
}
int main(void){
    int *p = NULL;
    signal(SIGSEGV,handle_segv);
    signal(SIGABRT,handle_segv);
    return func(p);
}

编译:

gcc -g demo.c -o demo

执行: image-20220715211846530

找到错误代码行号:使用addr2line命令

示例:

addr2line -a 0x4007b6 -e demo

image-20220715224432993

回到我们的源文件,对应的位置。

image-20220715224503773


输入最后第一个地址会显示??:0暂时还未解决,还请知道的小伙伴评论区解答下。

image-20220715224845208

0

评论区