用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 呢?實際上,...