4

我要解决的问题是,我想动态计算给定指令地址(来自 GDB 内)的指令长度,并将set该长度作为变量的值。挑战在于我不希望将任何无关的输出打印到控制台(例如反汇编指令等)。

我通常的做法是做x/2i ADDR,然后减去两个地址。我想自动完成同样的事情;但是,我不希望将任何内容打印到控制台。如果我可以禁用控制台输出,那么我可以通过执行来执行此操作x/2i ADDR,然后执行$_ - ADDR.

我还没有找到在 GDB 中禁用命令输出的方法。如果您知道这种方法,请告诉我!但是,我发现了interpreter-execGDB/MI。快速测试表明,doingx/2i在 GDB/MI 上有效,并且$_MI 解释器计算的值与控制台解释器共享。不幸的是,这种方法也会产生大量输出。

有谁知道一种方法来计算指令的长度而不显示任何内容,或者如何禁用 的输出interpreter-exec,从而让我实现我的目标?谢谢你。

4

2 回答 2

5

我将给出一个可以说是更清洁、更可扩展的解决方案,而且并不是更短。它实现$instn_length()为一个新的 GDB 便利功能。

将此保存到instn-length.py

import gdb

def instn_length(addr_expr):
    t = gdb.execute('x/2i ' + addr_expr, to_string=True)
    return long(gdb.parse_and_eval('$_')) - long(gdb.parse_and_eval(addr_expr))

class InstnLength(gdb.Function):
    def __init__(self):
        super(InstnLength, self).__init__('instn_length')

    def invoke(self, addr):
        return instn_length(str(long(addr)))

InstnLength()

然后运行

$ gdb -q -x instn-length.py /bin/true
Reading symbols from /usr/bin/true...Reading symbols from /usr/lib/debug/usr/bin/true.debug...done.
done.
(gdb) start
Temporary breakpoint 1 at 0x4014c0: file true.c, line 59.
Starting program: /usr/bin/true 

Temporary breakpoint 1, main (argc=1, argv=0x7fffffffde28) at true.c:59
59    if (argc == 2)
(gdb) p $instn_length($pc)
$1 = 3
(gdb) disassemble /r $pc, $pc + 4
Dump of assembler code from 0x4014c0 to 0x4014c4:

instn_length()的另一种实现是在 GDB 7.6+中使用gdb.Architecture.disassemble()方法:

def instn_length(addr_expr):
    addr = long(gdb.parse_and_eval(addr_expr))
    arch = gdb.selected_frame().architecture()
    return arch.disassemble(addr)[0]['length']
于 2013-05-07T04:11:40.713 回答
1

我找到了合适的解决方案;但是,更短的解决方案将是首选。此解决方案将日志文件/dev/null设置为 ,如果存在则设置为被覆盖,然后将控制台输出临时重定向到日志文件。

define get-in-length
  set logging file /dev/null
  set logging overwrite on
  set logging redirect on
  set logging on
  x/2i $arg0
  set logging off
  set logging redirect off
  set logging overwrite off
  set $_in_length = ((unsigned long) $_) - ((unsigned long) $arg0)
end

这个解决方案的灵感来自另一个问题的答案:How to get my program name in GDB when writing a "define" script? .

于 2013-05-07T02:48:14.053 回答