1. 程式人生 > >Linux-gdb除錯

Linux-gdb除錯

GDB是一個由GNU開源組織釋出的、UNIX/LINUX作業系統下的、基於命令列的、功能強大的程式除錯工具。他是學習指標、除錯程式非常有用的工具和方法 gdb的常見命令:

簡寫 全稱 備註
l list 顯示指定行號或者指定函式附件的原始碼
b break 在指定行號或者指定函式開頭處設定斷點。如 b main
r run 執行程式,直到程式結束或者遇到斷點而停下
c continue 在程式中斷後繼續執行程式,直到程式結束或者遇到斷點而停下。注意在程式開始執行前只能用r,不能用c
n next 執行下一條語句。如果有函式呼叫,則把它作為一個整體
s step 執行下一條語句。如果有函式呼叫,則需要進入呼叫函式
u until 執行到指定行號或者是指定函式的開頭
p print 顯示變數或表示式的值
disp display 把一個表示式設定為display,當程式每次停下來時都會顯示其值
d delete 取消斷點,和b的格式相同。如果該位置有多個斷點,將同時取消
i info 顯示各種資訊。如 i b 顯示所有斷點,i disp顯示display,而i lo顯示所有區域性變數
watch watch 可以使用watch為表示式(變數)expr設定一個觀察點。當表示式值有變化時,馬上停住程式

例項:

 1#include<
stdio.h> 2 3 void swap(int *a, int *b) 4 { 5 int t = *a; 6 *a = *b; 7 *b = t; 8 } 9 10 int main() 11 { 12 int a = 3; 13 int b = 4; 14 swap(&a, &b); 15 16 printf("%d %d\n", a, b); 17 return 0; 18 }
/* 第一步:編譯程式 */
gcc -g swap.c -std=c99
 /* 第二步:執行gdb */
gdb a.out /* 第三步:檢視原始碼 */ (gdb)l 1#include<stdio.h> 2 3 void swap(int *a, int *b) 4 { 5 int t = *a; 6 *a = *b; 7 *b = t; 8 } 9 10 int main() 11 { 12 int a = 3; 13 int b = 4; 14 swap(&a, &b); 15 16 printf("%d %d\n", a, b); 17 return 0; 18 } /* 第四步:加斷點並且執行。*/ (gdb)b 8 Breakpoint 1 at 0x4004ee: file swap2.c, line 8. (gdb)r Starting program: /home/zhoupiaolong/cstudy/a.out Breakpoint 1, swap (a=0x7fffffffe4ec, b=0x7fffffffe4e8) at swap2.c:8 8 } * /第五步:檢視呼叫棧 */ (gdb)bt #0 swap (a=0x7fffffffe4ec, b=0x7fffffffe4e8) at swap2.c:8 #1 0x0000000000400519 in main () at swap2.c:14 (gdb) p a $1 = (int *) 0x7fffffffe4ec (gdb) p b $2 = (int *) 0x7fffffffe4e8 (gdb) p *a $3 = 4 (gdb) p *b $4 = 3 (gdb) up #1 0x0000000000400519 in main () at swap2.c:14 14 swap(&a, &b); (gdb) p a $5 = 4 (gdb) p b $6 = 3 (gdb) p &a $7 = (int *) 0x7fffffffe4ec (gdb) p &b $8 = (int *) 0x7fffffffe4e8

之前對於gdb還停留在命令列,沒想到gdb居然有視覺化除錯介面,真的是太猛了,只有你想不到的!!!沒有做不到的。

但是如果我們在編譯連線時上加了-g命令生成的可執行檔案,用gdb -tui -q p2psrv(要debug的命令),就可以進入一個類似的視覺化的除錯介面。

具體使用方法可以看這篇連結裡面有詳細的命令介紹