我正在尝试gdb
在死后模式下使用崩溃进程的核心转储。我可以获得堆栈跟踪,但不是向我显示违规函数中的实际位置,而是向我gdb
显示违规函数调用的两行内联函数的行号。
内联函数被称为很多很多地方;我如何找到哪个调用触发了崩溃?如何立即找到内联函数周围的代码?
转到有问题的堆栈帧,打印指令点(例如 p $rip),然后使用它手动查找它,例如“addr2line -e -i 0x84564756”。
这不能扩展,但至少它有效。
我假设“对内联函数的许多调用”都发生在一个“违规函数”中(否则你的问题对我来说没有意义)。
最好的办法是记下崩溃点的 IP 地址GDB
,然后在输出中使用"objdump -dS ./a.out"
并找到该 IP。
您可以尝试将 OPTIMIZE 设置为 NO(例如 setenv OPTIMIZE NO)并重建项目:这告诉编译器不要优化代码,因此它可能不会内联函数调用。