编译安装和使用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

浙公网安备 33010602011771号