gdb 基礎(chǔ)命令

概述

GDB是GNU發(fā)布的一個(gè)調(diào)試工具掀泳。gdb 是基于UNIX/Linux 命令行的哆档,功能強(qiáng)大,可與windows平臺(tái)的visual studio 媲美。

基本命令

GDB的命令非常多鬼店,但我們只要掌握幾個(gè)常見(jiàn)的,就可以滿足日城辏基本程序的調(diào)試需求妇智。

命令 解釋 示例
file <文件名> 加載被調(diào)試的可執(zhí)行文件
如果執(zhí)行g(shù)db與被調(diào)試的程序不在同個(gè)目錄滥玷,則需要帶上路徑
(gdb) file gdb_sample
l <行號(hào)> List 的縮寫,打印源碼
在gcc/g++ 編譯程序時(shí)巍棱,需要加上-g 選項(xiàng)
(gdb) l 1
r Run 的縮寫惑畴,運(yùn)行程序 (gdb) r
c Continue 的縮寫,繼續(xù)執(zhí)行程序航徙,直到下一個(gè)斷點(diǎn)或程序結(jié)束 (gdb) c
b <行號(hào)>
b <函數(shù)名稱>
Breakpoint 的縮寫如贷,設(shè)置斷點(diǎn) (gdb) b 8
(gdb) b main
d <斷點(diǎn)編號(hào)> Delete 的縮寫,刪除斷點(diǎn) (gdb) d 2
s Step Into (單步跟蹤進(jìn)入)
執(zhí)行一行源程序代碼到踏,如果此行代碼有函數(shù)調(diào)用杠袱,則進(jìn)入該函數(shù)
(gdb) s
n Step Over (單步跟蹤)
執(zhí)行一行源程序代碼,如果此行代碼有函數(shù)調(diào)用窝稿,也一并執(zhí)行
(gdb) n
p <變量名稱> Print 的縮寫楣富, 打印變量的值 (gdb) p i
bt Backtrace 的縮寫,查看堆棧信息 (gdb) bt
q Quit 的縮寫伴榔,退出gdb 調(diào)試環(huán)境 (gdb) q
help <命令名稱> 可以查看各個(gè)命令的用法 (gdb) help r

舉例

先看一個(gè)簡(jiǎn)單的程序

#include <stdio.h>

int sum(int n)
{
    int sum=0, i;
    for (i=0; i<n; ++i)
    {
        sum+=i;
    }
    return sum;
}

int main(int argc, char ** argv)
{
    int i=1;
    ++i;

    int result=0;
    result=sum(i);

    printf("sum[%d]\n", result);
    return 0;
}

將上面代碼保存到 gdb_sample.c文件纹蝴,然后用 gcc 編譯:

gcc gdb_sample.c -g -o gdb_sample 

上面的命令,用參數(shù) -g將源代碼信息編譯到可執(zhí)行文件中踪少,如果不指定塘安,將無(wú)法在 gdb 里面查看代碼,可以看看使用 -g 和不使用秉馏,編譯后可執(zhí)行文件的大邪业:

[huanghaibin@huanghaibin 17:10:17 ] gcc gdb_sample.c -g -o gdb_sample
[huanghaibin@huanghaibin 17:19:35 ] gcc gdb_sample.c -o gdb_sample_2   
[huanghaibin@huanghaibin 17:19:54 ] ll gdb_sample gdb_sample_2
-rwxrwxr-x 1 huanghaibin 8.4K 3月   9 17:19 gdb_sample_2
-rwxrwxr-x 1 huanghaibin 9.7K 3月   9 17:19 gdb_sample

可以用 gdb gdb_sample 直接進(jìn)入調(diào)試環(huán)境,也可以先啟動(dòng)gdb萝究,再打開可執(zhí)行文件:

GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-80.el7
Copyright (C) 2013 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 "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) file gdb_sample
Reading symbols from /data1/hellerhuang/test_c/gdb_sample...done.
(gdb) 

