3

如果我通过 GDB Python API 知道全局符号的名称,有没有办法在我的二进制文件中获取全局符号的地址?

python print(gdb.parse_and_eval('symbol').address)获得这个值的正确方法是什么?

4

2 回答 2

1

好吧,您已经正确回答了自己。很容易验证:

(gdb) p &t
$2 = (time_t *) 0x562076476018 <t>
(gdb) python print(gdb.parse_and_eval('t').address)
0x562076476018 <t>
(gdb)
于 2019-09-12T19:34:40.220 回答
0

接受的答案并不完全正确。它仅在当前范围内没有同名的本地符号时才有效。

举个例子:

int foo = 0;

int main(int argc, char **argv) {
    int foo = 0;
    return 0;
}

如果你 break at main()gdb.parse_and_eval("foo")将找到局部变量foo而不是全局符号。

您可以使用 获取全局符号gdb.lookup_global_symbol("foo")

import gdb

gdb.execute("break main")
gdb.execute("run")

print("Global symbol:")
print(gdb.lookup_global_symbol("foo").value().address)

print("Local symbol:")
print(gdb.parse_and_eval("foo").address)

结果:

Breakpoint 1 at 0x1124: file symbol-tests.c, line 6.

Breakpoint 1, main (argc=1, argv=0x7fffffffdb68) at symbol-tests.c:6
6       int foo = 0;
Global symbol:
0x55555555802c <foo>
Local symbol:
0x7fffffffda6c
于 2022-01-27T09:35:11.790 回答