我正在尝试使用python扩展来确定给定的帧是否来自给定符号来自的相同二进制文件。具体做法是:
我正在查看Ruby堆栈跟踪,并希望自动判断一个帧是来自ruby / libruby,还是一个不同的二进制文件。对此的主要标准是:框架的pc
是否与符号soname
属于同一个ruby_exec_node
。
这在gdb本身是可行的:
#69 0x00007fe00444e783 in invoke_block (...) at vm.c:921
921 in vm.c
(gdb) info symbol 0x00007fe00444e783
invoke_block.isra + 387 in section .text of /host/ruby-2.3.3
(gdb) info symbol ruby_exec_node
ruby_exec_node in section .text of /host/ruby-2.3.3
您可以看到这两个符号都来自/host/ruby-2.3.3
。
从文档来看,看起来python应该能够通过gdb.solib_name
访问它,但是我无法解决这个问题:
ruby_exec_node = gdb.lookup_global_symbol('ruby_exec_node')
ruby_solib = gdb.solib_name(ruby_exec_node.value().address)
print(ruby_solib)
给了我None
。我怎样才能从符号中获取这些信息?
第二部分是从pc
地址获取相同的信息。我可以执行以下操作来获取地址:
gdb.selected_frame().pc()
但是如何找到与之对应的符号,类似于info symbol ...
?
答案 0 :(得分:0)
解决这两个问题的方法是:
从符号到目标文件(不一定是路径 - objfile
可以比较):
ruby_exec_node = gdb.lookup_global_symbol('ruby_exec_node')
ruby_file = ruby_exec_node.symtab.objfile
查找当前帧objfile
的{{1}}:
current