上面表示可執(zhí)行文件已經(jīng)加載成功免都,(gdb) 是gdb內(nèi)部命令引導(dǎo)符,等待用戶輸入命令
下面使用l 命令來(lái)查看源碼帆竹,可以指定行號(hào)绕娘,回車可以繼續(xù)往下查看:

(gdb) l 1
1       /*======================================================================
2           @file gdb_sample.c
3           @brief 
4           @author huanghaibin
5           @version 1.0
6           @date 2018-03-09
7           @copyright Copyright (c) 2015 Tencent Inc. All Rights Reserved.
8         ======================================================================*/
9
10      #include <stdio.h>
(gdb) 
11
12      int sum(int n)
13      {
14          int sum=0, i;
15          for (i=0; i<n; ++i)
16          {
17              sum+=i;
18          }
19          return sum;
20      }
(gdb) 
21
22      int main(int argc, char ** argv)
23      {
24          int i=1;
25          ++i;
26
27          int result=0;
28          result=sum(i);
29
30          printf("sum[%d]\n", result);
(gdb) 
31          return 0;
32      }
33
(gdb) 

下面使用r 命令執(zhí)行程序,因?yàn)闆](méi)有設(shè)置斷點(diǎn)栽连,所以程序執(zhí)行到程序結(jié)束:

Starting program: /data1/hellerhuang/test_c/gdb_sample 
sum[1]
[Inferior 1 (process 6401) exited normally]
Missing separate debuginfos, use: debuginfo-install glibc-2.17-157.tl2.2.x86_64
(gdb) 

下面使用b 設(shè)置斷點(diǎn)险领,在24行int i=1;設(shè)置斷點(diǎn),后執(zhí)行r秒紧,再進(jìn)入單步調(diào)試n s

(gdb) b 24
Breakpoint 1 at 0x40056d: file gdb_sample.c, line 24.     // 設(shè)置斷點(diǎn)
(gdb) r
Starting program: /data1/hellerhuang/test_c/gdb_sample 

Breakpoint 1, main (argc=1, argv=0x7fffffffe548) at gdb_sample.c:24   // 程序中斷在24行
24          int i=1;
(gdb) n
25          ++i;
(gdb) s
27          int result=0;
(gdb) 

上面程序先執(zhí)行到斷點(diǎn)處(24行)绢陌,然后單步調(diào)試,對(duì)于非函數(shù)熔恢,ns 執(zhí)行結(jié)果一樣
下面在28行設(shè)置第二個(gè)斷點(diǎn)脐湾,用明令c直接運(yùn)行到第二處斷點(diǎn),對(duì)比ns 執(zhí)行函數(shù)的結(jié)果:

(gdb) b 28                                                       // 設(shè)置第二處斷點(diǎn)
Breakpoint 2 at 0x40057f: file gdb_sample.c, line 28.
(gdb) c                                                          // 直接運(yùn)行到第二個(gè)斷點(diǎn)
Continuing.

Breakpoint 2, main (argc=1, argv=0x7fffffffe548) at gdb_sample.c:28
28          result=sum(i);
(gdb) n                                                         // 執(zhí)行整個(gè)函數(shù)
30          printf("sum[%d]\n", result);
(gdb) p result                                                  // 打印變量
$1 = 1
(gdb) r                                                         // 重新運(yùn)行程序
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /data1/hellerhuang/test_c/gdb_sample 

Breakpoint 1, main (argc=1, argv=0x7fffffffe548) at gdb_sample.c:24
24          int i=1;
(gdb) c
Continuing.

