2011-03-04 56 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'之上,那麼是的,那個文件就是那個。文件描述符只有在調用close時才能被重用。如果你想確定,使用'-eopen,read,close'。文件描述符與相應的'open'和'close'之間的文件唯一關聯。 – liberforce

0

read()的第二個參數只是目標指針,它要求從文件描述符5讀取數據,最大數量爲4096個字節。有關read(),請參閱the manual page

+2

是的,我想通了,有沒有什麼辦法來識別與文件描述符5關聯的文件? – Greg

0

添加到@liberforce回答,如果該進程已經運行,你可以使用lsof的

形式strace的獲取文件名

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

現在,lsof的

lsof -p 7529 | grep 102 
java 7529 luis 102u 0000    0,9  0  9178 anon_inode