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...