gdb pid 執行緒 gdb除錯多程序多執行緒程式

2021-10-17 05:52:39 字數 3952 閱讀 3390

一、除錯的指令

1.list命令

list  linenum  顯示程式第linenum行的周圍的程式

list  function  顯示程式名為function的函式的源程式

list        顯示當前行後面的源程式

list -        顯示當前行前面的源程式

2.run(r):執行命令

run args  run命令可以直接接命令列引數值,也可以在執行run之前通過 set args + 引數值實現

3.break(b):打斷點

b  linenum      在某行打斷點

b +offset/-offset    在當前行的前面或者後面的offset停住

b filename:linenum   在某檔案的某行打斷點

b filename:function 在某檔案某個函式入口處停住

b *address      在程式的執行位址處停住

b           沒有引數在下一行停住

b where if condition 在滿足條件的那一行停住

關閉斷點:delete(d) breakpoint -id

4.單步命令:

step count  一次性執行count步,有函式進入函式

next count  一次性執行count步,不進入函式

finish     執行函式,知道當前函式完成返回,並列印出函式返回時的堆疊位址、返回值和引數資訊

until      退出迴圈體

5.continue命令:

當程式被停住後,可以使用continue(c)命令,恢復程式的執行直到程式結束,或到達下乙個斷點

6.print(p)命令:

print命令針對變數的輸出格式:

x 按十六進製制格式顯示變數

d 按十進位制格式顯示變數

u 按十六進製制格式顯示無符號整型退出

o 按八進位制格式顯示變數

t 按二進位制格式顯示變數t 按二進位制格式顯示變數

a 按十六進製制格式顯示變數

c 按字元格式顯示變數

f 按浮點數格式顯示變數

7.watch命令:

watch命令一般用來觀察某個表示式(變數也是一種表示式)的值是否有變化,如果有變化,馬上停住程式

設定觀察點的方法:

watch  expr  為表示式expr設定乙個觀察點一旦表示式的值有變化,馬上停止程式

rwatch    expr  當表示式被讀是,停住程式

awctah  expr  當表示式的值被讀或者背寫時,停住程式

8.exammine命令:

9.jump命令

jump命令不會改變程式棧的內容,一般只在同一函式內跳轉。

jump linespec     指定下一條語句的執行點,linespec可以是linenum,filename+linenum,+offset這幾種形式

jump address      跳到**行的位址

10.signal命令

使用signal 訊號名(如sigint)這種方式把訊號傳送給程式,如果程式註冊了signal_handler函式,還可以進行相應的處理,幫助除錯程式

11.set命令

set args       設定命令列引數

set env environmentvarname=value 設定環境變數。如:set env user=benben

12.call命令

call function     強制呼叫某函式

強制呼叫某函式,它會顯示函式返回值(如果函式返回值不是void)。print命令也可以完成該功能

13.disassemble命令

反彙編命令,檢視源**的機器碼

二、多程序除錯

1.單獨除錯子程序

我們可以先執行程式,然後再另一終端使用ps -ef | grep "main"(main此處是可執行檔名)搜尋到子程序pid,然後啟動gdb,在將其附加(attach)到gdb偵錯程式上

attach child-pid        使用該命令後,直接run即可,和除錯普通程式就沒區別了

dettach                     脫離程序

2.使用偵錯程式選項follow-fork-mode

我們知道如果不設定任何選項,gdb預設除錯父程序。偵錯程式選項用法如下:

set follow-fork-mode mode     其中mode的可選值是parent和child,分別表示除錯父程序和子程序。

info inferiors                            查詢正在除錯的程序

inferior processnum                切換程序

預設設定下,在除錯多程序程式時gdb只會除錯主程序。但是gdb(>v7.0)支援多程序的分別以及同時除錯,換句話說,gdb可以同時除錯多個程式。只需要設定follow-fork-mode(預設值:parent)和detach-on-fork(預設值:on)即可。我們還可以使用catch fork指令,如果fork異常,會停止程式。

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

parent                     on               只除錯主程序(gdb預設)

child                        on               只除錯子程序

parent                     off               同時除錯兩個程序,gdb跟主程序,子程序block在fork位置

child                        off               同時除錯兩個程序,gdb跟子程序,主程序block在fork位置

設定方法:set follow-fork-mode [parent|child]   set detach-on-fork [on|off]

三:多執行緒除錯

gdb除錯一般有兩種模式:all-stop模式和no-stop模式(gdb7.0之前不支援no-stop模式)。

1.all-stop模式

在這種模式下,當你的程式在gdb由於任何原因而停止,所有的執行緒都會停止,而不僅僅是當前的執行緒。一般來說,gdb不能單步所有的執行緒。因為執行緒排程是gdb無法控制的。無論什麼時候當gdb停止你的程式,它都會自動切換到觸發斷點的那個執行緒。

2.no-stop模式(網路程式設計常用)

顧名思義,啟動不關模式。當程式在gdb中停止,只有當前的執行緒會被停止,而其他執行緒將會繼續執行。這時候step,next這些命令就只對當前執行緒起作用。

gdb支援的命裡有兩種型別:前台的(同步的)和後台(非同步 )的。區別很簡單,同步的在輸出提示符之前會等待程式report一些執行緒已經終止的資訊,非同步則是直接返回。所以我們需要set target-async 1。set pagination off不要出現 type to continue 的提示資訊 。最後一步是開啟。

下面是常用命令:

info threads                                       顯示所有執行緒

thread id                                           切換到指定執行緒

break filename:linenum thread all     在所有執行緒相應行設定斷點,注意如果主線程不會執行到該行,並且啟動all-stop模式,主線程執行n或s會切換過去

set scheduler-locking off|on\step       預設off,執行s或c其它執行緒也同步執行。on,只有當前相稱執行。step,只有當前執行緒執行

show scheduler-locking                    顯示當前模式

主要是我們要用能用的上的,比如no-stop模式,一般多執行緒除錯就很有用的。

gdb pid 執行緒 gdb多執行緒除錯

死鎖除錯 1 g引數 2 attach 3 info threads void workthread void arg pthread mutex t mutex pthread mutex init mutex,0 usleep 1000 1000 fprintf stderr,timeout w...

gdb pid 執行緒 gdb除錯多執行緒

gdb 多執行緒除錯基本命令 實現簡介 以及乙個問題的解決 teawater gmail.com 一直對gdb多執行緒除錯接觸不多,最近因為工作有了一些接觸,簡單作點記錄吧。如果程式是多程序在跑,先將其設定成單程序模式 kamailio 檢視程序中所有執行緒的棧呼叫 pstack 程序pid pst...

gdb除錯多程序多執行緒

1.除錯多程序預設設定下,在除錯多程序程式時gdb只會除錯主程序。但是gdb v7.0 支援多程序的 分別以及同時 除錯,換句話說,gdb可以同時除錯多個程式。只需要設定follow fork mode 預設值 parent 和detach on fork 預設值 on 即可。接下來,首先介紹一下f...