[GDB] GDB的快速入门指南:安装、启动、断点、单步调试、恢复执行、查看变量

目录

hello.c
gcc 编译
安装GDB
启动GDB

断点
    设置断点
    查看断点
    清除断点
    启用与禁用断点
单步调试
恢复执行
查看变量

hello.c

#include <stdio.h>

int main(void)
{
    printf("Hello, world!\n");
    return 0;
}

gcc 编译

  • 在用gcc编译代码的时候,需要开启 -g 选项,提供调试用的信息;
  • gdb就是根据这些信息,来进行调试的;
anno@anno-m:~/Desktop$ ls
hello.c

anno@anno-m:~/Desktop$ gcc -g hello.c -o hello

anno@anno-m:~/Desktop$ ls
hello  hello.c

安装GDB

http://www.gdbtutorial.com/tutorial/how-install-gdb

$ sudo apt-get update
$ sudo apt-get install gdb
$ gdb -version
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.3) 7.7.1
Copyright (C) 2014 Free Software Foundation, Inc.

启动GDB

anno@anno-m:~/Desktop$ gdb hello

(gdb) run
Starting program: /home/anno/Desktop/hello 
Hello, world!
[Inferior 1 (process 2978) exited normally]
  • TUI模式,按组合键Ctrl+X+A切换
GDB 默认模式
GDB TUI模式

断点

设置断点

  • break 命令设置断点,简写b ;
  • break main ,在main()函数的入口处设置断点;
  • break 5,在源代码的第5行设置断点;
  • break hello.c:5 ,指定源码文件的代码第5行设置断点;
anno@anno-m:~/Desktop$ gdb hello

(gdb) b main
Breakpoint 1 at 0x400531: file hello.c, line 5.
(gdb) r
Starting program: /home/anno/Desktop/hello 

Breakpoint 1, main () at hello.c:5
5       printf("Hello, world!\n");
(gdb) 

查看断点

  • info breakpoints,显示当前全部的断点,简写i b
(gdb) i b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000400531 in main at hello.c:5
    breakpoint already hit 1 time

清除断点

  • delete + 断点的数值标识符delete 1,删除第1个断点;
(gdb) b main
Breakpoint 1 at 0x400531: file hello.c, line 5.
(gdb) i b 
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000400531 in main at hello.c:5
(gdb) delete 1
(gdb) i b
No breakpoints or watchpoints.
  • clear + 函数名 、 +行号、+文件名:行号 ,清除断点main()函数处的断点:clear main 或者 clear 5 (本质是main函数的第一条语句所在);
(gdb) b main
Breakpoint 1 at 0x400531: file hello.c, line 5.
(gdb) i b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000400531 in main at hello.c:5
(gdb) clear main
Deleted breakpoint 1 
(gdb) i b
No breakpoints or watchpoints.
(gdb) 

启用与禁用断点

  • disable + 断点的数值标识符disable 1禁用第1个断点;
  • enable + 断点的数值标识符enable 1启用第1个断点;
  • Enb字段,表明断点是禁用(n)还是启用(y)的;
(gdb) b main
Breakpoint 1 at 0x400531: file hello.c, line 5.
(gdb) i b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000400531 in main at hello.c:5

(gdb) disable 1
(gdb) i b
Num     Type           Disp Enb Address            What
1       breakpoint     keep n   0x0000000000400531 in main at hello.c:5

(gdb) enable 1
(gdb) i b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000400531 in main at hello.c:5

单步调试

  • nextn越过 函数调用(函数会在背地里自己悄悄运行完),单步执行;
  • steps进入 函数体内部,单步执行;
(gdb) r
Starting program: /home/anno/Desktop/hello 

Breakpoint 1, main () at hello.c:5
5       printf("Hello, world!\n");
(gdb) n
Hello, world!
7       return 0;
(gdb) n
8   }
(gdb) n
__libc_start_main (main=0x40052d <main>, argc=1, argv=0x7fffffffdf38, 
    init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, 
    stack_end=0x7fffffffdf28) at libc-start.c:321
321 libc-start.c: No such file or directory.
(gdb) n
[Inferior 1 (process 3984) exited normally]

恢复执行

  • continuec,恢复执行,直到遇到下一个断点;
  • continue命令执行期间,按下CTRL-C瞬间停止;

查看变量

[GDB]检查变量:print、disp、call
https://www.jianshu.com/p/79671588f6d8

  • disp,使得每次有暂停,都会输出指定的变量的值;
  • printp,只显示一次变量的值;
  • 要求变量名在当前的域是可见的,比如某个变量i函数foo()局部变量,那么只有是在进入到这个函数的里面时才可以使用print i 或者 disp i,不然gdb也不知道i是谁;

更多功能

一、TUI模式,双开 汇编代码 窗口

  • 1、Ctrl + X + A 进入TUI模式;
  • 2、(gdb) list:显示10行C源码;
  • 3、(gdb) layout split :同时显示C源码以及汇编源码
  • 4、(gdb) info registers:显示使用到的寄存器信息;
TUI模式,双开 汇编代码 窗口
  • 5、(gdb) set disassembly-flavor intel :改变显示的汇编语法;
set disassembly-flavor intel
set disassembly-flavor att
  • 6、再次输入(gdb) layout split,使语法改变生效;
    显示Intel语法的汇编

参考资料

Beej's Quick Guide to GDB

http://beej.us/guide/bggdb/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • 程序调试的基本思想是“分析现象->假设错误原因->产生新的现象去验证假设”这样一个循环过程,根据现象如何假设错误原...
    Manfred_Zone阅读 16,397评论 0 26
  • 1、文件和目录: # cd /home 进入 '/home' 目录 # cd .. ...
    XDgbh阅读 1,927评论 0 1
  • 调试前准备 获取进程的内核转储(core dump) why:最大好处是,其保存了问题发生时的状态。记录进程当前状...
    Gitlusen阅读 869评论 0 2
  • 听了林老师的课程今天跟老公商量把我们家四宝给带回来上早教,同时要老公一起配合让家公家婆同意让四宝回来,四宝从小就是...
    海燕高空翱翔阅读 79评论 0 0
  • 曾经,有一份真挚的爱情摆在我面前,但是我没有珍惜,等到我失去的时候才后悔莫及,人世间最痛苦的事,莫过于此........
    开心的考拉阅读 154评论 0 1