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

Linux 如何从应用程序崩溃日志中查找共享库中的函数,linux,crash,shared-libraries,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->libpth

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

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
)?

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

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

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

在最高地址加载的库是
libc-2.10.1。因此
0x295d4000
处加载的库是
libc-2.10.1

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

addr2line -fe /lib/libc.so.6 0x5d3a4
。。。应打印函数名(以及文件/行信息,如果已安装libc debuginfo包)。您可能需要将
/libc/libc.so.6
替换为系统上64位
libc.so.6
的实际位置。

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

“如果您知道基本地址…”这正是内核消息提供的内容。地址>代码> 0x29 6313A4//COD>显然映射到 LBC-2.101. S/<代码>,它加载在中。这是完美的,我以前使用ObjDIP-X和-D,但是-SR要好得多,甚至在调试时也显示了C++代码。Andy在libc.so.6上使用
nm-D
将告诉您函数(在本例中,地址0x5d3a4在一个内)。即使没有调试信息,这也是可以确定的;虽然要更准确地说明PC的位置,您确实需要调试信息。