gdb是linux下的除錯利器,在c/c++程式開發過程中必不可少的。這裡總結一下多程序和多執行緒的除錯方法和技巧。
多程序的除錯:
如下示例
#include #include編譯 gcc -g process.c -o process -g一定要加上,否則沒有除錯資訊。#include
#include
#include
#include
static
int glob = 23
;void
test()
}int
main()
else
if(pid > 0
) }
wait(pid);
return0;
}
1. 如果我想要鎖定子程序/父程序該怎樣?
這裡在fork之後就會產生子程序, 如果我們要鎖定子程序或者父程序可以使用 set follow-fork-mode [parent|child] 來完成。
(gdb) set follow-fork-mode child這裡可以看到父程序一直在running, 跟蹤子程序並沒有停止父程序。 如果想要讓父程序處於等待狀態可以設定 set detach-on-fork [on | off](gdb) b
23note: breakpoint
1 also set at pc 0x4006e4
.breakpoint
2 at 0x4006e4: file process.c, line 23
.(gdb) info breakpoints
num type disp enb address what
1 breakpoint keep y 0x00000000004006e4
inmain
at process.c:
23 inf 2, 1
breakpoint already hit
1time
2 breakpoint keep y 0x00000000004006e4
inmain
at process.c:
23 inf 2, 1
(gdb) delete breakpoints
2(gdb) r
starting program: /home/cps/桌面/ipc/process
breakpoint
1, main () at process.c:23
23int pid =fork();
(gdb) n
[new process
37322
]father pid :
37321
[switching to process
37322]24
if(pid == 0
)(gdb) sparent running
26 test();
(gdb)parent running
(gdb) set follow-fork-mode child可以看到父程序並沒有執行,而是暫停狀態。 只有子程序處於執行狀態。(gdb) b
23breakpoint
1 at 0x4006e4: file process.c, line 23
.(gdb) set detach-on-fork off
(gdb) r
starting program: /home/cps/桌面/ipc/process
breakpoint
1, main () at process.c:23
23int pid =fork();
missing separate debuginfos, use: debuginfo-install glibc-2.17-157
.el7.x86_64
(gdb) n
[new process
37548
]child pid:
37548
child running
child running
child running
child running
2. 如何跟蹤乙個正在執行的程序?
這裡就要說到attach乙個程序, 可以使用gdb -p pid execfilepath 來跟蹤乙個程序。
[cps@cps ipc]$ gdb -p 37682這裡的第乙個print i 並沒有列印東西,原因是沒有進入堆疊, 我們進入test的堆疊後就可以檢視變數。同時在gdb中也可以attach到乙個程序中attach pid。process
gnu gdb (gdb) red hat enterprise linux
7.6.1-94
.el7
missing separate debuginfos, use: debuginfo-install glibc-2.17-157
.el7.x86_64
(gdb) bt#0
0x00007fb8d8fad650
in __nanosleep_nocancel () from /lib64/libc.so.6#1
0x00007fb8d8fad504
in sleep () from /lib64/libc.so.6#2
0x00000000004006d0
in test () at process.c:16#3
0x00000000004006fc
in main () at process.c:26
(gdb) print i
no symbol "i
"incurrent context.
(gdb) frame 2#
20x00000000004006d0
in test () at process.c:16
16 sleep(3
);(gdb) print i
$1 = 8
(gdb)
3. 程序異常crash 怎樣檢視?
這種情況下要開啟coredump, 使用命令ulimit -c 1024 設定coredump開啟。最後將dump檔案和可執行檔案 一同載入到gdb。 gdb coredump execfile。 進入gdb後 執行bt 和where 檢視出錯的地方。但是一般情況下的段錯誤用這種方法可很難查到。一般做法就是一步一步的除錯,這種情況一般都是非法訪問記憶體造成的,在最有可能出錯的地方打斷點。這種情況並沒有較為直接的方法。
多執行緒除錯:
1. 檢視當前程序中的所有執行緒
info threads 檢視當前程序下的所有執行緒。前面有*代表當前處於的執行緒。
thread id 可以切換當前處於的執行緒,bt檢視執行緒的堆疊
2. 鎖定乙個執行緒
thread id 選定這個執行緒
set scheduler-locking on 可以用來鎖定這個執行緒 只觀察這個執行緒的運**況。 當鎖定這個執行緒時, 其他執行緒就處於了暫停狀態。
3. 鎖定乙個執行緒,讓其他執行緒照常執行
鎖定乙個執行緒讓其他執行緒照常執行,這種用法在gdb 7.0以上的版本是支援的。可以如下設定gdb
set target-async 1這裡的幾個命令要在程式執行之前執行這些。setpagination off
set non-stop on
多程序和多執行緒的除錯技巧還有很多, 這裡只是說了一些常見的基本用法。 至於其他的一些gdb用法可以檢視gdb help。
gdb除錯多程序多執行緒
1.除錯多程序預設設定下,在除錯多程序程式時gdb只會除錯主程序。但是gdb v7.0 支援多程序的 分別以及同時 除錯,換句話說,gdb可以同時除錯多個程式。只需要設定follow fork mode 預設值 parent 和detach on fork 預設值 on 即可。接下來,首先介紹一下f...
gdb除錯多程序多執行緒
gdb是非常強大的unix及unix like下的程式除錯工具 gdb的使用 r或run 執行程式。list l 行號 顯示檔案源 接著上次的位置往下列,每次列10行。list l 函式名 列出某個函式的源 s或step 進入函式呼叫 breaktrace 或bt 檢視各級函式調 用及引數 info...
GDB除錯多執行緒 多程序
用gdb除錯多程序程式 如果乙個程序通過fork系統呼叫建立了子程序,gdb會繼續除錯原來的程序,子程序則正常執行。那麼該如何除錯子程序呢?單獨除錯子程序 子程序從本質上說也是乙個程序,因此我們可以用通用的gdb除錯方法來除錯他。舉例來說如果要除錯乙個伺服器中的某乙個子程序,我們可以先執行伺服器,然...