[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
(本頁面已被瀏覽過 293 次)