gdb常用命令的用法

原文地址:

http://www.cnblogs.com/hanxi/archive/2012/06/14/2549268.html



用於調試的示例程序:

複製代碼
 1 #include <stdio.h>
 2 
 3 int sum(int a, int b)
 4 {
 5     int result;
 6     result = a + b;
 7     return result;
 8 }
 9 
10 int main(int argc, char ** argv)
11 {
12     if (argc != 3)
13     {
14         printf("請輸入2個數字參數,用空格分開");
15         return -1;
16     }
17     int a = *argv[1]-'0';
18     int b = *argv[2]-'0';
19     int re = sum(a,b);
20     printf("%d + %d = %d",a,b,re);
21     return 0;
22 }
複製代碼

 

  這個程序很簡單,只做了個加法運算。現在我們開始調試程序了。

  1.編譯生成。     

  IDE中分Debug和Release版本,那麼在Linux我們一般編譯這個文件使用:

    gcc -o testgdb testgdb.c 

    這就相當於IDE中的Release版本的編譯生成工作了,那麼怎麼編譯出Debug版本呢?這樣,只需要添加 -g 命令就行:

    gcc -o testgdb testgdb.c -g

  2.進入調試狀態,即進入dgb。 

    進入gdb有兩種方式,一種是直接輸入命令gdb。另一種是在gdb後面加上第一步編譯好的文件名。進入到gdb調試狀態後可以看到

GNU gdb (GDB) 7.0.1-debian
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.

(gdb)

    如果使用的是第一種方式,那麼進入後得繼續使用file命令來打開待調試的文件:(gdb)file testgdb

    會給出如下提示信息:

    Reading symbols from /home/hanxi/cpp/testgdb/testgdb...done.

  3.調試程序。   

    常用命令:

GDB常用命令 格式 含義 簡寫
list List [開始,結束] 列出文件的代碼清單 l
prit Print 變量名 打印變量內容 p
break Break [行號或函數名] 設置斷點 b
continue Continue [開始,結束] 繼續運行 c
info Info 變量名 列出信息 i
next Next 下一行 n
step Step 進入函數(步入) S
display Display 變量名 顯示參數  
file File 文件名(可以是絕對路徑和相對路徑) 加載文件  
run Run args 運行程序 r

 

    接下來對一個一個命令進行測試。(注:(gdb)後面是輸入的命令和參數)

       (1):  (gdb)run 2 3    

    表示執行調試並傳入兩個參數2,3

    運行結果:

Starting program: /home/hanxi/cpp/testgdb/testgdb 2 3
2 + 3 = 5
Program exited normally. 

    這樣就出現了計算結果,因爲沒有設置斷點,所以就會執行完程序。下面就是使用設置斷點的命令了。

       (2):    (gdb)b 4   

    表示在第4行設置斷點,gdb給出以下提示說明設置斷點成功

Breakpoint 1 at 0x80483ca: file testgdb.c, line 4.

    設置完斷點後,我們再來運行程序,執行run命令。出現下面的提示信息:

Starting program: /home/hanxi/cpp/testgdb/testgdb 2 3

Breakpoint 1, sum (a=2, b=3) at testgdb.c:6
6 result = a + b;

    這樣它停留在第6行了。我們怎麼來繼續執行了,使用c命令,相當於VS中的快捷鍵F5

    (3):     (gdb)c   

    繼續執行程序,gdb給出以下提示信息

Continuing.
2 + 3 = 5
Program exited normally.

    這裏又把程序執行完了,因爲前面只設置一個斷點。那麼我們怎麼知道設置了多少個斷點呢?使用info break命令就能滿足

    (4):     (gdb)info break   

    gdb給出了下面的提示信息: 

Num Type Disp Enb Address What
2 breakpoint keep y 0x080483ca in sum at testgdb.c:4
breakpoint already hit 1 time

    這信息提示我們,已經在第4行設置了一個斷點,接下來就是去除斷點的問題了,我們怎麼把剛纔的斷點刪除掉呢?在VS6.0是重複點工具欄的鼠型圖標,在VS2010是點擊每行的行首。在這裏,我們也可以使用命令簡單的刪除或者禁用斷點。刪除斷點的命令是delete b,禁用斷點的命令是disable b。推薦使用disable b 命令。恢復禁用的斷點的命令是enable b。這些命令後面可以帶參數來說明第幾個斷點(是第幾個不是第幾行)。如:

    (5):     (gdb)disable b   

    然後執行run命令後就不會斷點了,接着使用enable b命令後再使用run命令,這樣又有了斷點。有時候我們斷點了就需要查看某個變量的值,那麼使用什麼命令查看變量的值和設置變量的值呢?答案是使用display或者是p

    (6):     (gdb)display result   

    這個效果在IDE中也有對應的:display相當於添加監聽變量,每一次run後都會給出result的值。而print就對應着IDE中的鼠標停留時顯示變量的值。

    (7):     (gdb)s   

    這是步入命令step,同樣也有步過命令next(簡寫爲n)。

  好吧,上面說的一些基本命令用來調試一些小代碼差不多夠用了,剛百度搜索了下,百度文庫中有個不錯的詳細教程,如果有想深入的朋友可以進去Linux下GDB教程看看。 如果平時使用的時候忘記了命令也可以使用help命令來查看幫助信息,會提示一些命令的用法,只可惜是英語的,一般也能將就的看懂,實在看不懂的可以把可能的命令測試就ok了。下面是輸入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 -- Examining the stack
status -- Status inquiries
support -- Support facilities
tracepoints -- Tracing of program execution without stopping the program
user-defined -- User-defined commands

Type "help" followed by a class name for a list of commands in that class.
Type "help all" for the list of all commands.
Type "help" followed by command name for full documentation.
Type "apropos word" to search for commands related to "word".
Command name abbreviations are allowed if unambiguous.

        上面的提示是:比如說你想查看斷點(breakpoints)的信息可以使用help breakpoints命令。希望各位看了這文章的朋友們可以學到點東西!歡迎拍磚!

作者:涵曦涵曦的技術博客 - 博客園
微博:t.qq.com/hanxi1203 
出處:hanxi.cnblogs.com 
GitHub:github.com/hanxi
文章版權歸本人所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章