gdb除錯多執行緒

2021-07-11 02:52:33 字數 4189 閱讀 7417

gdb是非常強大的除錯工具,在文字模式下使用。使用方法可以參考陳皓的兩篇文章 

用gdb除錯程式(一)

用gdb除錯程式(二)

gdb常用命令在下表列出:

命令描述

backtrace(或bt)

檢視各級函式呼叫及引數

finish

連續執行到當前函式返回為止,然後停下來等待命令

frame(或f)

幀編號 選擇棧幀

info(或i)

locals 檢視當前棧幀區域性變數的值

list(或l)

列出源**,接著上次的位置往下列,每次列10行

list 行號

列出從第幾行開始的源**

list 函式名

列出某個函式的源**

next(或n)

執行下一行語句

print(或p)

列印表示式的值,通過表示式可以修改變數的值或者呼叫函式

quit(或q)

退出gdb除錯環境

set var

修改變數的值

start

開始執行程式,停在main函式第一行語句前面等待命令

step(或s)

執行下一行語句,如果有函式呼叫則進入到函式中

在多執行緒程式設計時,當我們需要除錯時,有時需要控制某些執行緒停在斷點,有些執行緒繼續執行。有時需要控制線程的執行順序。有時需要中斷某個執行緒,切換到其他執行緒。這些都可以通過gdb實現。

先來看一下gdb除錯多執行緒常用命令:

來看乙個例子: 

gdbtest.cpp。程式很簡單,只是讓兩個執行緒執行函式threadfun,在函式中列印傳入的引數。

#include 

#include

void* threadfun(void* arg)

int main()

ret = pthread_create(&thread_id2, null, threadfun, static_cast

(v2));

if (ret)

pthread_join(thread_id1, null);

pthread_join(thread_id2, null);

return

0;}

$ gdb gdbthreadtest//除錯gdbthreadtest
加斷點

(gdb) break 7

breakpoint 1

at0x400a19: file kangthread.cpp, line

7.(gdb) break 35

breakpoint 2

at0x400b35: file kangthread.cpp, line

35.(gdb) info break

num type disp enb address what

1breakpoint keep y 0x0000000000400a19

in threadfun(void*) at kangthread.cpp:7

2breakpoint keep y 0x0000000000400b35

in main() at kangthread.cpp:35

開始執行

(gdb) r

starting program: /home/kang/src/multhread/kangthread

[thread debugging using libthread_db enabled]

using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

traceback (most recent call

last):

file "/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19-gdb.py", line 63, in

from libstdcxx.v6.printers import register_libstdcxx_printers

importerror: no

module named 'libstdcxx'

[new thread 0x7ffff6fd5700 (lwp 2773)]

[switching to thread 0x7ffff6fd5700 (lwp 2773)]

breakpoint 1, threadfun (arg=0x602010) at kangthread.cpp:7

warning: source file is more recent than executable.

7int *value=static_cast (arg);

檢視執行緒資訊

(gdb) info thread

[new thread

0x7ffff67d4700 (lwp 2774)]

id target id frame

3thread

0x7ffff67d4700 (lwp 2774) "kangthread" clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.s:81

* 2thread

0x7ffff6fd5700 (lwp 2773) "kangthread" threadfun (arg=0x602010) at kangthread.cpp:7

1thread

0x7ffff7fda780 (lwp 2769) "kangthread" clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.s:81

可以看到id為2的執行緒執行到了斷點breakpoint 1。可以看一下value的值

(gdb) n

8std:

:cout<<"this is thread"

<<*value<:

:endl;

(gdb) p *value

$2 = 1

切換到執行緒3,看一下執行緒3執行到了**

(gdb) c

continuing.

1[switching to thread 0x7ffff67d4700 (lwp 2774)]

breakpoint 1, threadfun (arg=0x602030) at kangthread.cpp:7

7int *value=static_cast

(arg);

(gdb) info thread

id target id frame

* 3 thread 0x7ffff67d4700 (lwp 2774) "kangthread" threadfun (arg=0x602030) at kangthread.cpp:7

2 thread 0x7ffff6fd5700 (lwp 2773) "kangthread" __gi__dl_debug_state () at dl-debug.c:74

1 thread 0x7ffff7fda780 (lwp 2769) "kangthread"

0x00007ffff7bc566b in pthread_join (threadid=140737337186048,

thread_return=0x0) at pthread_join.c:92

(gdb) thread 3

[switching to thread 3 (thread 0x7ffff67d4700 (lwp 2774))]

#0 threadfun (arg=0x602030) at kangthread.cpp:7

7int *value=static_cast

(arg);

(gdb) n

8std::cout

<<"this is thread"

<<*value<(gdb) p *value

$3 = 2

可以看出執行緒3的value為2。

還有其他許多命令和方法,要在實踐中慢慢熟悉。

頂 0

gdb多執行緒除錯

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

gdb 除錯多執行緒

設定core環境 uname a 檢視機器引數 ulimit a 檢視預設引數 ulimit c 1024 設定core檔案大小為1024 ulimit c unlimit 設定core檔案大小為無限 多執行緒如果dump,多為段錯誤,一般都涉及記憶體非法讀寫。可以這樣處理,使用下面的命令開啟系統開...

gdb 多執行緒除錯

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