如何調試 semop 失敗?

如何調試 semop 失敗?

使用Linux執行2.6.30-gentoo-r4非常複雜的程式碼系統(使用 4.4.9-pl0-gentoo 和 5.2.10-pl0-gentoo),偶爾會遇到信號量阻塞問題。對函數php的呼叫被阻止,最終導致系統崩潰。phpsem_acquire

然而,這個有問題的信號量似乎沒有被另一個php進程阻止,這促使我進一步調查。我能夠識別php有問題的進程及其strace,導致阻塞信號量:

....
09:03:25 gettimeofday({1415696605, 778078}, NULL) = 0
09:03:25 close(5)                       = 0
09:03:25 gettimeofday({1415696605, 778483}, NULL) = 0
09:03:25 gettimeofday({1415696605, 778708}, NULL) = 0
09:03:25 semop(0, 0xbf8f1692, 1 <unfinished ...>

這個特定的輸出semop(0, 0xbf8f1692, 1)對我來說沒有太大幫助,因為我看不到struct sembuf(的第二個參數semop)的內容。也許其他人直接看到這個呼叫有問題semop

無論如何,我繼續調查以檢查地址處的內存0xbf8f1692(作為根):

> gdb --pid 1236   
GNU gdb 6.8
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i586-pc-linux-gnu".
Attaching to process 1236
ptrace: Operation not permitted.
(gdb) dump memory /root/output 0xbf8f1692 0xbf9f1692 
(gdb) quit
> hexdump -C output 
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00100000

這是否意味著semop呼叫時會struct sembuf指向一堆零?或者我做錯了什麼來找出內存以查看參數是什麼semop?是否有不同的方法可以查看該semop通話中發生的情況?

附加資訊:

  • Linux 系統既不知道指令prctl也不知道ptrace.
  • 名為的目錄/proc/sys/kernel/yama不存在(請參閱建議訊息)。

相關內容