linux下gdb單步除錯
用 GDB 除錯程式
GDB 概述
————
GDB 是 GNU 開源組織釋出的一個強大的 UNIX 下的程式除錯工具。或許,各位比較喜歡那種圖形介面方式的,像 VC 、 BCB 等 IDE 的除錯,但如果你是在 UNIX 平臺下做軟體,你會發現 GDB 這個除錯工具有比 VC 、 BCB 的圖形化偵錯程式更強大的功能。所謂 “ 寸有所長,尺有所短 ” 就是這個道理。
一般來說, GDB 主要幫忙你完成下面四個方面的功能:
1 、啟動你的程式,可以按照你的自定義的要求隨心所欲的執行程式。
2 、可讓被除錯的程式在你所指定的調置的斷點處停住。(斷點可以是條件表示式)
3 、當程式被停住時,可以檢查此時你的程式中所發生的事。
4 、動態的改變你程式的執行環境。
從上面看來, GDB 和一般的除錯工具沒有什麼兩樣,基本上也是完成這些功能,不過在細節上,你會發現 GDB 這個除錯工具的強大,大家可能比較習慣了圖形化的除錯工具,但有時候,命令列的除錯工具卻有著圖形化工具所不能完成的功能。讓我們一一看來。
一個除錯示例
——————
源程式: tst.c
編譯生成執行檔案:( Linux 下)
hchen/test> cc -g tst.c -o tst
使用 GDB 除錯:
hchen/test> gdb tst <---------- 啟動 GDB
GNU gdb 5.1.1
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-suse-linux"...
(gdb) l <-------------------- l 命令相當於 list ,從第一行開始例出原碼。
1 #include <stdio.h>
2
3 int func(int n)
4 {
5 int sum=0,i;
6 for(i=0; i<n; i++)
7 {
8 sum+=i;
9 }
10 return sum;
(gdb) <-------------------- 直接回車表示,重複上一次命令
11 }
12
13
14 main()
15 {
16 int i;
17 long result = 0;
18 for(i=1; i<=100; i++)
19 {
20 result += i;
(gdb) break 16 <-------------------- 設定斷點,在源程式第 16 行處。
Breakpoint 1 at 0x8048496: file tst.c, line 16.
(gdb) break func <-------------------- 設定斷點,在函式 func() 入口處。
Breakpoint 2 at 0x8048456: file tst.c, line 5.
(gdb) info break <-------------------- 檢視斷點資訊。
Num Type Disp Enb Address What
1 breakpoint keep y 0x08048496 in main at tst.c:16
2 breakpoint keep y 0x08048456 in func at tst.c:5
(gdb) r <--------------------- 執行程式, run 命令簡寫
Starting program: /home/hchen/test/tst
Breakpoint 1, main () at tst.c:17 <---------- 在斷點處停住。
17 long result = 0;
(gdb) n <--------------------- 單條語句執行, next 命令簡寫。
18 for(i=1; i<=100; i++)
(gdb) n
20 result += i;
(gdb) n
18 for(i=1; i<=100; i++)
(gdb) n
20 result += i;
(gdb) c <--------------------- 繼續執行程式, continue 命令簡寫。
Continuing.
result[1-100] = 5050 <---------- 程式輸出。
Breakpoint 2, func (n=250) at tst.c:5
5 int sum=0,i;
(gdb) n
6 for(i=1; i<=n; i++)
(gdb) p i <--------------------- 列印變數 i 的值, print 命令簡寫。
$1 = 134513808
(gdb) n
8 sum+=i;
(gdb) n
6 for(i=1; i<=n; i++)
(gdb) p sum
$2 = 1
(gdb) n
8 sum+=i;
(gdb) p i
$3 = 2
(gdb) n
6 for(i=1; i<=n; i++)
(gdb) p sum
$4 = 3
(gdb) bt <--------------------- 檢視函式堆疊。
#0 func (n=250) at tst.c:5
#1 0x080484e4 in main () at tst.c:24
#2 0x400409ed in __libc_start_main () from /lib/libc.so.6
(gdb) finish <--------------------- 退出函式。
Run till exit from #0 func (n=250) at tst.c:5
0x080484e4 in main () at tst.c:24
24 printf("result[1-250] = %d /n", func(250) );
Value returned is $6 = 31375
(gdb) c <--------------------- 繼續執行。
Continuing.
result[1-250] = 31375 <---------- 程式輸出。
Program exited with code 027. <-------- 程式退出,除錯結束。
(gdb) q <--------------------- 退出 gdb 。
hchen/test>
好了,有了以上的感性認識,還是讓我們來系統地認識一下 gdb 吧。
使用 GDB
————
一般來說 GDB 主要除錯的是 C/C++ 的程式。要除錯 C/C++ 的程式,首先在編譯時,我們必須要把除錯資訊加到可執行檔案中。使用編譯器( cc/gcc/g++ )的 -g 引數可以做到這一點。如:
> cc -g hello.c -o hello
> g++ -g hello.cpp -o hello
如果沒有 -g ,你將看不見程式的函式名、變數名,所代替的全是執行時的記憶體地址。當你用 -g 把除錯資訊加入之後,併成功編譯目的碼以後,讓我們來看看如何用 gdb 來除錯他。
啟動 GDB 的方法有以下幾種:
1 、 gdb <program>
program 也就是你的執行檔案,一般在當然目錄下。
2 、 gdb <program> core
用 gdb 同時除錯一個執行程式和 core 檔案, core 是程式非法執行後 core dump 後產生的檔案。
3 、 gdb <program> <PID>
如果你的程式是一個服務程式,那麼你可以指定這個服務程式執行時的程式 ID 。 gdb 會自動 attach 上去,並除錯他。 program 應該在 PATH 環境變數中搜尋得到。
GDB 啟動時,可以加上一些 GDB 的啟動開關,詳細的開關可以用 gdb -help 檢視。我在下面只例舉一些比較常用的引數:
-symbols <file>
-s <file>
從指定檔案中讀取符號表。
-se file
從指定檔案中讀取符號表資訊,並把他用在可執行檔案中。
-core <file>
-c <file>
除錯時 core dump 的 core 檔案。
-directory <directory>
-d <directory>
加入一個原始檔的搜尋路徑。預設搜尋路徑是環境變數中 PATH 所定義的路徑。
GDB 的命令概貌
———————
啟動 gdb 後,就你被帶入 gdb 的除錯環境中,就可以使用 gdb 的命令開始除錯程式了, gdb 的命令可以使用 help 命令來檢視,如下所示:
/home/hchen> gdb
GNU gdb 5.1.1
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-suse-linux".
(gdb) help
List of classes of commands:
aliases -- Aliases of other commands
breakpoints -- Making program stop at certain points
data -- Examining data
files -- Specifying and examining files
internals -- Maintenance commands
obscure -- Obscure features
running -- Running the program
stack -
相關文章
- linux 下GDB除錯Linux除錯
- Linux—gdb除錯簡單實現Linux除錯
- linux下用gdb除錯c程式Linux除錯C程式
- Linux核心使用gdb除錯Linux除錯
- gdb除錯除錯
- Linux中使用GDB除錯程式Linux除錯
- GDB除錯MySQL除錯MySql
- gdb除錯命令除錯
- GDB除錯指令除錯
- Linux技術——gdb除錯基礎Linux除錯
- Linux GDB 程式除錯工具使用詳解Linux除錯
- GDB 除錯程式碼除錯
- gdb除錯多程式除錯
- GDB除錯彙總除錯
- 用GDB除錯程式除錯
- GDB多程式除錯除錯
- gdb除錯快速上手除錯
- gdb除錯多程序除錯
- gdb除錯總結除錯
- 介紹 GDB 除錯 Go除錯Go
- GDB除錯命令詳解除錯
- C語言——gdb除錯C語言除錯
- 用GDB除錯程式(六)除錯
- GDB除錯使用記錄除錯
- Codeblocks和gdb除錯BloC除錯
- gdb高階除錯方法高階除錯
- 使用 gdb 工具除錯 Go除錯Go
- gdb除錯coredump檔案除錯
- gdb高階除錯命令高階除錯
- python如何單步除錯Python除錯
- 利用QEMU+GDB搭建Linux核心除錯環境Linux除錯
- linux c之gdb常用斷點除錯總結Linux斷點除錯
- linux下gdb如何處理coredump錯誤Linux
- C編譯: 使用gdb除錯編譯除錯
- C 編譯: 使用 gdb 除錯編譯除錯
- GDB程式碼除錯與使用除錯
- 使用 GDB 除錯多程式程式除錯
- 使用gdb編譯除錯mysql編譯除錯MySql