0

それで、私は最近多くのアセンブリ作業を行っており、x/d $eax、x/d $ecx、x/t ... などと入力し続けるのは面倒だと感じました。.gdbinit を次のように編集しました。

define showall
printf "Value:\n"
print $arg0
printf "Hex:\n"
x/x $arg0
printf "Decimal:\n"
x/d $arg0
print "Character:\n"
x/c $arg0
... and so on.

私が遭遇した問題は、x/d または他の形式の印刷が失敗したときに、スクリプトが停止し、他の形式を表示するための残りのステートメントを実行しないことでした (実行できる場合)。

問題の例:

gdb someFile
showall $eax
...
:Value can't be converted to an integer.
*stops and doesn't continue to display x/c*

形式を表示できない場合でも、スクリプトに続行するように指示する方法はありますか?

4

1 に答える 1

2

GDB コマンド ファイルの解釈が最初のエラーで停止しないようにする方法はないと思いますが、Python スクリプトを使用して必要なことを行うことができます。

これをinspect-all-formats.pyに保存します。

def examine_all(v):
    gdb.write('Value:\n%s\n' % v)
    try:
        v0 = int(v)
    except ValueError:
        pass
    else:
        gdb.write('Hex:\n0x%x\n'
                  'Decimal:\n%d\n'
                  % (v0, v0))
    try:
        c = chr(v)
    except ValueError:
        pass
    else:
        gdb.write('Character:\n'
                  '%r\n' % (c,))

class ExamineAll(gdb.Command):
    def __init__(self):
        super(ExamineAll, self).__init__('examine-all', gdb.COMMAND_DATA, gdb.COMPLETE_SYMBOL)

    def invoke(self, args, from_tty):
        for i in gdb.string_to_argv(args):
            examine_all(gdb.parse_and_eval(i))

ExamineAll()

次に実行します。

$ gdb -q -x examine-all-formats.py
(gdb) file /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 


(gdb) examine-all argc
Value:
1
Hex:
0x1
Decimal:
1
Character:
'\x01'
(gdb) examine-all $eax
Value:
1532708112
Hex:
0x5b5b4510
Decimal:
1532708112
于 2013-05-04T02:17:44.943 に答える