2016-07-07 13 views
1

gdbでデバッグしようとしています。文字列に出力する場合は、 "x/s Ptr"を使用する必要があります。それはしばらくの間うまく動作します。しかし、何度も、ヌル値、つまりいくつかの乱数値が得られています。私のファイルには10000行のコードがあります。 : - p gdbの出力を見つけてください。例えば、gdbでデバッグする - (gdb) "x/s pointer"出力

krb5_get_credentials_for_user (context=0x59c00eb0, options=4, ccache=0x5a001d40, in_creds=0x5ab022a8, subject_cert=0x0, 
out_creds=0x5ab02378) at test_abc.c:696 
(gdb) x/s 0x59c00eb0 
0x59c00eb0: "$\247\016\227" 
(gdb) x/s 0x5ab022a8 
0x5ab022a8: "" 

誰かがこの問題をどのように解決できるか教えてください。前もって感謝します!

答えて

0

...細かいこともあります。しかし、何度かヌル値、つまり "" または何らかの乱数が表示されています...

ありました。あなたが創造的であるように励ますことができます。

デバッグ対象のプログラムで使用されていない関数(foo?bar?show?dump?)を作成することがあります。この関数はしばしばCスタイルです(gdbはそれをよりよく理解しているように見えるため、呼び出すのは簡単です)。この機能を一時的にインストールすると、同じファイルに閉じることができます。可視性を向上させたい場合は、時には役立ちます。

私はfooにパラメータを渡すことが可能であるが、私は何かをデバッグするためのコードに触れていた場合、私は通常のfooを作るように

gdb> p foo 

として、GDBのpコマンドを使用して、この機能を呼び出すことができますより能力があります...パラメータがない場合は、1つのことを行います。あるいは多かれ少なかれ表示するように切り替えるintパラメータ(bar(7))を使用してください。

実験。

これは典型的なことではありません。次回に必要なときに覚えていれば、gdbの知識があれば価値があると思われます。場合によってはgdbが理解できないことがあります。理由を理解できません。他の時には、ポインタを追加して印刷しようとしています。

gdb> p *foobar 
+0

ありがとうダグラス。それは正常に働いた。私はあなたの助けと時間を感謝します。 – Rock26

2

しかし、何度もヌル値、またはいくつかのランダムな数値が表示されています。

表示内容に間違いはありません。調べているメモリの場所が文字列(0x59c00eb0)を指していないか、空の文字列(0x5ab022a8)を指しているだけです。

これらの場所が文字列を指している必要があるという証拠は提示されていませんでした。実際には、contextstruct _krb5_contextを指している(今削除された)コメントが最初のメンバーとして魔法の番号を含んでいます。したがって、それを調べるにはx/wを使用する必要があります。

関連する問題