2016-05-16 8 views
0

私は現在、いくつかのファイルを持つプログラムをデバッグしています:arr.hはリストクラスのヘッダファイルです(ランダムに生成されます)。 Howard.cppは実装ファイルで、main.cppはlistクラスのオブジェクトに関数を呼び出すmain関数を置く場所です。 list.hが含まれています。私は自分の関数の1つ(Howard.cpp内で実装されている)に対してsegフォルトを取得しています。私はGDBに入った。 segフォルトが発生すると、segフォールトに至る関数呼び出しを取得するための "where"または "list"を入力することがわかります。この場合、segフォルトが発生した関数(フレーム0)に到達すると、変数とその値がその関数に含まれているかどうかを確認する必要があります。しかし、私がその特定の関数に入るか、 "info locals"と入力すると、 "No symbol table info available"というメッセージが表示されます。私はこれが真実ではないことを知っていますが、失敗した行を見る方法を理解できません。さらに、その関数/ファイルに関する行情報は表示されません。私は、実行可能ファイルではないファイル内の関数にエラーがあることと関係があると思います。しかし、私はこれについて何ができますか?この質問がまったく混乱している場合は、私に明確に説明してください。私はこれですべてかなり新しいです。GDBで複数のリンクされたファイルを使ったデバッグ

これは私のクラスの教授が作成し、リンクリストと再帰を実践するためのLinux端末環境にあります。

[OK]を、私はここに例を含めるつもりです:

私はそれを再帰的にコピー逆にリンクリストの配列の機能を持っています。再帰関数はtable :: reverse_table(ノード* &、ノード*、ノード*)と呼ばれます。私は停止点に問題がないことを知っているところまでデバッグしました。ときにプログラムセグメンテーション違反、私は「どこ」と入力しますと、それが出力されます:私が入力したときに

#0 0x0000000000400e6e in table::reverse_table(node*&, node*, node*)() 
#1 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#2 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#3 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#4 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#5 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#6 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#7 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#8 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#9 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#10 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#11 0x0000000000400df1 in table::reverse_table(node*&, node*, node*)() 
#12 0x0000000000400f87 in table::reverse_table(table&, int, int)() 
#13 0x0000000000400fe7 in table::reverse_table(table&)() 
#14 0x0000000000401087 in main() 

はその後、「フレーム0を、」それが表示されます。

#0 0x0000000000400e6e in table::reverse_table(node*&, node*, node*)() 

私は「情報を入力すると「地方」を選択すると、「シンボルテーブルの情報がありません」と表示されます。私はsegfaultがどこで機能したかについての情報を得ることができません。 GDBはその情報を持っていないようです。デバッグ中にそれを含めるために必要なことはありますか?

+0

SSCCE(http://sscce.org/)を追加すると、より明確になります。 –

+0

は、デバッグ中に見たgdbメッセージを追加しました。うまくいけばそれは十分な情報です。コードを投稿したいとは思っていません。なぜなら、自分の問題を解決しようとしているだけであるとは思わないからです。自分の問題を自分でデバッグする方法を見つけようとしています。 – hhoward

答えて

2

コンパイル中にデバッグフラグ(-g)が有効になっていることを期待します。 プロセスが終了し、使用可能なシンボルテーブル情報がないため、このメッセージが表示されています。プログラムをgdbで実行しようとすると、segフォルトが発生します。 bt(バックトレース)コマンドを使用して、セグメンテーション・フォルトを引き起こす最後の機能をチェックします。その関数のエントリポイントでブレークポイントを使用して、プログラムを再度実行します。次のコマンドまたはinfoコマンドでlocalsの値を調べてください。

+0

私はこれをやってきました。プログラムが終了していなくてもmain以外の関数のシンボルテーブル情報は表示されません。これは単にデバッグする必要がある関数を呼び出すだけです。 – hhoward

+0

これは恥ずかしいですが、コンパイル時に-gを追加すると完全に修正されました。私はそれが教授に含まれていると思った。 – hhoward

関連する問題