5

我正在尝试gdb在死后模式下使用崩溃进程的核心转储。我可以获得堆栈跟踪,但不是向我显示违规函数中的实际位置,而是向我gdb显示违规函数调用的两行内联函数的行号。

内联函数被称为很多很多地方;我如何找到哪个调用触发了崩溃?如何立即找到内联函数周围的代码?

4

3 回答 3

4

转到有问题的堆栈帧,打印指令点(例如 p $rip),然后使用它手动查找它,例如“addr2line -e -i 0x84564756”。

这不能扩展,但至少它有效。

于 2009-12-18T04:42:02.393 回答
2

我假设“对内联函数的许多调用”都发生在一个“违规函数”中(否则你的问题对我来说没有意义)。

最好的办法是记下崩溃点的 IP 地址GDB,然后在输出中使用"objdump -dS ./a.out"并找到该 IP。

于 2009-02-23T05:16:48.727 回答
-1

您可以尝试将 OPTIMIZE 设置为 NO(例如 setenv OPTIMIZE NO)并重建项目:这告诉编译器不要优化代码,因此它可能不会内联函数调用。

于 2009-02-18T19:09:09.170 回答