将指令指针地址(在共享库中)翻译成源指令
Translate Instruction Pointer Address (in shared library) to Source Instruction
是否可以在 Linux 上使用任何工具或库仅从 PID 和当前指令指针地址获取原始(源)指令,即使 IP 当前指向进入共享库?
据我所知,这应该是可能的,因为库映射的位置可以通过 /proc/[PID]/maps
获得,尽管我还没有找到任何应用程序或示例这样做。
有什么建议吗?
编辑:汇编指令或最接近的符号就足够了(不一定需要源代码行)
我找到了一种使用 GDB 执行此操作的方法:
互动:
$ gdb --pid 1566
(gdb) info symbol 0x7fe28b8a2b79
pselect + 89 in section .text of /lib/x86_64-linux-gnu/libc.so.6
(gdb) info symbol 0x5612550f14a4
copy_word_list + 20 in section .text of /usr/bin/bash
(gdb) info symbol 0x7fe28b878947
execve + 7 in section .text of /lib/x86_64-linux-gnu/libc.so.6
完全符合我的要求!
也可以编写脚本:
gdb -q --pid PID --batch -ex 'info symbol HEX_SYMBOL_ADDR'
是否可以在 Linux 上使用任何工具或库仅从 PID 和当前指令指针地址获取原始(源)指令,即使 IP 当前指向进入共享库?
据我所知,这应该是可能的,因为库映射的位置可以通过 /proc/[PID]/maps
获得,尽管我还没有找到任何应用程序或示例这样做。
有什么建议吗?
编辑:汇编指令或最接近的符号就足够了(不一定需要源代码行)
我找到了一种使用 GDB 执行此操作的方法:
互动:
$ gdb --pid 1566
(gdb) info symbol 0x7fe28b8a2b79
pselect + 89 in section .text of /lib/x86_64-linux-gnu/libc.so.6
(gdb) info symbol 0x5612550f14a4
copy_word_list + 20 in section .text of /usr/bin/bash
(gdb) info symbol 0x7fe28b878947
execve + 7 in section .text of /lib/x86_64-linux-gnu/libc.so.6
完全符合我的要求!
也可以编写脚本:
gdb -q --pid PID --batch -ex 'info symbol HEX_SYMBOL_ADDR'