为 CMake 提供什么选项来分解堆栈帧输出?

为 CMake 提供什么选项来分解堆栈帧输出?

打印堆栈帧这个方法用来。但它主要打印可执行文件名称和地址。

0   ./fish(+0xa307b) [0x556c9198c07b]
1   ./fish(+0xb0cf2) [0x556c91999cf2]
2   ./fish(+0xb218a) [0x556c9199b18a]
3   ./fish(+0x151c2) [0x556c918fe1c2]
4   /lib/x86_64-linux-gnu/libc.so.6(+0x29d90) [0x7fb0f2973d90]
5   __libc_start_main + 128
6   ./fish(+0x16ff5) [0x556c918ffff5]

项目本身使用CMake,生成 with-DCMAKE_BUILD_TYPE=Debug没有帮助。
我需要向 CMake 提供什么选项才能获得更清晰的输出?

答案1

程序需要有所有符号。GCC说链接器的选项是:

-rdynamic
在支持它的目标上将标志 -export-dynamic 传递给 ELF 链接器。这指示链接器将所有符号(而不仅仅是使用过的符号)添加到动态符号表中。 “dlopen”的某些用途需要此选项或允许从程序内获取回溯

问题已解决使用CMAKE_ENABLE_EXPORTS多变的。在 CMakeLists.txt 中执行cmake -DCMAKE_ENABLE_EXPORTS=ON ..或提供set(CMAKE_ENABLE_EXPORTS ON)可以解决该问题。

0   reader_data_t::is_repaint_needed(std::vector<highlight_spec_t, std::allocator<highlight_spec_t> > const*) const + 59
1   reader_data_t::readline[abi:cxx11](int) + 498
2   reader_read(parser_t&, int, io_chain_t const&) + 730
3   main + 6706
4   /lib/x86_64-linux-gnu/libc.so.6(+0x29d90) [0x7f6f22628d90]
5   __libc_start_main + 128
6   _start + 37

相关内容