天天看點

GDB調試總結

Linux下GDB調試指令

GDB 調試主要有三種方式:

1. gdb filename 直接調試目标程式 (gdb ./目标程式檔案名)

2. gdb attach pid 附加程序

3. gdb filename corename 調試 core 檔案

>gcc file.c -g -o app 編譯指令

>gdb app 運作調試指令

>start 單步執行;>run全速執行;>list檢視代碼;>b+ line_num某行下斷點;

>d + breakpoint_num 删除斷點;

>info breakpoint 檢視所有斷點;

>disable/enable+breakpoint_num 禁用/啟用斷點;

>bt 棧幀;

>frame+ bt_number 臨時切換棧幀。

GDB調試多線程指令:

info threads 顯示目前可調試的所有線程,每個線程會有一個GDB為其配置設定的ID,後面操作線程的時候會用到這個ID。 前面有*的是目前調試的線程

thread ID(1,2,3…) 切換目前調試的線程為指定ID的線程;切換目前調試的線程為指定ID号,ID是gdb配置設定的序号,不是線程TID

break thread_test.c:123 thread all(例:在相應函數的位置設定斷點break pthread_run1) 在所有線程中相應的行上設定斷點

thread apply ID1 ID2 command 讓一個或者多個線程執行GDB指令command

thread apply all command 讓所有被調試線程執行GDB指令command

set scheduler-locking 選項 command 設定線程是以什麼方式來執行指令

set scheduler-locking [on/off] on鎖定其他線程,隻有目前選擇調試的線程執行,off表示不鎖定任何線程,當運作到斷點處,将所有的線程都暫停下來,直到指定某個線程繼續執行,如果在目前線程下使用continue的話會啟動所有線程(GDB預設)。

set scheduler-locking off 不鎖定任何線程,也就是所有線程都執行,這是預設值

set scheduler-locking on 隻有目前被調試程式會執行

set scheduler-locking on step 在單步的時候,除了next過一個函數的情況(熟悉情況的人可能知道,這其實是一個設定斷點然後continue的行為)以外,隻有目前線程會執行。

Linux下多線程檢視工具(pstree、ps、pstack)

pstree

>pstree  主線程id

ps

繼續閱讀