4

私が解決しようとしている問題は、(GDB 内から) アドレスを指定して命令の長さを動的に計算し、setその長さを変数の値として計算したいということです。問題は、余分な出力をコンソールに出力したくないということです (例: 逆アセンブルされた指示など)。

これに対する私の通常のアプローチは、 を実行してからx/2i ADDR、2 つのアドレスを減算することです。同じことを自動的に達成したいと思います。ただし、コンソールに何も出力したくありません。コンソール出力を無効にできる場合は、 を実行してx/2i ADDRから$_ - ADDR.

GDB でコマンドの出力を無効にする方法が見つかりませんでした。そんな方法知ってる方いたら教えてください!interpreter-execただし、 GDB/MIを発見しました。簡単なテストでは、実行x/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 に答える