给定程序计数器,在共享库中查找源代码行

时间:2018-03-07 11:02:55

标签: c++ shared-libraries objdump

我正在尝试在定制的ARM板上调试Android的surfaceflinger守护程序中的段错误。在转储调用堆栈和注册内容(包括程序计数器)之前,进程崩溃。

通常我会使用objdump并搜索程序计数器。问题是调用堆栈的一部分位于共享库中。不使用gdb,如何将程序计数器与源文件中的一行相关联?也就是说,可以在不运行程序的情况下确定共享库指令的地址吗?

2 个答案:

答案 0 :(得分:2)

最简单的解决方案是将核心转储加载到gdb并使用info symbol <program counter address>,请参阅https://stackoverflow.com/a/7648883/72178

您也可以使用addr2line,但您必须在addr2line的参数中提供图书馆起始地址,请参阅How to map function address to function in *.so files

答案 1 :(得分:1)

您需要使用调试信息(DWARF格式)编译您的程序(以及所有相关的共享库),例如:通过在-g编译器构建时将-g2(或-g3-O2)标志传递给GCC编译器。请注意,使用GCC,这样的调试选项可以与cc1plus

等优化选项混合使用

然后您可以使用addr2line之类的实用程序,或者像libbacktrace这样的库。 FWIW,GCC编译器本身(实际上是它的libbacktrace)使用SIGSEGV库在gdb上打印有用的回溯和其他终止信号(在编译器崩溃时)。

顺便说一句,你可以(并且可能应该)启用core(5)转储并使用{{1}}对其进行事后分析

请注意,由于ASLR,在某些&#34;随机&#34;上加载了一个共享库(实际上是mmap(2) - ed)。页。

阅读Drepper的How to Write Shared Libraries论文。