以下是应用程序崩溃后内核日志输出的一部分:
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
)?
答案 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上提出。