GDB入门教程

1.GDB简介

GDB(The GNU Debugger),是GNU开源组织发布的一个强大的UNIX程序调试工具。如果你是在 UNIX平台下开发软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试工具拥有更强大的功能。同时GDB也具有例如DDD调试器,全称是Data Display Debugger这样的图形化调试端。

一般来说,GDB主要完成下面四个方面的功能: (1)启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。 (2)可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式) (3)当程序被停住时,可以检查此时你的程序中所发生的事。 (4)动态的改变程序的执行环境。

GDB强大的功能依赖于繁杂的命令,若想精通GDB和熟练操作所有GDB命令绝非易事。当然,在实际的代码调试过程中,没有必要熟练掌握GDB所有命令,可以快速掌握GDB常见的命令来应付大部分的调试工作。推荐一个快速的GDB上手教程: GDB十分钟教程

2.基本用法

GDB通常和gcc命令一起使用,编译选项加入-g才可使可执行文件处于debug模式。

gdb命令格式:

gdb [-help] [-nx] [-q] [-batch] [-cd=dir] [-f] [-b bps] [-tty=dev]
    [-s symfile] [-e prog] [-se prog] [-c core] [-x cmds] [-d dir]
    [prog[core|procID]]

常用的操作:

gdb [可执行文件]:选中可执行程序,进入gdb的debug模式;
    (gdb) b(breakpoint):用法:b 函数名 :对此函数进行中断 ;b 文件名:行号;
    (gdb) run:启动程序,运行至程序的断点或者结束;
    (gdb) l(list):用法:l funcname,制定函数的源码。或者l linenum,显示指定行周围的源码。或l -,显示当前行前面的源码。或l,显示当前行后面的源码;
    (gdb) s(step):进入函数,逐语句运行;
    (gdb) n(next):不进入函数,逐过程运行;
    (gdb) c(continue):继续运行,跳至下一个断点;
    (gdb) p(print):打印显示变量值;
    (gdb) set variable=value,为变量赋值;
    (gdb) kill:终止调试的程序;
    (gdb) h(help):列出gdb详细命令帮助列表;
    (gdb) clear filename.c:30:清除30行处的断点;
    (gdb) info break:显示断点信息;
    (gdb) delete 断点编号:断点编号是info break 后显示出来的;
    (gdb) bt(backtrace):回溯到段出错的位置;
    (gdb) frame 帧号:帧号是bt命令产生的堆栈针;
    (gdb) q:退出;

3.FAQ

3.1gdb如何分屏显示源代码

(1)gdb模式下使用layout src 或者大于号 >。 使用示例:

layout src

(2)还可以在进入gdb时加入参数-tui达到同样效果。 使用示例:

gdb -tui

分屏后的效果如下图所示:

3.2如何退出gdb分屏模式

使用快捷键Ctrl+x+a切换。

3.3GDB文本界面(Text User Interface(TUI))介绍

3.3.1 打开TUI模式

方法一: 使用gdbtui 或者gdb -tui开始一个调试

$ gdbtui -q sample
(gdb) ....

-q:静默模式打开gdbtui,不打印介绍与版权信息。

方法二: 使用快捷键 ctrl+x ctrl+a or ctrl+x+a相互切换。

方法三:使用大于号>切换到TUI模式。

方法四:gdb模式下,使用layout next|prev|src|asm|regs|cmd切换到TUI模式。

3.3.2TUI模式下有4个窗口

command 命令窗口:可以键入调试命令,这也是默认的窗口; source 源代码窗口:显示当前行,断点等信息; assembly:汇编代码窗口; register:寄存器窗口;

除command窗口外,其他三个窗口不可同时显示。其可用 layout 命令来进行选择自己需要的窗口。可参见 help layout .

3.3.3gdbtui相关的其他命令

(1)layout 用以修改窗口布局。

layout next 
Display the next layout.  

layout prev 
Display the previous layout.  

