![](/img/trans.png)
[英]How do I view the list of functions a Linux shared library is exporting?
[英]How do I get a list of shared library base addresses from a core dump in GDB when I don't have the shared library available?
我有一个来自另一台机器的核心转储,但我没有在崩溃进程中加载的所有共享库。 我无法登录到机器或重现安装 state。我绝对无法在本地重现该错误。
触发这个核心转储的崩溃是在我本地目前没有的一个共享库中,但我不知道是哪个。
bt
没有给我任何关于哪个共享库与地址相关联的提示。 这是 output 的片段:
(gdb) bt
#0 0x00007f4356396c21 in ?? ()
#1 0x00007f4356365009 in ?? ()
有人可能认为info shared
可以解决问题,但这似乎只显示了 gcc 能够在本地找到的共享库的地址范围。
(gdb) info shared
From To Syms Read Shared Object Library
0x00007f43ac42a0c0 0x00007f43ac4b3766 Yes (*) /usr/lib/x86_64-linux-gnu/libX11.so.6
No /usr/lib/x86_64-linux-gnu/libGL.so.1
也许我的崩溃是在 libGL.so.1 中,但我怎么知道,因为我没有可使用的地址范围? 也许它在进程中的其他 50 个共享库之一中。 有没有一种合理的方法可以让我发现崩溃地址的来源,大概是通过列出所有共享库地址范围? 如果我知道这来自哪个库,我可能能够获取原始文件,或者在 .map 文件中挖掘以手动重现我的调用堆栈。
有没有一种合理的方法可以让我发现崩溃地址的来源,大概是通过列出所有共享库地址范围?
假设您在另一台机器上有一个相当新的 kernel(大约 2015 年或更新),运行readelf -n core
应该会产生包含所有相关信息的NT_FILE
注释。
这是/bin/sleep 60 & X=$;; sleep 1; kill -ABRT $X
的样子/bin/sleep 60 & X=$;; sleep 1; kill -ABRT $X
/bin/sleep 60 & X=$;; sleep 1; kill -ABRT $X
:
$ readelf -n core
Displaying notes found at file offset 0x00000580 with length 0x00001450:
Owner Data size Description
CORE 0x00000150 NT_PRSTATUS (prstatus structure)
CORE 0x00000088 NT_PRPSINFO (prpsinfo structure)
CORE 0x00000080 NT_SIGINFO (siginfo_t data)
CORE 0x00000150 NT_AUXV (auxiliary vector)
CORE 0x00000399 NT_FILE (mapped files)
Page size: 4096
Start End Page Offset
0x0000563775c50000 0x0000563775c52000 0x0000000000000000
/usr/bin/sleep
0x0000563775c52000 0x0000563775c57000 0x0000000000000002
/usr/bin/sleep
0x0000563775c57000 0x0000563775c59000 0x0000000000000007
/usr/bin/sleep
0x0000563775c59000 0x0000563775c5a000 0x0000000000000009
/usr/bin/sleep
0x0000563775c5a000 0x0000563775c5b000 0x000000000000000a
/usr/bin/sleep
0x00007f8228800000 0x00007f8228ae9000 0x0000000000000000
/usr/lib/locale/locale-archive
0x00007f8228c00000 0x00007f8228c28000 0x0000000000000000
/usr/lib/x86_64-linux-gnu/libc.so.6
0x00007f8228c28000 0x00007f8228d98000 0x0000000000000028
/usr/lib/x86_64-linux-gnu/libc.so.6
0x00007f8228d98000 0x00007f8228df0000 0x0000000000000198
/usr/lib/x86_64-linux-gnu/libc.so.6
0x00007f8228df0000 0x00007f8228df4000 0x00000000000001f0
/usr/lib/x86_64-linux-gnu/libc.so.6
0x00007f8228df4000 0x00007f8228df6000 0x00000000000001f4
/usr/lib/x86_64-linux-gnu/libc.so.6
0x00007f8228f97000 0x00007f8228f99000 0x0000000000000000
/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
0x00007f8228f99000 0x00007f8228fbf000 0x0000000000000002
/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
0x00007f8228fbf000 0x00007f8228fca000 0x0000000000000028
/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
0x00007f8228fca000 0x00007f8228fcc000 0x0000000000000033
/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
0x00007f8228fcc000 0x00007f8228fce000 0x0000000000000035
/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
CORE 0x00000200 NT_FPREGSET (floating point registers)
...
您还可以使用eu-unstrip
(相关答案):
eu-unstrip -n --core core
0x563775c50000+0xb000 1984a78956c92ad376412aabc85955f20d444fe5@0x563775c50368 . - /usr/bin/sleep
0x7ffde4b8e000+0x1000 2959b90435d422fde8e4f977259e42d551499b04@0x7ffde4b8e554 . - linux-vdso.so.1
0x7f8228f97000+0x362b8 a897a1105e21dd270bd418fe58c441700a6d8ec5@0x7f8228f97248 /lib64/ld-linux-x86-64.so.2 /usr/lib/debug/.build-id/a8/97a1105e21dd270bd418fe58c441700a6d8ec5.debug ld-linux-x86-64.so.2
0x7f8228c00000+0x202f90 532d686f61d5422a2617967cbfbecfd4bd6a39c7@0x7f8228c00380 /lib/x86_64-linux-gnu/libc.so.6 /usr/lib/debug/.build-id/53/2d686f61d5422a2617967cbfbecfd4bd6a39c7.debug libc.so.6
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.