為什麼使用gdb除錯正在執行的程式?
因為有時候bug很難復現、或者環境搭建起來比較困難,所以在出現bug的時候可以使用gdb的attach功能除錯正在執行的gcc編譯出來的程式,注意編譯選項要加-g,否則沒有符號表。
除錯步驟?
1. 編譯時候帶-g選項。
2. 執行程式。
3. ps找到程序號。
4. 啟動gdb,使用attach選項,這時gdb會停止在程式的某處。
5. 按照gdb除錯方法除錯。當程式退出之後,依然可以使用run命令重啟程式。
用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
在上面已經知道了程式正常退出了,但是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的除錯。第一步 編譯乙個死迴圈程式。file name malloc.c include include include void getmem void p,int num void test void ...
使用gdb除錯當前執行的程式
用gdb可以除錯當前的程式的使用情況,讀出他的引數。以下用乙個簡單的程式做為例子 來說明gdb的除錯。第一步 編譯乙個死迴圈程式。file name malloc.c include include include void getmem void p,int num void test void ...
使用gdb除錯當前執行的程式
用gdb可以除錯當前的程式的使用情況,讀出他的引數。以下用乙個簡單的程式做為例子 來說明gdb的除錯。第一步 編譯乙個死迴圈程式。file name malloc.c include include include void getmem void p,int num void test void ...