layout src 
Display the source window only.  

layout asm 
Display the assembly window only.  

layout split 
Display the source and assembly window.  

layout regs 
Display the register window together with the source or assembly window. 

(2)winheight 调整各个窗口的高度。help winheight可以查看winheight的具体用法。

Usage: winheight <win_name> [+ | -] <#lines>
Window names are:
src  : the source window
cmd  : the command window
asm  : the disassembly window
regs : the register display

Change the height of the window name by count lines. Positive counts increase the height, while negative counts decrease it.

使用示例:

 winheight src +5
 winheight src -4

(3)focus 用法:focus next | prev | src | asm | regs | split

我们可以通过focus命令来调整焦点位置,默认情况下是在src窗口,通过focus next命令, 焦点就移到cmd窗口了,这时候就可以像以前一样,通过方向键来切换到上一条命令和下一条命令。

在默认设置下,方向键和PageUp PageDn 都是用来控制gdbtui的src窗口的,所以,我们常用的上下键用来显示前一条命令和后一条命令的功能就没有了, 不过这个时候我们可以focus cmd将焦点转移到命令窗口,再次来获取这个功能。

当我们通过方向键调整了gdbtui 的src 窗口以后,可以通过update命令重新把焦点定位到当前执行的代码上。

help focus可用于查看focus的用法。

src  : the source window
asm  : the disassembly window
regs : the register display
cmd  : the command window

焦点不在src窗口以后,我们就不同通过方向键来浏览源码了。


参考文献

[1]在gdb中显示源码(gdbtui使用方法) [2]GDB的使用,重点讲解图像化 gdb -tui 方式

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 2016腾讯校园招聘模拟考试(2016.03.25)

    在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(Gray Code),请编写一个函数,使用递归的方法生成N位的格雷码。 ...

    Dabelv
  • Linux 命令(114)—— nl 命令

    nl(number line)命令用于计算文件的行号并将带有行号的内容输出到标准输出。相比于命令 cat -n,nl 可以对行号做比较多的显示设计,包括位数与是...

    Dabelv
  • 网易游戏技术岗在线编程题(一)

    小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 a.在接下来的一段时间内,他将会依次遇见n个怪物,每个怪物的防御力为b1,b2...

    Dabelv
  • Kotlin---类型判断与强转

    在java中使用instanceof来判断类型。而在Kotlin中,则是使用is来判断:

    None_Ling
  • 拆解业务问题的2个重要数据分析方法(附面试案例讲解)

    如图的树状逻辑相信大家已经见过许多回了。一般说明逻辑树的分叉时,都会提到“分解”和“汇总”的概念。

    朱小五
  • 干货 | 深度学习在携程攻略社区的应用

    ? 携程攻略社区是携程旗下的旅游攻略类社区,致力于为旅行者提供出行指南和资讯服务。依托携程2.5亿用户总量,社区日活跃用户超过500万,并汇集3000万条真实...

    携程技术
  • 命令模式

    一、简介 1、命令模式将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。 2、命令模式中的几个...

    用户1215536
  • HBase 的MOB压缩分区策略介绍

    HBase应用场景非常广泛;社区前面有一系列文章。大家可以到社区看看看;张少华同学本篇主要讲HBase的MOB压缩分区策略介绍,非常赞!大力推荐!

    大数据和云计算技术
  • Java核心(五)深入理解BIO、NIO、AIO

    导读:本文你将获取到:同/异步 + 阻/非阻塞的性能区别;BIO、NIO、AIO 的区别;理解和实现 NIO 操作 Socket 时的多路复用;同时掌握 IO ...

    Java中文社群_老王
  • vue使用canvas签名之移动端

    在一些项目业务中,经常会使用到画板,让用户自己去写/画一些东西做标示,比如说在线签电子合约、签名等,如果不用插件,那么如何使用h5的canvas画布来实现这一需...

    流眸

扫码关注云+社区

领取腾讯云代金券