[英]Debugging a running daemon using gdb
我正在開發作為守護程序運行的高流量網絡C服務器應用程序。 在某些情況下,應用程序崩潰(總是沒有內核)。 如何使用gdb調試正在運行的守護程序,以找到生成SIGSEGV的位置?
解釋性說明:
我知道如何使用Attach命令將gdb附加到正在運行的進程
附加到該進程后,它將停止。 如果我運行然后“繼續”,則在程序不崩潰的情況下,gdb仍會被阻止。 如果按CTRL-C,則該進程將退出,並且我無法簡單地分離gdb。
所以問題是:有沒有一種方法可以繼續執行該過程,而不會阻塞gdb,但是如果該進程不崩潰,則能夠分離該gdb?
嘗試使用異步模式,然后選擇“ 繼續& ”:
將以下內容保存到non-stop.gdb
set target-async on
set pagination off
set non-stop on
然后運行:
$ gdb -x non-top.gdb
(gdb) !pgrep YOUR-DAEMON
1234
(gdb) attach 1234
(gdb) continue -a &
(gdb)
此頁面上的attach / detach表示detach
命令將在gdb
。
如果要捕獲應用程序中的分段錯誤,則必須從調試器運行該應用程序。 然后,當捕獲到信號時,您可以使用where
或bt
查看應用程序的堆棧跟蹤。 當然,您在出現故障后無法繼續應用程序,應如何恢復? 如果希望很快觸發故障,則可以附加到正在運行的進程,然后再次在調試器中等待故障。
如果您希望在故障發生后進行堆棧跟蹤,那么您確實需要一個核心文件,因為將沒有附加過程。 現在,如果守護程序是作為系統的一部分啟動的,則可能很難獲得轉儲核心的配置,而且您可能不希望其他應用程序到處都留下核心轉儲。 因此,我建議您停止系統守護程序,然后在您的用戶空間中再次啟動它,然后可以允許其轉儲核心。 如果確實需要將其作為系統的一部分啟動,則請查看守護程序的啟動是否僅限於單個子shell,並在該子shell中使用ulimit -c
設置適當的最大大小,以用於核心轉儲。
調試應用程序的另一種方法是使用核心文件進行GDB調試。
要在發生分段時生成核心文件,可以按照以下步驟操作:
1)將以下參數復制到運行守護程序的腳本中。
ulimit -c unlimited
mkdir -p <path_to_core_file>, eg : /etc/user/ankit/corefiles
chmod 777 /etc/user/ankit/corefiles
echo "/etc/user/ankit/corefiles/%e.%s.core" > /proc/sys/kernel/core_pattern
2)使用腳本運行您的應用程序,然后等待核心轉儲文件被創建。 一旦獲得核心轉儲,就可以按照以下提到的步驟使用gdb進行調試。
3)使用GDB獲取回溯
gdb -c <core_file>, where core_file is the file generated after segmentation fault
4)回溯
接下來,我們想知道程序崩潰時堆棧是什么。 在gdb提示符下運行bt將給您回溯。 如果gdb尚未為二進制文件加載符號,則它將與該“ ??????”類似地引發帶有問號的錯誤。 要解決此問題,您將必須加載符號。
這是加載調試符號的方法。
symbol-file /path/to/binary
sharedlibrary
5)獲取所有線程的backTrace
thread apply all bt full
注意:確保二進制文件是用調試符號編譯的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.