- 它使你能監視你程序中變量的值.
- 它使你能設置斷點以使程序在指定的代碼行上停止執行.
- 它使你能一行行的執行你的代碼.
爲調試編譯代碼(Compiling Code for Debugging)
爲了使 gdb 正常工作, 你必須使你的程序在編譯時包含調試信息. 調試信息包含你程序裏的每個變量的類型和在可執行文件裏的地址映射以及源代碼的行號. gdb 利用這些信息使源代碼和機器碼相關聯.
在編譯時用 -g 選項打開調試選項.
gdb 基本命令
gdb 支持很多的命令使你能實現不同的功能. 這些命令從簡單的文件裝入到允許你檢查所調用的堆棧內容的複雜命令, 表27.1列出了你在用 gdb 調試時會用到的一些命令. 想了解 gdb 的詳細使用請參考 gdb 的指南頁.表 27.1. 基本 gdb 命令.
命 令 | 描 述 |
file | 裝入想要調試的可執行文件. |
kill | 終止正在調試的程序. |
list | 列出產生執行文件的源代碼的一部分. |
next | 執行一行源代碼但不進入函數內部. |
step | 執行一行源代碼而且進入函數內部. |
run | 執行當前被調試的程序 |
quit | 終止 gdb |
watch | 使你能監視一個變量的值而不管它何時被改變. |
break | 在代碼裏設置斷點, 這將使程序執行到這裏時被掛起. |
make | 使你能不退出 gdb 就可以重新產生可執行文件. |
shell | 使你能不離開 gdb 就執行 UNIX shell 命令. |
gdb 支持很多與 UNIX shell 程序一樣的命令編輯特徵. 你能象在 bash 或 tcsh裏那樣按 Tab 鍵讓 gdb 幫你補齊一個唯一的命令, 如果不唯一的話 gdb 會列出所有匹配的命令. 你也能用光標鍵上下翻動歷史命令.
gdb 應用舉例
本節用一個實例教你一步步的用 gdb 調試程序. 被調試的程序相當的簡單, 但它展示了 gdb 的典型應用.下面列出了將被調試的程序. 這個程序被稱爲 greeting , 它顯示一個簡單的問候, 再用反序將它列出.
#include <stdio.h>
void main ()
{
char my_string[] = "hello there";
my_print (my_string);
my_print2 (my_string);
}
void my_print (char *string)
{
printf ("The string is %s\n", string);
}
void my_print2 (char *string)
{
char *string2;
int size, i;
size = strlen (string);
string2 = (char *) malloc (size + 1);
for (i = 0; i < size; i++)
string2[size - i] = string[i];
string2[size+1] = `\0';
printf ("The string printed backward is %s\n", string2);
}
gdb greeting
-
注意: 記得在編譯 greeting 程序時把調試選項打開.
(gdb) file greeting 這個命令將載入 greeting 可執行文件就象你在 gdb 命令行裏裝入它一樣.這時你能用 gdb 的 run 命令來運行 greeting 了. 當它在 gdb 裏被運行後結果大約會象這樣:
(gdb) runStarting program: /root/greetingThe string is hello thereThe string printed backward isProgram exited with code 041
-
技巧: 在 gdb 提示符下按回車健將重複上一個命令.
1 #include <stdio.h>
11 my_print (char *string)
現在再鍵入 run 命令, 將產生如下的輸出:
Starting program: /root/greetingThe string is hello thereBreakpoint 1, my_print2 (string = 0xbfffdc4 "hello there") at greeting.c :2424 string2[size-i]=string[i]
Watchpoint 2, string2[size - i]Old value = 0 `\000'New value = 104 `h'my_print2(string = 0xbfffdc4 "hello there") at greeting.c:2323 for (i=0; i<size; i++)
現在找出了問題出在哪裏, 修正這個錯誤是很容易的. 你得把代碼裏寫入 string2 的第一個字符的的偏移量改爲size - 1 而不是 size. 這是因爲 string2 的大小爲 12, 但起始偏移量是 0, 串內的字符從偏移量 0 到 偏移量 10, 偏移量 11 爲空字符保留.
爲了使代碼正常工作有很多種修改辦法. 一種是另設一個比串的實際大小小 1 的變量. 這是這種解決辦法的代碼:
#include <stdio.h>main (){ char my_string[] = "hello there"; my_print (my_string); my_print2 (my_string);}my_print (char *string){ printf ("The string is %s\n", string);}my_print2 (char *string){ char *string2; int size, size2, i; size = strlen (string); size2 = size -1; string2 = (char *) malloc (size + 1); for (i = 0; i < size; i++) string2[size2 - i] = string[i]; string2[size] = `\0'; printf ("The string printed backward is %s\n", string2);}