Linux-gdb除錯
阿新 • • 發佈:2018-12-19
GDB是一個由GNU開源組織釋出的、UNIX/LINUX作業系統下的、基於命令列的、功能強大的程式除錯工具。他是學習指標、除錯程式非常有用的工具和方法 gdb的常見命令:
簡寫 | 全稱 | 備註 |
---|---|---|
l | list | 顯示指定行號或者指定函式附件的原始碼 |
b | break | 在指定行號或者指定函式開頭處設定斷點。如 b main |
r | run | 執行程式,直到程式結束或者遇到斷點而停下 |
c | continue | 在程式中斷後繼續執行程式,直到程式結束或者遇到斷點而停下。注意在程式開始執行前只能用r,不能用c |
n | next | 執行下一條語句。如果有函式呼叫,則把它作為一個整體 |
s | step | 執行下一條語句。如果有函式呼叫,則需要進入呼叫函式 |
u | until | 執行到指定行號或者是指定函式的開頭 |
p | 顯示變數或表示式的值 | |
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的命令),就可以進入一個類似的視覺化的除錯介面。
具體使用方法可以看這篇連結裡面有詳細的命令介紹