gdb除錯正在執行程序

2021-07-09 12:16:46 字數 2648 閱讀 8540

用gdb可以除錯當前的程式的使用情況,讀出他的引數。

以下用乙個簡單的程式做為例子:來說明gdb的除錯。

第一步  編譯乙個死迴圈程式。

/* file name malloc.c*/

#include  

#include  

#include  

void getmem(void **p, int num)

void test(void)

int main(void)   

}return 0;

}                 

我們可以看出,這個程式就是malloc一段記憶體空間,用來供strcpy使用,由於只是除錯一下,就沒有在test程式中加上一些關於strcpy的正確性判斷語句。

函式的正常退出的情況是i==1,但是程式執行過程中根本無法使i==1成立。i的變數的值將會在使用gdb時用到。

開始編譯

$gcc -g malloc.c

得用gdb,加上-g還是需要的。生成的可執行檔案為a.out

第二步  讓gdb連線到正在執行的程序上去

首先執行程式。

$./a.out

明顯的,是乙個死迴圈。

重新開乙個shell

$ps -u

我的機器的運**況如下所示:

warning: bad ps syntax, perhaps a bogus '-'? see

user       pid %cpu %mem    vsz   rss tty      stat start   time command

wyc       7712  0.0  0.1   6092  3644 pts/8    ss   10:24   0:00 bash

wyc       7880  0.0  0.1   6092  3608 pts/9    ss   10:27   0:00 bash

wyc       7929  0.0  0.3  10848  6468 pts/9    s+   10:28   0:00 gdb

wyc       8347 93.0  0.0   1652   284 pts/8    r+   10:42   0:13 ./a.out

...看到沒有? ./a.out的程序號是8347。

現在啟動gdb

$gdb

由於是除錯執行的程序,不是可執行檔案,後面不需要跟任何引數。在用 gdb除錯執行狀態下的程式時,最核心的就是gdb內部的attach命令

用法為(gdb) attach 

這是我的機器上的例子:

$ gdb

來修改變數i的值(用set i=1不能識別命令),使程式能夠正常退出。

在除錯時,當前程式呼叫的所有庫也全部都出來了。這個例子中的

是a.out程式所呼叫的全部庫。可以用這種辦法分析當前執行的程式的庫的呼叫情況。

千萬不要關掉gdb,以下除錯更精彩:

第三步 在gdb中重啟程式

在上面已經知道了程式正常退出了,但是gdb還沒有退出,這時在gdb中執行run效果如何?

下面是死迴圈了...

接下ctrl+c,給gdb發個sigint的訊號。

^cprogram received signal sigint, interrupt.

main () at malloc.c:19

19            if (i == 1)

(gdb) n

0xb7e7b775 in __libc_start_main () from /lib/tls/i686/cmov/libc.so.6

(gdb) n

single stepping until exit from function __libc_start_main, 

which has no line number information.

program exited with code 01.

可以看出,用gdb連線程序後,他會找到執行這個程序所需的全部檔案,當前程序關閉後,仍然可以在gdb中啟動這個程式。

不得不佩服gdb的除錯功能的強大

gdb中的其它命令,就看你分析程式時是否用到了,例如下面的一些簡單的命令:

常用的bt, p , p/x , setp, info registers, break , jump ......

gdb除錯正在執行的程序

有時會遇到一種很特殊的除錯需求,對當前正在執行的其它程序進行除錯 正是我今天遇到的情形 這種情況有可能發生在那些無法直接在偵錯程式中執行的程序身上,例如有的程序 只能在系統啟動時執行。另外如果需要對程序產生的子程序進行除錯的話,也只能採用這種方式。gdb可以對正在執行的程式進行排程,它允許開發人員中...

gdb用法(三) 除錯其他正在執行的程序

有時會遇到一種很特殊的除錯需求,對當前正在執行的其它程序進行除錯。這種情況有可能發生在那些無法直接在偵錯程式中執行的程序身上,例如有的程序只能在系統啟動時執行。另外如果需要對程序產生的子程序進行除錯的話,也只能採用這種方式。gdb可以對正在執行的程式進行排程,它允許開發人員中斷程式並檢視其狀態,之後...

把正在執行的程式拉進gdb除錯

gdb 是 linux 系統上常用的 c c 除錯工具,功能十分強大。對於較為複雜的系統,比如多程序系統,如何使用 gdb 除錯呢?考慮下面這個三程序系統 proc2 是 proc1 的子程序,proc3 又是 proc2 的子程序。如何使用 gdb 除錯 proc2 或者 proc3 呢?實際上,...