使用gdb執行cs:ip指向的記憶體單元處的指令
#include void fun (int x)
int main (void)
看起來是在15行,呼叫fun的時候出錯了。常見的辦法是在15行設定個斷點,然後從頭run一次。(gdb) n
13 fun (i--);
(gdb)
14 fun (i--);
(gdb)
15 fun (i--);
(gdb)
error
17 return 0;
如果你的環境支援反向執行,那麼更好了。
如果不支援,你也可以直接jump到15行,再執行一次:
需要注意的是(gdb) b 15
breakpoint 2 at 0x40056a: file jump.c, line 15.
(gdb) j 15
continuing at 0x40056a.
breakpoint 2, main () at jump.c:15
15 fun (i--);
(gdb) s
fun (x=-2) at jump.c:5
5 if (x < 0)
(gdb) n
6 puts ("error");
jump命令只改變pc的值,所以改變程式執行可能會出現不同的結果,比如變數i的值
通過(臨時)斷點的配合,可以讓你的程式跳到指定的位置,並停下來
使用readlink讀取鏈結檔案指向的內容
有時我們需要讀取鏈結檔案指向的內容,比如,給定乙個程序的fd,我們想知道這個fd具體是什麼東西,那麼,就可以在 proc fd目錄下看到該fd指向的內容,只不過這個目錄下該fd是乙個鏈結檔案,我們需要的是該檔案指向的內容。此時就可以用readlink這個system call,具體用法很簡單,比如 ...
GDB 使用 (七)改變程式的執行
改變程式的執行 一旦使用gdb掛上被除錯程式,當程式執行起來後,你可以根據自己的除錯思路來動態地在gdb中更改當前被除錯程式的執行線路或是其變數的值,這個強大的功能能夠讓你更好的除錯你的程式,比如,你可以在程式的一次執行中走遍程式的所有分支。一 修改變數值 修改被除錯程式執行時的變數值,在gdb中很...
使用gdb除錯當前執行的程式
用gdb可以除錯當前的程式的使用情況,讀出他的引數。以下用乙個簡單的程式做為例子 來說明gdb的除錯。第一步 編譯乙個死迴圈程式。file name malloc.c include include include void getmem void p,int num void test void ...