1. 程式人生 > >GDB除錯多程序程式

GDB除錯多程序程式

本文系轉載,首先對原作者表示感謝。

問題描述

對於下圖所示的多程序程式,GDB並未提供直接的支援。例如,使用GDB除錯某個程序,如果該程序fork了子程序,GDB會繼續除錯該程序,子程序會不受干擾地執行下去。如果你事先在子程序程式碼裡設定了斷點,子程序會收到SIGTRAP訊號並終止。那麼該如何除錯子程序呢?
這裡寫圖片描述

解決方法

1.follow-fork-mode

在2.5.60版Linux核心及以後,GDB對使用fork/vfork建立子程序的程式提供了follow-fork-mode選項來支援多程序除錯。
follow-fork-mode的用法為:

set follow-fork
-mode [parent|child]
引數說明:
    parent: fork之後繼續除錯父程序,子程序不受影響。
    child: fork之後除錯子程序,父程序不受影響。

因此如果需要除錯子程序,在啟動gdb後:

(gdb) set follow-fork-mode

並在子程序程式碼設定斷點。
此外還有detach-on-fork引數,指示GDB在fork之後是否斷開(detach)某個程序的除錯,或者都交由GDB控制:

set detach-on-fork [on|off]
引數說明
    on: 斷開除錯follow-fork-mode指定的程序。
    off: gdb將控制父程序和子程序。follow-fork-mode指定的程序將被除錯,另一個程序置於暫停(suspended)狀態。

注意,最好使用GDB 6.6或以上版本,如果你使用的是GDB6.4,就只有follow-fork-mode模式。
follow-fork-mode/detach-on-fork的使用還是比較簡單的,但由於其系統核心/gdb版本限制,我們只能在符合要求的系統上才能使用。而且,由於follow-fork-mode的除錯必然是從父程序開始的,對於fork多次,以至於出現孫程序或曾孫程序的系統,例如上圖3程序系統,除錯起來並不方便。

2.attach子程序

在使用ps命令檢視要除錯的程序ID之後,可用GDB的attach命令連將GDB連線到該程序。但是 子程序一直在執行,attach上去後都不知道執行到哪裡了。
一個辦法是,在要除錯的子程序初始程式碼中,比如main函式開始處,加入一段特殊程式碼,使子程序在某個條件成立時便迴圈睡眠等待,attach到程序後在該程式碼段後設上斷點,再把成立的條件取消,使程式碼可以繼續執行下去。
至於這段程式碼所採用的條件,看你的偏好了。比如我們可以檢查一個指定的環境變數的值,或者檢查一個特定的檔案存不存在。
Attach程序方法還是很方便的,它能夠應付各種各樣複雜的程序系統,比如孫子/曾孫程序,比如守護程序(daemon process),唯一需要的就是加入一小段程式碼。

3.GDB wrapper

很多時候,父程序 fork 出子程序,子程序會緊接著呼叫 exec族函式來執行新的程式碼。對於這種情況,我們也可以使用gdb wrapper 方法。它的優點是不用新增額外程式碼。
其基本原理是以gdb呼叫待執行程式碼作為一個新的整體來被exec函式執行,使得待執行程式碼始終處於gdb的控制中,這樣我們自然能夠除錯該子程序程式碼。
其餘部分見原文連結。

相關推薦

GDB除錯程序程式

本文系轉載,首先對原作者表示感謝。 問題描述 對於下圖所示的多程序程式,GDB並未提供直接的支援。例如,使用GDB除錯某個程序,如果該程序fork了子程序,GDB會繼續除錯該程序,子程序會不受干擾地執行下去。如果你事先在子程序程式碼裡設定了斷點,子程序會

gdb 除錯程序執行緒的小栗子

gdb除錯中多執行緒是一個難點,涉及到諸多執行緒的相互影響。對於多執行緒之間的相互影響,這個不在這個小栗子的闡述範圍內。這是除錯一個簡單的子程序中的子執行緒的小栗子。 使用材料 /*這是一個演示gdb除錯子程序、子執行緒的檔案 */ #include <stdio.h>

gdb除錯程序執行緒命令

原文地址:http://blog.csdn.net/pbymw8iwm/article/details/7876797 1. 預設設定下,在除錯多程序程式時GDB只會除錯主程序。但是GDB(>V7.0)支援多程序的分別以及同時除錯,換句話說,GDB可以同時除錯多個程式

gdb除錯程序執行緒

一,gdb的基礎知識 1>介紹: gdb是Linux環境下的程式碼除錯工具。 2>使用:需要在原始碼生成的時候加上 -g 選項. 3>開始使用: gdb binFile 4>退出:ctrl + d 或 quit 5>除錯過

使用gdb除錯執行緒程序程式

