2016-05-07 16 views
0

私は1つの書き込みスレッドと1つの読み出しスレッドがディスク上のファイルへの同時アクセスを持っている2スレッドのプログラムを書いています。書き込みスレッドは、(1)ディスクから読み取られ、新しいファイルを作成し、これは、それが(2)古いファイルを削除して、新しいファイル(TMP)古いファイル名を変更することができます。新しいファイルは常に古いファイルより大きくなります。読み取りスレッドは、case(1)の間にファイルから読み取ります。新しいファイルが古いファイルよりも小さい場合GDBを使用してマルチスレッドプログラムをデバッグする方法は?

しかし、読み込み中に関数fscanfはNo such file or directoryワンセグ障害エラーを生成しています。私は、スレッドが呼び出している関数を識別しましたが、書き込みスレッドが実行中の文とローカル変数の値を知りたいと思います。関数が大きいので、すべての文を出力するのは現実的ではありません。これをGDBを使ってどのように見つけることができますか?

Program received signal SIGSEGV, Segmentation fault. 
[Switching to Thread 0xb73ffb40 (LWP 12649)] 
__isoc99_fscanf (stream=0x0, format=0x804b5f1 "%d%d%d\n") at isoc99_fscanf.c:30 
30 isoc99_fscanf.c: No such file or directory. 
(gdb) bt 
#0 __isoc99_fscanf (stream=0x0, format=0x804b5f1 "%d%d%d\n") at isoc99_fscanf.c:30 
#1 0x0804ae18 in binary_search_in_disk (k_level=1, key=2) at lib.c:887 
#2 0x0804abbc in search (k_level=1, key=2) at lib.c:802 
#3 0x080490da in get (key=2) at lsm.c:56 
#4 0x08048dc9 in run_get (args=0x804e0c8) at concurrent_main.c:181 
#5 0xb7f71f70 in start_thread (arg=0xb73ffb40) at pthread_create.c:312 
#6 0xb7ea7bee in clone() at ../sysdeps/unix/sysv/linux/i386/clone.S:129 
+0

「そのようなファイルやディレクトリはありません」というメッセージがあなたのプログラムのエラーには関係ありません。あなたのシステムがfscanfのソースコードを持っていないことを意味します。システムライブラリのソースコードはオプションです。どのオペレーティングシステムをお持ちですか? libcのソースコードをダウンロードする方法を教えてください。 (このケースでは、バグを確認するために、ソースコードは必要ありません:NULLポインタと関数fscanfと呼ばれるプログラムをその主要な原因は、存在しないファイルに 'fopen'を呼んでいます。)。 –

+0

こんにちはマーク、fscanfは、segフォールトの前に何度もうまく動作していました。好奇心旺盛なことは、(ちょうどファイルがアクセスされているフォルダ内に存在する場合を見て)私は、ファイルが存在するかどうかをチェックし、その前に、ファイルワンセグ障害の発生した後で、それはそこにあります。だから私は本当に困惑している。 – Pippi

+0

これは、マルチスレッドのプログラムはより困難にするものだ:バグは、スレッドの相対的なタイミングに応じて、ランダムに一見に表示することができます。いずれにしても、 'up'と入力すると' binary_search_in_ disk'関数のスタックフレームに行き、その変数の値を見ます。そのFILE *ポインタがNULLに割り当てられている場所を探します。 –

答えて

2

私は、現時点で実行されているスレッドを書くことどの声明知りたい、とローカル変数は値

は、あなたのスタックトレースを考えると、現在のステートメントは、行887には何でもありますlib.c

次の一連のコマンドを使用すると、ローカル変数の値を見てみましょうします:

(gdb) frame 1 
(gdb) info locals 
関連する問題