Breakpoint 2, main (argc=1, argv=0x7fffffffe548) at gdb_sample.c:28
28          result=sum(i);
(gdb) s                                                       // 單步調(diào)試進(jìn)入函數(shù)
sum (n=2) at gdb_sample.c:14
14          int sum=0, i;
(gdb) bt                                                      // 查看堆棧信息
#0  sum (n=2) at gdb_sample.c:14
#1  0x0000000000400589 in main (argc=1, argv=0x7fffffffe548) at gdb_sample.c:28
(gdb) finish
Run till exit from #0  sum (n=2) at gdb_sample.c:14
0x0000000000400589 in main (argc=1, argv=0x7fffffffe548) at gdb_sample.c:28
28          result=sum(i);
Value returned is $2 = 1
(gdb) n
30          printf("sum[%d]\n", result);
(gdb) p result
$3 = 1
(gdb) q
A debugging session is active.

        Inferior 1 [process 10635] will be killed.

Quit anyway? (y or n) y

上面bt 可查看程序的堆棧信息叙淌,然后通過(guò)finish命令執(zhí)行完該函數(shù)秤掌,最后用命令q退出調(diào)試愁铺。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市闻鉴,隨后出現(xiàn)的幾起案子茵乱,更是在濱河造成了極大的恐慌,老刑警劉巖孟岛,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓶竭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡渠羞,警方通過(guò)查閱死者的電腦和手機(jī)在验,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)堵未,“玉大人腋舌,你說(shuō)我怎么就攤上這事∩罚” “怎么了块饺?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)雌芽。 經(jīng)常有香客問(wèn)我授艰,道長(zhǎng),這世上最難降的妖魔是什么世落? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任淮腾,我火速辦了婚禮,結(jié)果婚禮上屉佳,老公的妹妹穿的比我還像新娘谷朝。我一直安慰自己,他們只是感情好武花,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布圆凰。 她就那樣靜靜地躺著,像睡著了一般体箕。 火紅的嫁衣襯著肌膚如雪专钉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天累铅,我揣著相機(jī)與錄音跃须,去河邊找鬼。 笑死娃兽,一個(gè)胖子當(dāng)著我的面吹牛菇民,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼玉雾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了轻要?” 一聲冷哼從身側(cè)響起复旬,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎冲泥,沒(méi)想到半個(gè)月后驹碍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凡恍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年志秃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嚼酝。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浮还,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出闽巩,到底是詐尸還是另有隱情钧舌,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布涎跨,位于F島的核電站洼冻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏隅很。R本人自食惡果不足惜撞牢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望叔营。 院中可真熱鬧屋彪,春花似錦、人聲如沸绒尊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)垒酬。三九已至砰嘁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間勘究,已是汗流浹背矮湘。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留口糕,地道東北人缅阳。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親十办。 傳聞我的和親對(duì)象是個(gè)殘疾皇子秀撇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 程序調(diào)試的基本思想是“分析現(xiàn)象->假設(shè)錯(cuò)誤原因->產(chǎn)生新的現(xiàn)象去驗(yàn)證假設(shè)”這樣一個(gè)循環(huán)過(guò)程,根據(jù)現(xiàn)象如何假設(shè)錯(cuò)誤原...
    Manfred_Zone閱讀 16,508評(píng)論 0 26
  • 作者: liigo原文鏈接: http://blog.csdn.net/liigo/archive/2006/01...
    wuqingyi閱讀 1,815評(píng)論 0 4
  • 概述 GDB是一個(gè)由GNU開源組織發(fā)布的向族、UNIX/Linux操作系統(tǒng)下的呵燕、基于命令行的、功能強(qiáng)大的程序調(diào)試工具件相。...
    咕咕鷄閱讀 20,740評(píng)論 0 8
  • 一.GDB命令詳解 在linux程序調(diào)成中g(shù)db是最常用的工具再扭。 關(guān)于gdb的說(shuō)明可以在linux下直接 man ...
    pengzhixiang閱讀 56,862評(píng)論 1 10
  • 把所有排斥的都收納回心內(nèi),收納完畢的那一天夜矗,就是圓滿的那一日泛范。兒子的個(gè)性,其中一個(gè)特質(zhì)就是暴躁紊撕,平時(shí)說(shuō)話喜歡挑刺罢荡,...
    上主之子太陽(yáng)花閱讀 532評(píng)論 0 0