GDB的基本介紹 GDB是GUN開源組織釋出的一個強大的UNIX下的程式除錯工具。或許,平時大家更加習慣圖形介面的除錯,比如VS上的IDE除錯;但是如果我們在UNIX或Linux下做軟體,我們呢就更加需要熟練GDB這個除錯工具。 一般來說,GDB主要能夠完成以下的幾個功能: ①啟動你的程式,可以按照你自己

linux gdb 除錯執行緒 程序 顯示巨集

                一、gdb除錯多執行緒gdb)info thread 檢視當前程序的執行緒。 gdb)thread <ID> 切換除錯的執行緒為指定ID的執行緒。 gdb)break file.c:100 thread all  在file.c檔案第100行處為所有經過這裡的執行緒

【Linux】GDB除錯執行緒和程序以及Core檔案

GDB偵錯程式 基本概念 GDB是GNU開源組織釋出的一個強大的UNIX下的程式除錯工具。或許,各位比較喜歡那種圖形介面方式的,像VC、BCB等IDE的除錯,但如果你是在UNIX平臺下做軟體,你會發現

Linux下使用gdb除錯C/C++程式

在筆者工作實踐中,使用gdb除錯C++程式和除錯C程式,他們稍有不同,下面是使用總結。 一、編譯選項 -g         生成除錯資訊 -gstabs+   以stabs格式生成除錯資訊,並且包含僅供gdb使用的額外除錯資訊生成除

Ubuntu下GDB除錯C語言程式

轉自:http://zhgeaits.me/other/2013/03/17/gdb-study-notes.html,感謝博主。 1.GDB是什麼 GDB是GNU開源組織釋出的一個UNIX下的程式除錯工具,專門用來除錯C,C++這些程式的了,而且都是命令列模式的。 2.準備工作 平

gdb除錯執行緒出現的死鎖

   多執行緒的條件下,程式很容易出現死鎖,此時各個執行緒處於等待狀態,可以通過gdb除錯找到死鎖出現的地方。 例子: #include <stdio.h> #include <pthread.h> #include <uni

gdb 除錯執行緒

如果目標程序已經core dump了,那麼 gdb -c core xxx   xxx是對應的程式檔案。 如果目標程序還在執行,通常此時用於除錯執行緒死鎖的情況。有兩種方法 一是 gdb -p xxx  xxx是該程序的程序ID 或者用gcore xxx先獲取對應

gdb除錯命令及程式崩潰時的核心轉存core dump

1.gcc -g filename.c -o filename 需要生成帶除錯資訊的檔案 2.除錯   方式一:gdb filename 除錯file可執行檔案   方式二:>>gdb              >>file filename $gd

Linux工程式設計(六)---編寫程序程式及其程式碼

實驗目的    通過編寫多程序程式,熟練掌握fork()、exec()、wait()和waitpid()等函式的使用,進一步理解在Linux中多程序程式設計的步驟。 實驗內容    該實驗有3個程序,其中一個為父程序,其餘兩個是該父程序建立的子程序,其中一個子程序執行“ls

Linux下gdb除錯執行緒

gdb除錯多執行緒,目前我知道的就以下幾條指令,當然編譯的時候需要加-g選項。 info threads 顯示所有執行緒,系統會給每個執行緒都分配一個編號,編號前帶“*”的,是當前正在除錯的執行緒

使用gdb除錯android原生程式

        Android NDK目錄下的gdb雖然可以除錯android程式,但是這個不包含符號資訊,除錯時需要設定Android系統動態連結庫的符號載入路徑,並且只能除錯擁有除錯資訊的原生程式,而一般情況下,使用 Android NDK編譯的原生程式都不包含除錯資訊

linux下gdb除錯執行緒死迴圈

1、我們首先要知道是哪個執行緒出了問題:     A、查程序  ps -ef | grep 程序名         B、查執行緒  top -H -p 程序ID 2、gdb檢視  gdb 程序名  程序號 :     A、檢視是哪個執行緒出了問題 (gdb) inf

Linux gdb除錯執行緒

一、多執行緒除錯 多執行緒除錯可能是問得最多的。其實,重要就是下面幾個命令: info thread 檢視當前程序的執行緒。 thread <ID> 切換除錯的執行緒為指定ID的執行緒。 break file.c:100 thread all  在file.c檔案第100行處為所有經過這

程序版本TCP聊天程式服務端

  我們上次寫了利用TCP協議來實現的簡單的網路聊天程式,我們實現的是一對一的聊天, 但是如果我們通過上次的程式來實現多對一呢?     我們可以看出來其中一個客戶端可以和服務端正常交流,但是另一個客戶端是連結不上服務端的,即

Ceilometer: 16、cotyledon程序除錯

文章轉自:  https://blog.csdn.net/mengalong/article/details/81125585   Newton版本以前,Ceilometer程式碼除錯方法: ceilometer在Newton版本以前,polling-agent使

if __name__ == '__main__':在一個程序python程式中的必要性

import multiprocessing, time def test(i): while 1: print(i) time.sleep(.2) # if __name__ == '__main__': --- 去掉則會報錯 multiproc