GDB基本用法

一、编译运行

1.1、程序带调试信息

    使用额外的 '-g' 选项来编译程序:

gcc -g eg.c -o eg


1.2 运行 gdb

装载程序

方法一:在 shell 中,可以使用 'gdb' 命令并 指定程序名 作为参数来运行 gdb

gdb + 程序名

方法二:在 gdb 中,可以使用 file 命令来装入要调试的程序

(gdb)file + 文件名

两种方式都假设您是在包含程序的目录中执行命令。

命令               缩写                            功能

run                   r                             运行程序

continue          c (fg)           继续执行直到下一次断点

until +行号       u                       继续执行直到指定行

每次执行结束重新输入 run 可重新执行

参数设置

装入程序之后,可以用 gdb 命令 'run + 运行参数' 来启动程序。

run + 参数                    # 启动程序 或者  restart 

或者在执行run前 通过 set args + 运行参数 设置

set args + 运行参数

run

如果一切正常,程序将执行到结束(要是不想让其结束要提前设置断点),此时 gdb 将重新获得控制。

1.3 退出gdb

quit [退出条件]                     # 退出gdb

二、调试命令

2.1 设置断点

普通断点

命令        缩写        用法1                用法2                                        用法3                                

break       b            b + 函数名         b + 行号(文件名:行号)        b + *地址(*0x7c00)      

查看断点

info breakpoints

条件断点

(1) break + .. + if  条件

(2) condition 断点号 条件

根据规则设置断点

rbreak printNum*            #所有以printNum开头的函数都设置了断点

rbreak .                           #对所有函数设置断点

rbreak test.c: .                 #对test.c中的所有函数设置断点

rbreak test.c:^print         #对以print开头的函数设置断点

临时断点

断点只想生效一次,可以设置临时断点

tbreak test.c:l0  #在第10行设置临时断点

删除断点

clear                                                #删除当前行所有breakpoints

clear function                                  #删除函数名为function处的断点

clear filename:function                    #删除文件filename中函数function处的断点

clear lineNum                                  #删除行号为lineNum处的断点

clear filename:lineNum                 #删除文件filename中行号为lineNum处的断点

delete                                              #删除所有breakpoints,watchpoints和catchpoints

delete bnum                                     #删除断点号为bnum的断点

跳过多次设置断点

ignore +  断点号  +   忽略次数

Num    Type          Disp Enb Address            What

1      breakpoint    keep y  0x00000000004005e8 in printNum2 at test.c:16  ignore next 30 hits

根据表达式值变化产生断点

需要观察某个值或表达式,知道它什么时候发生变化

watch + 变量或者表达式的值

watch + 条件

让程序继续运行,如果值发生变化,则会打印相关内容,如:

Hardware watchpoint 2: a

Old value = 12

New value = 11

其  info breakpoints 信息

Num      Type                  Disp         Enb             Address          What

2           hw watchpoint      keep         y                      a               breakpoint already hit 11 times

禁用或启动断点

有些断点暂时不想使用,但又不想删除,可以暂时禁用或启用。例如:

disable                              #禁用所有断点

disable bnum                    #禁用标号为bnum的断点

enable                               #启用所有断点

enable bnum                     #启用标号为bnum的断点

enable delete bnum          #启动标号为bnum的断点,并且在此之后删除该断点


2.2 单步执行

命令        缩写        用法                                                                             用法1

next           n          执行一行源程序代码,不进入函数                             n + 步数

step           s          执行一行源程序代码,单步跟踪进入函数                  s + 步数

nexti           ni          执行一行汇编程序代码,不进入函数                        ni + 步数

stepi           si          执行一行汇编程序代码,单步跟踪进入函数             si + 步数

finish                       跳过该函数,继续后面的执行

2.3 查看变量

在查看变量之前,需要先启动调试并设置断点

命令     缩写          用法1                                          用法2                      

print       p          p + 变量名                                    p + 数组名      

 命令     缩写            用法3                                          用法4                            用法5

print       p               p + 文件名(函数名) :: 变量名        p + *(地址或指针)        p + *指针@数量

环境变量$

可表示上一个变量,假设此时有一个链表linkNode,它有next成员代表下一个节点,则可使用下面方式不断打印链表内容:

(gdb) p *linkNode            #显示linkNode节点内容

(gdb) p *$.next                #显示linkNode节点下一个节点的内容

如果想要查看前面数组的内容,你可以将下标一个一个累加,还可以定义一个类似UNIX环境变量,这样就不需要每次修改下标去打印,例如:

(gdb) set $index=0

(gdb) p b[$index++]

$11 = 1

(gdb) p $pc                                     # 当前指令

2.4 打印格式

x 按十六进制格式显示变量。        d 按十进制格式显示变量。            o 按八进制格式显示变量。

t 按二进制格式显示变量。            c 按字符格式显示变量。                f 按浮点数格式显示变量。

(gdb) p/x c

2.5 查看内存

命令              用法                                       用法1              

   x               查看内存内容         x / [n内存单元数] [f格式] [u单元长度] addr地址     

格式

t 二进制               x 十六进制                d 十进制            o 八进制                        u 十进制无符号

c 字符                 s 字符串                    f 浮点数             z 零拓展十六进制          a  地址单元的长度     

i 指令地址格式     

单元长度

b 字节            h  双字节                w  四字节            g 八字节

默认是4个byte

查看堆栈信息

x /8x $esp


2.6 自动显示变量

程序断住时,就显示某个变量的值

命令                      用法                           用法1

display               查看变量名             display + 变量名

清除变量

delete display num             # num变量的编号,不带num时清除所有变量

去使能

disable display num          # num为变量的编号,不带num时去使能所有

2.4 info

命令                              缩写                    功能

info  breakpoints           i  b                  查看已设置断点

info  watchpoints           i  wat              查看已设置观测点

info registers                 i  r                   查看所有寄存器

info skip                        i  s                   查看所有需要跳过的函数 

info local                       i lo                    查看当前函数局部变量

help  info可查看更多

2.7 skip

命令                                                   功能

skip + 函数名                    单步执行时跳过一些不想关注的函数

skip  file + 文件名             单步执行时跳过某个文件的代码

skip delete [num]              删除对应编号skip

skip enable [num]             使能对应编号skip

skip disable [num]             去使能对应编号skip

三、查看源码

3.1 list

list 列出指定行附件的源码

命令            缩写                用法1            用法2                用法3                                        用法4

list                  l                    l + 行号        l + 函数名          l 行号 , 行号(指定范围)      l + 文件名:行号

set listsize 20            # 显示 每次显示的行数

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

推荐阅读更多精彩内容

  • 程序调试的基本思想是“分析现象->假设错误原因->产生新的现象去验证假设”这样一个循环过程,根据现象如何假设错误原...
    Manfred_Zone阅读 16,498评论 0 26
  • 概述 GDB是一个由GNU开源组织发布的、UNIX/Linux操作系统下的、基于命令行的、功能强大的程序调试工具。...
    咕咕鷄阅读 20,683评论 0 8
  • 调试前准备 获取进程的内核转储(core dump) why:最大好处是,其保存了问题发生时的状态。记录进程当前状...
    Gitlusen阅读 915评论 0 2
  • 放假了,最开心的事莫过于早上开机时。 “老师,祝您春节快乐!” “老师,春节愉快!虽然发的有些晚,但是心意不变噢!...
    魏喜梅wxm阅读 547评论 12 11
  • 点进来你就输了,单身狗没有乐趣 点进来你就输了,单身狗没有乐趣 点进来你就输了,单身狗没有乐趣 言归正传,单身狗有...
    土_豆_粉阅读 306评论 8 6