gpt4 book ai didi

c++ - 如何在 addr2line 运行时从偏移量中的 backtrace_symbols() 解析 cpp 符号

转载 作者:太空宇宙 更新时间:2023-11-04 11:53:02 25 4
gpt4 key购买 nike

为了在运行时捕获 fatal error ,例如 Segmentation Fault,我编写了一个自定义 SignalHandler,它将堆栈跟踪打印到控制台并打印到日志文件中。

为了实现这一点,我使用(在我之前有数百人)backtrace()backtrace_symbols() 函数与 addr2line 相结合。

调用 backtrace_symbols() 产生以下输出:

Obtained 8 stack frames.
./Mainboard_Software(+0xb1af5) [0x56184991baf5]
./Mainboard_Software(+0xb1a79) [0x56184991ba79]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x12dd0) [0x7fe72948bdd0]
./Mainboard_Software(causeSIGFPE+0x16) [0x561849918a10]
./Mainboard_Software(_Z13MainboardInit7QString+0xf3) [0x56184990e0df]
./Mainboard_Software(main+0x386) [0x5618499182a3]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xeb) [0x7fe727fd909b]
./Mainboard_Software(_start+0x2a) [0x5618498ff0aa]

我需要将偏移量传递给 addr2line 以获取我的模块名称和行号。

$ addr2line -C -a -s -f -p -e ./D098_Mainboard_Software 0xb1a79
0x00000000000b1a79: HandleBacktraceSignals at SignalModule.c:492

但是,在某些模块(尤其是 cpp 模块)中,我将偏移量作为符号和十六进制的组合,例如 _Z13MainboardInit7QString+0xf3

我可以通过调用 nm 将符号解析为十六进制:

$ nm Mainboard_Software | grep _Z13MainboardInit7QString
00000000000a3fec T _Z13MainboardInit7QString

现在我可以将这两个十六进制数相加,将它们传递给 addr2line 并获取我的模块名称和行号,如果我想的话甚至可以进行 demangled:

$ addr2line -C -a -s -f -p -e ./D098_Mainboard_Software 0xa40df
0x00000000000a40df: MainboardInit(QString) at MainboardInit.cpp:219

但我想在运行时执行最后两个步骤。有没有办法在运行时解析这些符号(例如 _Z13MainboardInit7QString+0xf3),以便我可以将它们直接传递给 addr2line?我的程序由 .c 和 .cpp 模块组成。

最佳答案

您可以使用库 cxxabi 来分解符号运行时:

#include <cxxabi.h>
//...
char *symbolName = "_Z13MainboardInit7QString";
int st;
char* cxx_sname = abi::__cxa_demangle
(
symbolName,
nullptr,
0,
&st
);

返回的 cxx_name 数组包含 demangled 符号。

地址(基址和偏移量)可以通过使用方括号作为开始和结束分隔符的简单解析从初始字符串中恢复。

关于c++ - 如何在 addr2line 运行时从偏移量中的 backtrace_symbols() 解析 cpp 符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55450932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com