2016-07-14 26 views
0

試圖調試我的程序不會返回到bash提示符,我用strace並給它PID。該程序是一個二進制文件,我沒有源代碼。根據strace,有一個-1 EBADF (Bad file descriptor)。但是,我不知道哪個文件是有問題的。strace報告錯誤的文件描述符

正如你可以看到strace出口的下方,因此運行lsof -p <PID>沒有得到結果。

read(5, "80\0\0\0\00078", 8)   = 8 
read(5, "prf-exit\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 80) = 80 
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0 
fstat(1, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0 
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2af316b0f000 
write(1, "\n", 1)      = 1 
read(5, "\0\0\0\0", 4)     = 4 
write(5, "\0\0\0\0", 4)     = 4 
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 9 
setsockopt(9, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0 
setsockopt(9, SOL_TCP, TCP_NODELAY, [1], 4) = 0 
setsockopt(9, SOL_SOCKET, SO_SNDBUF, [65536], 4) = 0 
setsockopt(9, SOL_SOCKET, SO_RCVBUF, [65536], 4) = 0 
fcntl(9, F_GETFL)      = 0x2 (flags O_RDWR) 
fcntl(9, F_SETFL, O_RDWR)    = 0 
connect(9, {sa_family=AF_INET, sin_port=htons(45323), sin_addr=inet_addr("10.10.10.251")}, 16) = 0 
write(9, "12345\0", 6)     = 6 
write(9, "15 NORMAL_EXITING\0", 19) = 19 
read(9, "\0", 1)      = 1 
close(9)        = 0 
futex(0x2af31686d9d0, FUTEX_WAIT, 29590, NULL) = 0 
futex(0x2af31666c9d0, FUTEX_WAIT, 29589, NULL) = 0 
close(6)        = 0 
close(7)        = 0 
read(5, "\0\0\0\0", 4)     = 4 
write(5, "\0\0\0\0", 4)     = 4 
read(5, "\0\0\0\0", 4)     = 4 
write(5, "\0\0\0\0", 4)     = 4 
close(5)        = 0 
close(5)        = -1 EBADF (Bad file descriptor) 
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 5 
connect(5, {sa_family=AF_INET, sin_port=htons(49986), sin_addr=inet_addr("172.20.54.10")}, 16) = 0 
setsockopt(5, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0 
setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0 
write(5, "\35\0\0\0\0\0\0\0\1\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 64) = 64 
close(5)        = 0 
close(4)        = 0 
exit_group(0)       = ? 
Process 29588 detached 
[[email protected] ~]# lsof -p 29588 
[[email protected] ~]# 

如何搜索丟失/錯誤的文件?

+1

這不一定是一個錯誤。如果你想確定FD是否已關閉,那麼沒有理由確保它首先打開 - 你可以嘗試關閉它並忽略EBADF。 –

+0

...如果你在啓動一個子進程時使用了Python的close_fds標誌,例如它會通過FD編號3-255來運行並試圖關閉它們,不管它們是否打開。 –

+0

順便說一下,可以考慮使用sysdig而不是strace--除此之外,您可以要求它轉儲一個進程的FD表(任何進程 - 它是全系統監視)*,因爲它過去存在於任何點時間*。 –

回答

4

你關閉同一文件描述符兩次:

close(5)        = 0 
close(5)        = -1 EBADF (Bad file descriptor) 
3

EBADF當文件描述符號沒有被映射到一個文件發生。因此,根據定義,沒有問題的文件。


坦率地說,這不是一個錯誤,當然也不是你正在尋找的錯誤。即使您不確定它們是否開始開放,也嘗試關閉FD是完全常見的行爲 - 與嘗試檢查文件描述符是否仍然通過其他方式打開並僅關閉它相比,這樣做效率更高有條件的。

+0

* FD 5之前被映射到連接到'10.10.10.251'的套接字。*您是如何得出結論的? –

+0

由於誤讀,坦率地說 - 仔細觀察一下是FD 9。撤回它。 –

1

關閉文件描述符不止一次是一個非常糟糕的主意,如果你的程序是多線程的,因爲你關閉它在第一次之後,另一個線程可以調用open(),並給予相同的文件描述符(但指的是不同的文件);在你的線程中第二次調用close的時候會關閉另一個線程的文件。總是使用類似的東西:

close(x); x = -1;

確保您不會無意中關閉重用的描述符。

相關問題