如何从应用程序崩溃日志中查找共享库中的函数

时间:2011-12-10 23:23:06

标签: linux crash shared-libraries

以下是应用程序崩溃后内核日志输出的一部分:

kernel: [  252.772000] testsnd/972: potentially unexpected fatal signal 11.
...
kernel: [  252.788000] PC is at 0x296313a4
...
kernel: [  252.820000] mmap = 0x00400000->testsnd 0x29558000->ld-2.10.1.so 0x29580000->libpthread-2.10.1.so 0x295a8000->libdl-2.10.1.so 0x295bc000->librt-2.10.1.so 0x295d4000->libc-2.10.1.so

应用程序已在libc中崩溃。 如何使用此信息获取出现崩溃的函数名称(0x295d4000->libc-2.10.1.so和PC位于0x296313a4)?

3 个答案:

答案 0 :(得分:1)

您可以使用objdump找到.so中每个函数的偏移量。我通常只使用-S开关,因为它会在你拥有它时显示源代码,并且也会进行基本的反汇编。

objdump -SR /lib/i386-linux-gnu/libc-2.13.so

如果您知道库加载的基本地址,则可以计算实际位置。

答案 1 :(得分:1)

在最高地址加载的资料库为libc-2.10.1.so 0x295d4000

perl -e 'printf "0x%x\n", 0x296313a4 - 0x295d4000'
0x5d3a4

addr2line -fe /lib/libc.so.6 0x5d3a4

...应该打印函数名称(如果安装了libc debuginfo包,则打印文件/行信息)。您可能需要将/lib/libc.so.6替换为系统上64位libc.so.6的实际位置。

答案 2 :(得分:0)

感谢您的帮助。 我相信答案可以帮助其他程序员。 但在我的情况下,问题似乎更具特定于平台(sh4 ST-Linux)。 因此,问题应在ST网站或bugzilla上提出。