我正在尝试在定制的ARM板上调试Android的surfaceflinger守护程序中的段错误。在转储调用堆栈和注册内容(包括程序计数器)之前,进程崩溃。
通常我会使用objdump并搜索程序计数器。问题是调用堆栈的一部分位于共享库中。不使用gdb,如何将程序计数器与源文件中的一行相关联?也就是说,可以在不运行程序的情况下确定共享库指令的地址吗?
答案 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
上打印有用的回溯和其他终止信号(在编译器崩溃时)。
请注意,由于ASLR,在某些&#34;随机&#34;上加载了一个共享库(实际上是mmap(2) - ed)。页。
阅读Drepper的How to Write Shared Libraries论文。