编译安装和使用cpptrace

根据网上的例子没法把cpptrace用起来,自己动手完全搞了一遍,记录一下。

1、cpptrace依赖很多,我的环境最核心的就是缺少依赖dwarf。

2、最开始是用的apt install dwarf-dev,结果在编译自己的代码测试代码时还是报错。

#include <cpptrace/cpptrace.hpp>

#include <iostream>
#include <pthread.h>
#include <signal.h>

void signal_handle(int no) {
    if (no == SIGSEGV) {
        auto trace = cpptrace::generate_trace();
        for (auto &frame: trace) {
            std::cout << frame.to_string() << std::endl;
        }
        exit(0);
    }
}

int main() {
    signal(SIGSEGV, signal_handle);

    int *p = nullptr;
    *p = 100;

    return 0;
}

3、使用apt将dwarf-dev卸载,下载dwarf的源码,使用cmake编译安装

4、重新编译安装cpptrace,也是用的cmake

5、重新编译自己的测试代码:g++ -std=c++17 cpptrace_test.cpp -o cpptrace_test -lcpptrace -ldwarf -ldl -lz -lzstd -g,-g必须要加,不然解析不到代码行;跟其他的博客的差异就是这里,必须在编译命令中链接其他库dwarf dl zlib zstd

6、输出结果:

0x00005b0df5919e8b in signal_handle(int) at /opt/test/cpptrace_test.cpp:9:47
0x000078552d44251f at /lib/x86_64-linux-gnu/libc.so.6
0x00005b0df5919fb4 in main at /opt/test/cpptrace_test.cpp:21:8
0x000078552d429d8f in __libc_start_call_main at ./csu/../sysdeps/nptl/libc_start_call_main.h:58:16
0x000078552d429e3f in __libc_start_main_impl at ./csu/../csu/libc-start.c:392:3
0x00005b0df5919d84 in _start at /opt/test/cpptrace_test

 

posted @ 2026-02-27 12:02  太极者  阅读(8)  评论(0)    收藏  举报