簡體   English   中英

如何在后台對守護進程運行 gdb?

[英]How to run gdb against a daemon in the background?

我正在嘗試調試我用 gdb 編寫的服務器,因為它在非常特定和罕見的條件下會出現段錯誤。

有什么方法可以讓 gdb 在后台運行(通過安靜或批處理模式?),跟隨子進程(因為我的服務器是一個守護進程並與主 PID 分離)並自動轉儲核心和回溯(到指定文件) 一旦程序崩潰?

假設您具有適當的權限,則可以將gdb附加到任何進程。 您可以在命令行上執行以下操作:

gdb /path/to/binary _pid_

或者使用attach命令從gdb中:

attach _pid_

因此,一旦您的守護程序啟動,您可以使用這些技術之一附加到您的守護程序運行的最終PID。 附加gdb會停止正在跟蹤的進程,因此您需要發出“continue”以重新啟動它。

我不知道在程序崩潰時讓gdb運行任意命令的直接方法。 這是我能想到的一個解決方法:

  1. 為SIGSEGV創建並注冊信號處理程序。
  2. 告訴gdb不要停止該信號( handle SIGSEGV nostop
  3. 在信號處理程序的第一行設置斷點。
  4. 從步驟3 為斷點分配命令

為什么不在持久性屏幕會話中以交互方式運行該過程? 調試時為什么必須是守護進程? 或者只是在屏幕會話中運行gdb並將其附加到正在運行的進程(例如gdb / path / to / binary -p PID_of_binary)之后。

首先,我設置你的shell /環境給你一個核心轉儲。 在bash中:

ulimit -c unlimited

獲得核心轉儲后,可以使用gdb檢查堆棧跟蹤:

gdb /path/to/app /path/to/core/file

當我的gcc C ++應用程序崩潰回答這個問題時,如何生成堆棧跟蹤應該做你想要的。 (假設您可以對代碼進行更改)

我不是一個真正的gdb專家,但我想到了兩件事

  1. 跟蹤點可能會在程序運行時為您提供必要的信息或
  2. 使用gdb的遠程調試工具在程序作為守護程序運行時調試程序。

您可能想看看Samba如何促進調試; 它有一個可配置的“恐慌動作” ,可以暫停應用程序,通知開發人員,生成gdb等,並作為其信號處理程序的一部分運行。 請參閱Samba源代碼樹中的lib / util / fault.c

我的做法:注釋掉daemon函數調用,重建二進制,然后用gdb運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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