2010-01-12 130 views
7

我試圖調試我用gdb編寫的服務器,因爲它在非常特殊和罕見的條件下發生了段錯誤。 (通過安靜模式或批處理模式?),跟隨孩子(因爲我的服務器是一個守護進程並從主PID分離),並自動轉儲核心和回溯(到一個指定的文件)一旦程序崩潰?如何在後臺對守護進程運行gdb?

+0

http:// stackoverflow。com/questions/17965/generate-a-core-dump-in-linux關於生成核心轉儲的SO帖子 – 2010-01-12 17:14:07

+0

@HassanSyed:http://vmlinux.org/jocke/mirror/www.objsw.com/docs/gdb_22.html是一個死鏈接。 – bgoodr 2015-12-19 20:21:15

回答

6

爲什麼不只是運行過程交互在持久屏幕會話?調試時爲什麼它必須是守護進程?或者在屏幕會話中運行gdb,並在分支後將其附加到正在運行的進程(例如gdb/path/to/binary -p PID_of_binary)。

+0

這實際上是一個好主意,不知道爲什麼我沒有想到這一點:P感謝基礎解決方案! – 2010-01-13 03:09:37

+0

+1用於tmux而不是屏幕 – lkraav 2011-01-13 16:24:35

1

我不是一個真正的gdb的專家,但兩件事情浮現在腦海

  1. Tracepoints作爲程序運行它可能給你必要的信息或
  2. 使用gdb的remote debugging facility調試程序,而它的運行作爲守護進程。
3

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

ulimit -c unlimited 

一旦你擁有了核心轉儲,您可以使用gdb來檢查堆棧跟蹤:

gdb /path/to/app /path/to/core/file 
+2

請注意,擁有核心文件與在調試器下停止相同的進程不是一回事。核心文件不保留有關打開文件描述符或內存映射狀態的信息。所以這並不總是一個有用的建議。 – 2010-01-12 19:22:11

+1

你不能調用程序中定義的函數。 – 2010-01-12 19:36:10

7

假設你有適當的權限,你可以讓gdb連接到任何進程。與附加命令的gdb內

gdb /path/to/binary _pid_ 

或:你可以做它的命令行

attach _pid_ 

所以,一旦你的後臺程序已經啓動,您可以使用這些技術來連接到守護進程運行的最終PID。連接gdb會停止正在跟蹤的進程,因此您需要發出「繼續」來重新啓動它。

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

  1. 創建並註冊SIGSEGV的信號處理程序。
  2. 告訴gdb不要停在該信號上(handle SIGSEGV nostop
  3. 在信號處理程序的第一行設置一個斷點。
  4. 分配commands to the breakpoint從第3步
1

你可能想看看桑巴如何促進調試;它有一個可配置的"panic action",可以掛起應用程序,通知開發者,產卵gdb等,並作爲其信號處理程序的一部分運行。請參閱Samba源樹中的lib/util/fault.c

相關問題