2014-01-20 7 views
5

で構造アレイの変数の値は、Cにおける構造体の定義は、この構造のプリントここGDB

typedef struct projection { 
    angle_t angle; 
    int size; 
    element_t *element; 
} projection_t; 

projection_t *projections; 
projections = (projection_t *)malloc(sizeof(projection_t)*m); 

アレイが定義され、値は各突起の変数に代入されます。 GDBを使って、私は各投影のサイズの値を表示しようとしています。値を1つずつ印刷するのは大変な作業です。

配列の内容はprint *[email protected]で表示できますが、@オペランドで投影のサイズの値に簡単にアクセスできるかどうかはわかりません。

+0

void print(projection_t *projections, int size) { int i; for(i=0; i<size; i++) printf("proj_%d: size=%d\n", i, projections[i].size); } 

私が各突起の大きさを印刷したいときGDBから関数を呼び出すことが可能である:私は私が取得する必要があります値を印刷するには、コードでC関数を書きました-1あなたはpythonやgdbのいくつかの指示を便利ではないと示唆した2つの非常に良い答えを拒否し、代わりにあなたのCコードを修正しましたか? 「簡単に」という定義を明確にして、読者があなたを助けようと時間を無駄にしないようにすべきでした。 –

+1

これらの回答は、私のコメントで強調しているように、問題を解決するための素晴らしい情報をもたらします。間違いなく、Pythonを知っている他のユーザーを助けることができると確信しているので、拒否されたとしても時間の無駄ではありません。 はい、私はCコードにいくつかの命令を追加し、誰にとっても役立つかもしれないので、 'call'関数を使うことをお勧めします。 – denaitre

答えて

1

私はGDBを起動するたびにループを書きたくないので、かなりプリンタは私に合わないPythonに依存しています。連続していないメモリ空間から変数の値を出力することは、GDBでは容易に実現できないようです。

私は一番簡単な方法を見つけることになります。

(gdb) call print(projections, len) 
proj_0: size=1027 
proj_1: size=1024 
proj_2: size=1027 
proj_3: size=1030 
6

@オペランドを使用していないが、あなたは、あなたの目標を達成するために、以下を試すことができます:

(gdb)set $i=0 
(gdb) set $end=m 
(gdb) while ($i < $end) 
>p projections[$i++].size 
>end 

または指定したインデックスのサイズを印刷する

p projections[index].size 

を使用します。

+1

[documentation](https://sourceware.org/gdb/onlinedocs/gdb/Arrays.html#Arrays)は、ループのない類似のものを示唆しています。 – Hasturkun

+0

はい、ただしループなしで境界チェックは行われません。つまり、誰かがを押すと、投影配列の指定されたサイズからメモリを検査することになります。 – nikpel7

+0

返事をありがとう。はい、どちらも動作しますが、私の意見では便利ではありません。最初のものはループとそれに関連する変数を記述する必要があり、2番目のものは自分の投稿で「ひとつずつ」という意味です。 – denaitre

9

あなたの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) 
+0

返信ありがとう:)私はそれが動作するように投票し、GDBのドキュメントによってサポートされています。しかし、この解決策は私の場合は単純な解決策ではないPythonに依存しています。 – denaitre

関連する問題