3

RHEL 5.3 OS、gdb7.5 およびpython2.7 を使用しています。いくつかの gdb デバッグ手順を自動化するスクリプトを Python で作成しています。次のコマンド ("name1") の出力を変数に格納できますか?

(gdb) p *(ptr->name)
$13 = "name1"

私のPythonスクリプトでは、これ(name1)をユーザー入力文字列と比較し、一致する場合は何らかのアクションを実行し、そうでない場合はユーザーに別の文字列を入力するように求めるため、これを行います。

それが不可能な場合は、代替案を提案してください。

4

2 に答える 2

5

GDB で式の値を取得することがgdb.parse_and_eval()の目的です。私はあなたがこのようなものが欲しいと思います:

name1.c :

#include <string.h>
#include <stdio.h>

/* https://github.com/scottt/debugbreak */
#include <debugbreak/debugbreak.h>

struct T {
    char *name;
};

int main()
{
    struct T t, *p = &t;
    t.name = strdup("name1");
    debug_break();
    printf("%s\n", p->name);
    return 0;
}

入力名.py :

import gdb

gdb.execute('set python print-stack full')
gdb.execute('set confirm off')
gdb.execute('file name1')
gdb.execute('run')

name_in_program = gdb.parse_and_eval('p->name').string()
gdb.write('Please input name: ')
name = raw_input()
while name != name_in_program:
    gdb.write('Please try another name: ')
    name = raw_input()

gdb.execute('quit')

サンプル セッション:

$ gdb -q -x input-name.py

Program received signal SIGTRAP, Trace/breakpoint trap.
main () at name1.c:16
16      printf("%s\n", p->name);
Please input name: nameX
Please try another name: name1

$

debug_break()を介して C コードにトラップ命令を挿入することにより、デバッガーに侵入するショートカットを使用したことに注意してください。おそらく、代わりにブレークポイントを設定したいと思うでしょう。

于 2013-05-22T22:15:23.317 に答える
-1

編集:すみません、表現を間違えました。修正:

gdb のドキュメントを参照してください。

便利な変数を設定するには、次の式を使用できます。
set $yourVar = (gdb) p *(ptr->name)

その後、次のように新しい変数にアクセスできます。
print $yourVar

出力は次のようになります。

(gdb) set $foo = "bar"
(gdb) print $foo
$1 = "bar"
(gdb) 
于 2013-05-22T17:07:41.623 に答える