簡體   English   中英

使用gdb調試正在運行的守護程序

[英]Debugging a running daemon using gdb

我正在開發作為守護程序運行的高流量網絡C服務器應用程序。 在某些情況下,應用程序崩潰(總是沒有內核)。 如何使用gdb調試正在運行的守護程序,以找到生成SIGSEGV的位置?

解釋性說明:

  1. 我知道如何使用Attach命令將gdb附加到正在運行的進程

  2. 附加到該進程后,它將停止。 如果我運行然后“繼續”,則在程序不崩潰的情況下,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

如果要捕獲應用程序中的分段錯誤,則必須從調試器運行該應用程序。 然后,當捕獲到信號時,您可以使用wherebt查看應用程序的堆棧跟蹤。 當然,您在出現故障后無法繼續應用程序,應如何恢復? 如果希望很快觸發故障,則可以附加到正在運行的進程,然后再次在調試器中等待故障。

如果您希望在故障發生后進行堆棧跟蹤,那么您確實需要一個核心文件,因為將沒有附加過程。 現在,如果守護程序是作為系統的一部分啟動的,則可能很難獲得轉儲核心的配置,而且您可能不希望其他應用程序到處都留下核心轉儲。 因此,我建議您停止系統守護程序,然后在您的用戶空間中再次啟動它,然后可以允許其轉儲核心。 如果確實需要將其作為系統的一部分啟動,則請查看守護程序的啟動是否僅限於單個子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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM