gdb調試多進程和多線程

一、gdb調試多進程

  1. 多線程代碼

這裏寫圖片描述

2.默認設置下,在調試多進程程序時GDB只會調試主進程。但是GDB(>V7.0)支持多進程的分別以及同時調試,換句話說,GDB可以同時調試多個程序。只需要設置follow-fork-mode(默認值:parent)和detach-on-fork(默認值:on)即可。

  follow-fork-mode 和detach-on-fork   說明

這裏寫圖片描述

<1>,設置方法:

  • set follow-fork-mode[parent|child]
  • set detach-on-fork[on|off]

<2>,顯示:
show follow-fork-mode show detach-on-fork

調試父進程
這裏寫圖片描述

<3>,查詢正在調試的進程: info inferiors
顯示GDB調試的所有inferior,GDB爲他們分配ID。其中帶*的進程是正在調試的進程。
(GDB將每一個被調試程序的執行狀態記錄在一個名爲inferior的結構中。一般情況下一個inferior對應一個進程,每一個inferior都有自己的地址空間。inferior有時候會在進程沒有啓動時就存在)

這裏寫圖片描述

<4>,切換調試的進程: inferior (inferior number)
通過該指令可以切換到ID爲number的inferior進行調試。

爲了能夠在終端長查看兩個進程,我們需要多代碼進行下斷點調試;

  • 利用函數名下斷點,catch;
  • 利用行號下斷點,break 文件名:行號;

這裏寫圖片描述

可以看見有兩個進程
這裏寫圖片描述

再次利用inferior (number)切換回去,運行程序
這裏寫圖片描述

同理,我們也可以調試子進程
設置
這裏寫圖片描述

設置斷點
這裏寫圖片描述

調試子進程
這裏寫圖片描述

<5>,調加新的調試進程: add-inferior[-copies n][-exec executable]
可以用file+executable來分配給inferior可執行文件。+增加n個inferior並執行程序爲executable。如果不指定n只增加一個inferior。如果不指定executable,則執行程序留空,增加後可使用file命令重新指定執行程序。這時候創建的inferior其關聯的進程並沒啓動。

<6>,刪除一個infnum 的inferior: remove-inferiors infnum (如果inferior正在運行,則不能刪除,刪除之間需先kill或detach掉該inferior)

<7>,detach掉infnum的inferior: detach inferior infnum 注意( inferior仍然存在,可以用run等命令執行 )

<8>,kill 掉infnum的inferior: kill inferior infnum 注意(inferior仍然存在,可以用run等命令執行

二、gdb調試多線程

1.當需要調試的程序正在運行時,如下例代碼:
代碼
這裏寫圖片描述
這裏寫圖片描述

  • 方法一,從新開個終端,在gdb命令行上指定進程的PID;
  • 方法二,在gdb中使用attach命令

    兩種方法首先都要得到正在執行進程的id號
    這裏寫圖片描述
    這裏寫圖片描述

方法一:gdb 進程id,即可調試進程
方法二:
這裏寫圖片描述

下面是線程調試的基本方法
這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

2,當需要調試的代碼沒有正在運行,我們只需要設置斷點,根據gdb命令調試即可。
代碼示例:
這裏寫圖片描述
這裏寫圖片描述

調試過程:
這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

3.總結gdb多線程調試的基本命令

<1>.info threads 顯示當前可調試的所有線程,每個線程會有一個GDB爲其分配的ID,後面操作線程的時候會用到這個ID。
前面有*的是當前調試的線程。

<2>.thread ID 切換當前調試的線程爲指定ID的線程。

<3>.break thread_test.c:123 thread all 在所有線程中相應的行上設置斷點

<4>.thread apply ID1 ID2 command 讓一個或者多個線程執行GDB命令command。
thread apply all command 讓所有被調試線程執行GDB命令command。

<5>.set scheduler-locking off|on|step 估計是實際使用過多線程調試的人都可以發現,在使用step或者continue命令調試當前被調試線程的時候,其他線程也是同時執行的,怎麼只讓被調試程序執行呢?通過這個命令就可以實現這個需求。

  • off 不鎖定任何線程,也就是所有線程都執行,這是默認值。
  • on 只有當前被調試程序會執行。
  • step 在單步的時候,除了next過一個函數的情況(熟悉情況的人可能知道,這其實是一個設置斷點然後continue的行爲)以外,只有當前線程會執行。
發佈了109 篇原創文章 · 獲贊 17 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章