あなたのpythonかなりprointer登録することができます:https://sourceware.org/gdb/onlinedocs/gdb/Writing-a-Pretty_002dPrinter.htmlをし、このような何かを得るためにそれを使用します。
(gdb) p *[email protected]
$1 = {10, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
(gdb)
これはpythonのプリティプリンタの例である:
>cat my_printer.py
class projection_printer:
def __init__(self, val):
self.val = val
def to_string(self):
return str(self.val['size'])
import gdb.printing
def build_pretty_printer():
pp = gdb.printing.RegexpCollectionPrettyPrinter("")
pp.add_printer('projection', '^projection$', projection_printer)
return pp
gdb.printing.register_pretty_printer(gdb.current_objfile(), build_pretty_printer())
これはテストプログラムです:
>cat main.cpp
#include <stdlib.h>
typedef struct angle
{
int a;
} angle_t;
typedef struct projection {
angle_t angle;
int size;
} projection_t;
int main()
{
projection_t *projections;
projections = (projection_t *)malloc(sizeof(projection_t)*10);
projections[0].size = 10;
projections[0].angle.a = 20;
return 0;
}
これはgdbセッションです:
>gdb -q -x my_printer.py a.out
Reading symbols from /home/a.out...done.
(gdb) start
Temporary breakpoint 1 at 0x4005ac: file main.cpp, line 18.
Starting program: /home/a.out
Temporary breakpoint 1, main() at main.cpp:18
18 projections = (projection_t *)malloc(sizeof(projection_t)*10);
(gdb) n
19 projections[0].size = 10;
(gdb)
20 projections[0].angle.a = 20;
(gdb)
22 return 0;
(gdb) p *[email protected]
$1 = {10, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
(gdb)
:
私が各突起の大きさを印刷したいときGDBから関数を呼び出すことが可能である:私は私が取得する必要があります値を印刷するには、コードでC関数を書きました-1あなたはpythonやgdbのいくつかの指示を便利ではないと示唆した2つの非常に良い答えを拒否し、代わりにあなたのCコードを修正しましたか? 「簡単に」という定義を明確にして、読者があなたを助けようと時間を無駄にしないようにすべきでした。 –
これらの回答は、私のコメントで強調しているように、問題を解決するための素晴らしい情報をもたらします。間違いなく、Pythonを知っている他のユーザーを助けることができると確信しているので、拒否されたとしても時間の無駄ではありません。 はい、私はCコードにいくつかの命令を追加し、誰にとっても役立つかもしれないので、 'call'関数を使うことをお勧めします。 – denaitre