GDB 除錯多執行緒多程序

2021-08-17 18:03:57 字數 3953 閱讀 1936

gdb是linux下的除錯利器,在c/c++程式開發過程中必不可少的。這裡總結一下多程序和多執行緒的除錯方法和技巧。

多程序的除錯:

如下示例

#include #include 

#include

#include

#include

#include

static

int glob = 23

;void

test()

}int

main()

else

if(pid > 0

) }

wait(pid);

return0;

}

編譯 gcc -g process.c -o process   -g一定要加上,否則沒有除錯資訊。

1. 如果我想要鎖定子程序/父程序該怎樣?

這裡在fork之後就會產生子程序, 如果我們要鎖定子程序或者父程序可以使用  set follow-fork-mode [parent|child] 來完成。

(gdb) set follow-fork-mode child

(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

這裡可以看到父程序一直在running, 跟蹤子程序並沒有停止父程序。 如果想要讓父程序處於等待狀態可以設定 set detach-on-fork [on | off]

(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

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)

這裡的第乙個print i 並沒有列印東西,原因是沒有進入堆疊, 我們進入test的堆疊後就可以檢視變數。同時在gdb中也可以attach到乙個程序中attach pid。

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除錯方法來除錯他。舉例來說如果要除錯乙個伺服器中的某乙個子程序,我們可以先執行伺服器,然...