gdb将计算的原始结果传递给自定义python函数

2024-06-24 11:53:08 发布

您现在位置:Python中文网/ 问答频道 /正文

amd64,寄存器$rdi是指向"/home/il/gammu-git/src/gammu/libgammu/tls/x86_64/libpthread.so.0"的指针

这里有一个例子:

define foo
py print gdb.execute("output $arg0", to_string=True).strip('"')
end

期望:

^{pr2}$

但是,output命令也会打印字符串的地址:

(gdb) foo (char*)$rdi
0x7fffffffe180 "/home/il/gammu-git/src/gammu/libgammu/tls/x86_64/libpthread.so.0

Tags: gitsrchomeoutputfootls寄存器x86
2条回答

你可以用python来解决这个问题

py print gdb.execute("output $arg0", to_string=True).strip('"').split()[1]

或者(这是我更喜欢的)可能通过定制您的output调用。gdb通过输入help output并遵循其中的线索提供全面的在线帮助:

^{pr2}$

顺便说一句:应该在前面提到这一点,但是:由于某些原因,地址打印可能被设置为on。所以:

set print addr off

可能会解决你的问题。在

gdb语法一团糟,比MS-DOS的命令行还糟糕。在

通过6个“简单”步骤,您可以将任意字符串传递给python:

define foo
    # reset convenience var., or get 'Too many array elements'
    set $foo_arg0 = 0
    # $arg0 expanded too early, can't use it directly in python
    set $foo_arg0 = $arg0
    #
    # parse_and_eval() affected by print settings, wtf?
    #
    # don't print address of a string
    set print addr off
    # print long string
    set print elements 0
    # get rid of '<repeats n times>'
    set print repeats unlimited
    #
    # parse_and_eval() returns quoted string. Unquote with eval
    py s = eval(str(gdb.parse_and_eval("$foo_arg0")))
    py print s
end

(gdb) foo "abc"
abc
(gdb) foo $val
def
(gdb) foo (char*)$rdi
/home/il/gammu-git/src/gammu/libgammu/tls/x86_64/libpthread.so.0

相关问题 更多 >