[Linux] strace 沒有列出系統呼叫的回傳值?

[Linux] strace 沒有列出系統呼叫的回傳值?

最近在用 strace 找程式裡關於 file locking 的一些問題,

看到在開檔 open() 與呼叫 fcntl64() 時,常常沒有這些系統呼叫 (system call) 的結果,

這樣怎麼知道這個系統呼叫到底成功還是失敗呢?

 

查了一下,原來 strace 會想要保留系統呼叫的「順序性」,

因此先呼叫了 open() 就先寫出來,但系統呼叫是跑到 kernel 去執行的,

等它執行完得到結果後,才會再寫一個像是 <… open resumed> 這樣的訊息。

 

如下例,前兩行的 open 與 fcntl64 都沒辦法立刻看到結果,

但從接下來的 <… fcntl64 resumed> 可以知道 fcntl64() 的結果是 0,

而從 <… open resumed> 可以知道 open() 的結果是 8:

[pid 54729] open("/tmp/test.log", O_WRONLY|O_CREAT|O_APPEND|O_LARGEFILE, 0600
[pid 54733] fcntl64(15, F_SETFD, 0
[pid 54732] open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC
[pid 54733] <... fcntl64 resumed> )     = 0
[pid 54729] <... open resumed> )        = 8

 

不過上面的例子還算好找,

有時候這個 <… resumed> 可能會和一開始的系統呼叫隔了幾十行,

那時就得有點耐心,去搜尋同一個 pid (thread) 囉~

 

參考資料:General Commands Manual: strace

(本頁面已被瀏覽過 289 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料