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

C++ 给定程序计数器,在共享库中查找源行,c++,shared-libraries,objdump,C++,Shared Libraries,Objdump,我正试图在定制的ARM板上调试Android的surfaceflinger守护进程中的segfault。进程在转储调用堆栈和寄存器内容(包括程序计数器)之前崩溃 通常我会使用objdump并搜索程序计数器。问题是调用堆栈的一部分位于共享库中。如果不使用gdb,如何将程序计数器与源文件中的一行关联?也就是说,可以在不运行程序的情况下确定共享库指令的地址吗?您需要使用调试信息(格式)编译程序(以及所有相关的共享库),例如,在编译程序时,将一些-g(或-g2或-g3)标志传递给编译器。注意,对于GCC

我正试图在定制的ARM板上调试Android的surfaceflinger守护进程中的segfault。进程在转储调用堆栈和寄存器内容(包括程序计数器)之前崩溃

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

您需要使用调试信息(格式)编译程序(以及所有相关的共享库),例如,在编译程序时,将一些
-g
(或
-g2
-g3
)标志传递给编译器。注意,对于GCC,这种调试选项可以与优化选项混合使用,如
-O2

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

顺便说一句,您可以(也可能应该)启用转储,并使用
gdb

请注意,由于,共享库是在某个“随机”页面加载的(实际上是-ed)


阅读Drepper的论文。

最简单的解决方案是将堆芯转储加载到gdb中,并使用
info-symbol
,请参阅

您也可以使用
addr2line
,但必须在
addr2line
的参数中提供库起始地址,请参阅