GDB 除錯多執行緒程式的總結

2021-10-05 13:14:12 字數 2304 閱讀 8791

step就是單步執行,遇到子函式就進入並且繼續單步執行;在其他除錯其中相當於step-into命令,作用是移動到下乙個可執行的**行。如果當前行是乙個函式呼叫,則偵錯程式進入函式並停止在函式體的第一行。step可以幫助初步揭開**位置的謎團,例如:函式呼叫和函式本身可能在不同的檔案中。

next是在單步執行時,在函式內遇到子函式時不會進入子函式內單步執行,而是將子函式整個執行完再停止,也就是把子函式整個作為一步。在其他偵錯程式中相當於step-over,作用是在同乙個呼叫棧層中移動到下乙個可執行的**行。偵錯程式不會進入函式體。如果當前行是函式的最後一行,則,next將進入下乙個棧層,並在呼叫函式的下一行停止。

finish就是但單步執行到子函式內時,用step out就可以執行完子函式餘下部分,並返回到上一層函式。在其他偵錯程式中相當於step-out,作用是在棧中前進到到下一層,並在呼叫函式的下一行停止。

假設現在有乙個主線程建立了乙個子執行緒。

gdb除錯時,設定斷點,單步除錯到pthread_create處的時候,這時候會建立子執行緒,會出現如下資訊

[new thread 0x7ffff6fd1700 (lwp 6376)]
預設情況下,gdb只跟蹤主線程,新建立的執行緒都被阻塞在pthread_create函式處。

info threads可以除錯的所有執行緒,gdb會為每個執行緒分配乙個id,這個id和執行緒id不同,id號一般從1開始。

如下,表示當前有兩個執行緒1和2,*表示跟蹤主線程1

(gdb) info threads

id target id frame

2 thread 0x7ffff6fd1700 (lwp 6376) "test" 0x00007ffff70d0851 in clone ()

from /lib64/libc.so.6

* 1 thread 0x7ffff7fee740 (lwp 6375) "test" main (argc=1, ar**=0x7fffffffe2d8) at test.cpp:31

thread id切換當前除錯的執行緒為指定id號,id是gdb分配的序號,不是執行緒tid。

set scheduler-locking off|onon鎖定其他執行緒,只有當前選擇除錯的執行緒執行,off表示不鎖定任何執行緒,當執行到斷點處,將所有的執行緒都暫停下來,直到指定某個執行緒繼續執行,如果在當前執行緒下使用continue的話會啟動所有執行緒(gdb預設)。

上面說過乙個執行緒中斷在乙個斷點上,其他所有的執行緒都會被freeze。新版本的gdb中,引入了non-stop模式,在這個模式下:

當某個或多個執行緒在乙個斷點上,其他執行緒仍會並行執行

你可以選擇某個被中斷的執行緒,只讓他執行。

non-stop模式表示不停止模式,除了斷點有關的程序會被停下來,其他執行緒會繼續執行。

設定non-stop模式,開啟gdb後,在開始r之前,首先連續輸入下面的指令

set target-async 1

set pagination off

set non-stop on

info threads顯示當前可除錯的所有執行緒,每個執行緒會有乙個gdb為其分配的id,後面操作執行緒的時候會用到這個id。 前面有*的是當前除錯的執行緒

thread id(1,2,3…)切換當前除錯的執行緒為指定id的執行緒

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

set scheduler-locking選項 command 設定執行緒是以什麼方式來執行命令

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

set scheduler-locking on只有當前被除錯程式會執行

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

除錯程序池和執行緒池中的程式乙個不錯的方法,是將池中的個數減少至1,觀察是否正確,然後逐步增加執行緒數量,除錯執行緒的同步是否正確

gdb除錯多執行緒程式總結

原文 先介紹一下gdb多執行緒除錯的基本命令。info threads顯示當前可除錯的所有執行緒,每個執行緒會有乙個gdb為其分配的id,後面操作執行緒的時候會用到這個id。前面有 的是當前除錯的執行緒。thread id切換當前除錯的執行緒為指定id的執行緒。break thread test.c...

GDB除錯多執行緒程式

info threads 顯示當前可除錯的所有執行緒,每個執行緒會有乙個gdb為其分配的id,後面操作執行緒的時候會用到這個id。前面有 的是當前除錯的執行緒。thread id 切換當前除錯的執行緒為指定id的執行緒 break thread test.c 123 thread all 在所有執行...

Gdb 除錯多執行緒程式

gdb多執行緒除錯的基本命令。info threads顯示當前可除錯的所有執行緒,每個執行緒會有乙個gdb為其分配的id,後面操作執行緒的時候會用到這個id。前面有 的是當前除錯的執行緒。thread id切換當前除錯的執行緒為指定id的執行緒。break thread test.c 123 thr...