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