2011-03-04 20 views
4

私は、割り込み可能な状態でハングするUbuntu 10.04で動作するGTKプログラムを持っていて、straceの出力を理解したいと思います。特に、私はこのラインを持っている:straceからハングアップするファイルの特定

read(5, 0x2ba9ac4, 4096) = -1 EAGAIN (Resource temporarily unavailable) 

私は5を読み取ることには、このファイル内のアドレスファイルディスクリプタ、0x2ba9ac4あり、かつ4096読むためにデータの量を疑います。あなたは確認できますか?さらに重要なことは、プログラムがどのファイルを読み込もうとしているかをどのように判断できるのでしょうか?このファイル記述子は/proc/pid/fdには存在しません(おそらくプログラムがハングする理由です)。

答えて

8

このファイルディスクリプタを使用するファイルは、strace -o log -eopen,read yourprogramを呼び出して見つけることができます。その後、logファイルで、興味のあるreadへの呼び出しを検索します。 (ファイルの最初の行ではなく)この行から、このファイル記述子の最初のオカレンスを検索します(openへの呼び出しによって返されます)。例えば

ここでは、openによって返されたファイルディスクリプタは3:

open("/etc/ld.so.cache", O_RDONLY)  = 3 
+0

ニース、ありがとう! – Greg

+0

これは '/ etc/passwd'を指しています...正しいと確信できますか?つまり、ファイルディスクリプタが' open'以外の関数によって変更される可能性はありますか?ありがとう – Greg

+2

このファイルディスクリプタが誤った 'read'の上にある最初の' open'であれば、そのファイルはそのファイルです。ファイル記述子は 'close'が呼び出された場合にのみ再利用することができます。確かめたいなら '-eopen、read、close'を使います。ファイル記述子は、対応する 'open'と' close'の間でファイルに一意に関連付けられます。 – liberforce

0

read()の2番目の引数は、単にデスティネーションポインタです。ファイルディスクリプタ5からの読み取りを要求しています。最大4096バイトです。 read()については、the manual pageを参照してください。

+2

はい、私はそれを見つけました。ファイル記述子5に関連付けられたファイルを識別する方法はありますか? – Greg

0

プロセスがすでに

フォームstraceのlsofを使用してファイル名を取得することができます実行されている場合は、その答えを@liberforceする追加lsofを持つ今

[pid 7529] read(102, 0x7fedc64c2fd0, 16) = -1 EAGAIN (Resource temporarily unavailable) 

lsof -p 7529 | grep 102 
java 7529 luis 102u 0000    0,9  0  9178 anon_inode 
関連する問題