GDB基础

GDB

Deugger

调试程序也需要借助专业的辅助工具,即调试器(Debugger),常用的调试器如下:

调试器名称 特 点
Remote Debugger Remote Debugger 是 VC/VS 自带的调试器,与整个IDE无缝衔接,使用非常方便。
WinDbg 大名鼎鼎的 Windows 下的调试器,它的功能甚至超越了 Remote Debugger,它还有一个命令行版本(cdb.exe),但是这个命令行版本的调试器指令比较复杂,不建议初学者使用。
LLDB XCode 自带的调试器,Mac OS X 下开发必备调试器。
GDB Linux 下使用最多的一款调试器,也有 Windows 的移植版。

GDB简介

网站 GDB: The GNU Project Debugger

GDB 的吉祥物为“弓箭鱼”。

GDB, the GNU Project debugger, allows you to see what is going on `inside' another program while it executes -- or what another program was doing at the moment it crashed.

GDB can do four main kinds of things (plus other things in support of these) to help you catch bugs in the act:

  • Start your program, specifying anything that might affect its behavior.
  • Make your program stop on specified conditions.
  • Examine what has happened, when your program has stopped.
  • Change things in your program, so you can experiment with correcting the effects of one bug and go on to learn about another.

Those programs might be executing on the same machine as GDB (native), on another machine (remote), or on a simulator. GDB can run on most popular UNIX and Microsoft Windows variants, as well as on Mac OS X.

GDB supports the following languages (in alphabetical order):

  • Ada
  • Assembly
  • C
  • C++
  • D
  • Fortran
  • Go
  • Objective-C
  • OpenCL
  • Modula-2
  • Pascal
  • Rust

Online GDB manuals

GDB User Manual (PDF)

​ Describes how to use GDB.

GDB Internals Manual (wiki only)

Technical details of the internals of GDB.

Download GDB

The most recent release (GDB 11.1):

You can download the most recent official release of GDB from either Project GNU's FTP server, or Red Hat's sources site:

http://ftp.gnu.org/gnu/gdb (mirrors)
ftp://sourceware.org/pub/gdb/releases/ (mirrors).

Linux 发行版中,有些默认安装有 GDB 调试器,但有些默认不安装。

判断当前 Linux 发行版是否安装有 GDB 的方法也很简单,就是在命令行窗口中执行 gdb -v 命令。

对于尚未安装 GDB 的 Linux 发行版,安装方法通常有以下 2 种:

  1. 直接调用该操作系统内拥有的 GDB 安装包,使用包管理器进行安装。此安装方式的好处是速度快,但通常情况下安装的并非 GDB 的最新版本;
  2. 前往 GDB 官网下载源码包,在本机编译安装。此安装方式的好处是可以任意选择 GDB 的版本,但由于安装过程需要编译源码,因此安装速度较慢。

(众多 Linux 发行版分为 2 个系列,分别为 RedHat 系列和 Debian 系列。其中 RedHat 系列代表 Linux 发行版有 RedHat、CentOS、Fedora 等,使用 yum 作为包管理器;Debian 系列有 Debian、Ubuntu 等,使用 apt 作为包管理器。)

  • RedHat 系列的 Linux 发行版sudo yum -y install gdb

  • Debian 系列的 Linux 发行版sudo apt -y install gdb

  • 源码安装

    GDB 版本都提供有 tar.gz 和 tar.xz 这 2 种格式的压缩包

    解压后,先创建build文件夹,并依次执行

     #mkdir build
     #cd build
     #../configure
     #make
     #sudo make install
    

GDB常用的调试命令

(gdb)help:查看命令帮助,具体命令查询在gdb中输入help + 命令,简写h

(gdb)run:重新开始运行文件(run-text:加载文本文件,run-bin:加载二进制文件),简写r

(gdb)start:单步执行,运行程序,停在第一执行语句

(gdb)list:查看原代码(list-n,从第n行开始查看代码。list+ 函数名:查看具体函数),简写l

(gdb)set:设置变量的值

(gdb)next:单步调试(逐过程,函数直接执行),简写n

(gdb)step:单步调试(逐语句:跳入自定义函数内部执行),简写s

(gdb)backtrace:查看函数的调用的栈帧和层级关系,简写bt

(gdb)frame:切换函数的栈帧,简写f

(gdb)info:查看函数内部局部变量的数值,简写i

(gdb)finish:结束当前函数,返回到函数调用点

(gdb)continue:继续运行,简写c

(gdb)print:打印值及地址,简写p

(gdb)quit:退出gdb,简写q

(gdb)break+num:在第num行设置断点,简写b

(gdb)info breakpoints:查看当前设置的所有断点

(gdb)delete breakpoints num:删除第num个断点,简写d

(gdb)display:追踪查看具体变量值

(gdb)undisplay:取消追踪观察变量

(gdb)watch:被设置观察点的变量发生修改时,打印显示

(gdb)i watch:显示观察点

(gdb)enable breakpoints:启用断点

(gdb)disable breakpoints:禁用断点

(gdb)x:查看内存x/20xw 显示20个单元,16进制,4字节每单元

(gdb)run argv[1] argv[2]:调试时命令行传参

(gdb) disassemble 查看汇编

————————————————
版权声明:本文为CSDN博主「whoah」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/awm_kar98/article/details/82840811

GDB调试C/C++程序

  1. 使用 gcc -g 选项编译源文件,即可生成满足 GDB 要求的可执行文件

​ 如:gcc main.c -o main.exe -g

  1. GCC 编译器支持 -O(等于同 -O1,优化生成的目标文件)和 -g 一起参与编译。GCC 编译过程对进行优化的程度可分为 5 个等级,分别为 O0~O4,O0 表示不优化(默认选项),从 O1 ~ O4 优化级别越来越高,O4 最高。

    • 对 GDB 调试器更友好的是 -Og 选项,-Og 对代码所做的优化程序介于 O0 ~ O1 之间,真正可做到“在保持快速编译和良好调试体验的同时,提供较为合理的优化级别”。
  2. 在启动 GDB 的同时,会打印出一堆免责条款。通过添加 --silent(或者 -q、--quiet)选项,可将比部分信息屏蔽掉。

(gdb)run&start

  1. GDB 调试器提供了多种方式来启动目标程序,其中最常用的就是 run 指令,其次为 start 指令,区别:
  • 默认情况下,run 指令会一直执行程序,直到执行结束。如果程序中手动设置有断点,则 run 指令会执行程序至第一个断点处;
  • start 指令会执行程序至 main() 主函数的起始位置,即在 main() 函数的第一行语句处停止执行(该行代码尚未执行)。

(使用 start 指令启动程序,完全等价于先在 main() 主函数起始位置设置一个断点,然后再使用 run 指令启动程序。另外,程序执行过程中使用 run 或者 start 指令,表示的是重新启动程序。

  2. 在进行 run 或者 start 指令启动目标程序之前,还可能需要做一些必要的准备工作,大致包括以下几个方面:
  • 如果启动 GDB 调试器时未指定要调试的目标程序,或者由于各种原因 GDB 调试器并为找到所指定的目标程序,这种情况下就需要再次手动指定;(gdb)l(gdb)file xxx

  • 有些 C 或者 C++ 程序的执行,需要接收一些参数(程序中用 argc 和 argv[] 接收);

    gdb --args main.exe a.txt
    (gdb) set args a.txt
    (gdb) run a.txt
    (gdb) start a.txt
    
  • 目标程序在执行过程中,可能需要临时设置 PATH 环境变量;(gdb)path xxx

  • 默认情况下,GDB 调试器将启动时所在的目录作为工作目录,但很多情况下,该目录并不符合要求,需要在启动程序手动为 GDB 调试器指定工作目录。(gdb) cd xxx

  • 默认情况下,GDB 调试器启动程序后,会接收键盘临时输入的数据,并将执行结果会打印在屏幕上。但 GDB 调试器允许对执行程序的输入和输出进行重定向,使其从文件或其它终端接收输入,或者将执行结果输出到文件或其它终端。(gdb) run >Out.txt

(gdb)break & tbreak&rbreak

  1. GDB break命令

break 命令(可以用 b 代替)常用的语法格式有以下 2 种。

1、(gdb) break location     // b location
2、(gdb) break ... if cond  // b .. if cond
location 的值 含 义
linenum linenum 是一个整数,表示要打断点处代码的行号。要知道,程序中各行代码都有对应的行号,可通过执行 l(小写的 L)命令看到。
filename:linenum filename 表示源程序文件名;linenum 为整数,表示具体行数。整体的意思是在指令文件 filename 中的第 linenum 行打断点。
+ offset - offset offset 为整数(假设值为 2),+offset 表示以当前程序暂停位置(例如第 4 行)为准,向后数 offset 行处(第 6 行)打断点;-offset 表示以当前程序暂停位置为准,向前数 offset 行处(第 2 行)打断点。
function function 表示程序中包含的函数的函数名,即 break 命令会在该函数内部的开头位置打断点,程序会执行到该函数第一行代码处暂停。
filename:function filename 表示远程文件名;function 表示程序中函数的函数名。整体的意思是在指定文件 filename 中 function 函数的开头位置打断点。
  • ... 可以是location 中所有参数的值,用于指定打断点的具体位置;

  • cond 为某个表达式。整体的含义为:每次程序执行到 ... 位置时都计算 cond 的值,如果为 True,则程序在该位置暂停;反之,程序继续执行。

  1. GDB tbreak命令

tbreak 命令可以看到是 break 命令的另一个版本,tbreak 和 break 命令的用法和功能都非常相似。

唯一的不同在于,使用 tbreak 命令打的断点仅会作用 1 次,即使程序暂停之后,该断点就会自动消失。

  1. GDB rbreak 命令

rbreak 命令的作用对象是 C、C++ 程序中的函数,它会在指定函数的开头位置打断点。

(gdb) tbreak regex,其中 regex 为一个正则表达式,程序中函数的函数名只要满足 regex 条件,rbreak 命令就会其内部的开头位置打断点。值得一提的是,rbreak 命令打的断点和 break 命令打断点的效果是一样的,会一直存在,不会自动消失。

  1. 查看当前已建好的断点

    查看当前调试环境中存在的所有断点,包括普通断点、观察断点以及捕捉断点

    (gdb) info breakpoint [n]
    (gdb) info break [n]
    (gdb) info watchpoint [n]
    

    ​ 参数 n 作为可选参数,为某个断点的编号,表示查看指定断点而非全部断点。

    输出信息中各列的含义分别是:断点编号(Num)、断点类型(Type)、是临时断点还是永久断点(Disp)、目前是启用状态还是禁用状态(Enb)、断点的位置(Address)、断点当前的状态(作用的行号、已经命中的次数等,用 What 列表示)。

  2. 删除断点

    无论是普通断点、观察断点还是捕捉断点,都可以使用 clear 或者 delete 命令进行删除。

    • clear 命令可以删除指定位置处的所有断点,常用的语法格式如下所示:

      (gdb) clear location

      参数 location 通常为某一行代码的行号或者某个具体的函数名。当 location 参数为某个函数的函数名时,表示删除位于该函数入口处的所有断点。

    • delete 命令(可以缩写为 d )通常用来删除所有断点,也可以删除指定编号的各类型断点,语法格式如下:

      delete [breakpoints] [num]

      其中,breakpoints 参数可有可无,num 参数为指定断点的编号,其可以是 delete 删除某一个断点,而非全部。

  3. 禁用断点

    使目标断点暂时失去作用,必要时可以再将其激活,恢复断点原有的功能

    disable [breakpoints] [num...]

    breakpoints 参数可有可无;num... 表示可以有多个参数,每个参数都为要禁用断点的编号。如果指定 num...,disable 命令会禁用指定编号的断点;反之若不设定 num...,则 disable 会禁用当前程序中所有的断点。

  4. 激活断点

    enable [breakpoints] [num...]     激活用 num... 参数指定的多个断点,如果不设定 num...,表示激活所有禁用的断点
    enable [breakpoints] once num…    临时激活以 num... 为编号的多个断点,但断点只能使用 1 次,之后会自动回到禁用状态
    enable [breakpoints] count num... 临时激活以 num... 为编号的多个断点,断点可以使用 count 次,之后进入禁用状态
    enable [breakpoints] delete num…  激活 num.. 为编号的多个断点,但断点只能使用 1 次,之后会被永久删除。
    

    其中,breakpoints 参数可有可无;num... 表示可以提供多个断点的编号,enable 命令可以同时激活多个断点。

(gdb)watch

(gdb) watch cond 其中,conde 指的就是要监控的变量或表达式。

  • watch 命令:监控 C、C++ 程序中某变量或表达式的值是否发生改变
  • rwatch 命令:只要程序中出现读取目标变量(表达式)的值的操作,程序就会停止运行;
  • awatch 命令:只要程序中出现读取目标变量(表达式)的值或者改变值的操作,程序就会停止运行。

查看当前建立的观察点的数量: (gdb) info watchpoints

注意:

  • 当监控的变量(表达式)为局部变量(表达式)时,一旦局部变量(表达式)失效,则监控操作也随即失效;
  • 如果监控的是一个指针变量(例如 *p),则 watch *p 和 watch p 是有区别的,前者监控的是 p 所指数据的变化情况,而后者监控的是 p 指针本身有没有改变指向;
  • 这 3 个监控命令还可以用于监控数组中元素值的变化情况,例如对于 a[10] 这个数组,watch a 表示只要 a 数组中存储的数据发生改变,程序就会停止执行。

(gdb)catch

(gdb) catch event

其中,event 参数表示要监控的具体事件。对于使用 GDB 调试 C、C++ 程序,常用的 event 事件类型如

event 事件 含 义
throw [exception] 当程序中抛出 exception 指定类型异常时,程序停止执行。如果不指定异常类型(即省略 exception),则表示只要程序发生异常,程序就停止执行。
catch [exception] 当程序中捕获到 exception 异常时,程序停止执行。exception 参数也可以省略,表示无论程序中捕获到哪种异常,程序都暂停执行。
load [regexp] unload [regexp] 其中,regexp 表示目标动态库的名称,load 命令表示当 regexp 动态库加载时程序停止执行;unload 命令表示当 regexp 动态库被卸载时,程序暂停执行。regexp 参数也可以省略,此时只要程序中某一动态库被加载或卸载,程序就会暂停执行。

注意:

  1. 对于使用 catch 监控指定的 event 事件,其匹配过程需要借助 libstdc++ 库中的一些 SDT 探针,而这些探针最早出现在 GCC 4.8 版本中。也就是说,想使用 catch 监控指定类型的 event 事件,系统中 GCC 编译器的版本最低为 4.8,但即便如此,catch 命令是否能正常发挥作用,还可能受到系统中其它因素的影响。
  2. 当 catch 命令捕获到指定的 event 事件时,程序暂停执行的位置往往位于某个系统库(例如 libstdc++)中。这种情况下,通过执行up命令,即可返回发生 event 事件的源代码处。
  3. catch 无法捕获以交互方式引发的异常。
  4. 对于目标事件,catch 命令的监控是永久的,而 tcatch 命令只监控一次
  5. 运行所需加载的动态库可以使用 ldd 命令查看

(gdb)condition

condition 命令的功能是:既可以为现有的普通断点、观察断点以及捕捉断点添加条件表达式,也可以对条件断点的条件表达式进行修改。 命令没有缩写形式。

(gdb) condition bnum expression
(gdb) condition bnum

​ 参数 bnum 用于代指目标断点的编号;参数 expression 表示为断点添加或修改的条件表达式。

​ 第 1 种用于为 bnum 编号的断点添加或修改 expression 条件表达式;

​ 第 2 种用于删除 bnum 编号断点的条件表达式,使其变成普通的无条件断点。

(gdb)ignore

ignore 命令也可以使一个断点成为条件断点,但这里的“条件”并非自定义的表达式,而仅为一个整数,它用来表示该断点失效的次数。也就会说,ignore 命令可以使目标断点暂时失去作用,当断点失效的次数超过指定次数时,断点的功能会自动恢复。

ignore 命令也没有缩写形式,其语法格式如下:

ignore bnum count

参数 bnum 为某个断点的编号;参数 count 用于指定该断点失效的次数。

(gdb)display

display 命令用于调试阶段查看某个变量或表达式的值,每当程序暂停执行(例如单步执行)时会自动打印

display 命令没有缩写形式,常用的语法格式如下 2 种:

(gdb) display expr
(gdb) display/fmt expr

其中,expr 表示要查看的目标变量或表达式;参数 fmt 用于指定输出变量或表达式的格式

/fmt 功 能
/x 以十六进制的形式打印出整数。
/d 以有符号、十进制的形式打印出整数。
/u 以无符号、十进制的形式打印出整数。
/o 以八进制的形式打印出整数。
/t 以二进制的形式打印出整数。
/f 以浮点数的形式打印变量或表达式的值。
/c 以字符形式打印变量或表达式的值。

注意,display 命令和 /fmt 之间不要留有空格。以 /x 为例,应写为 (gdb)display/x expr

对于使用 display 命令查看的目标变量或表达式,都会被记录在一张列表(称为自动显示列表)中。通过执行info dispaly命令,可以打印出这张表

(gdb) info display
Auto-display expressions now in effect:
Num Enb Expression
2:      y      /t result
1:      y      num

其中,各列的含义为:

  • Num 列为各变量或表达式的编号,GDB 调试器为每个变量或表达式都分配有唯一的编号;
  • Enb 列表示当前各个变量(表达式)是处于激活状态还是禁用状态,如果处于激活状态(用 y 表示),则每次程序停止执行,该变量的值都会被打印出来;反之,如果处于禁用状态(用 n 表示),则该变量(表达式)的值不会被打印。
  • Expression 列:表示查看的变量或表达式。
  1. 删除自动显示列表中的变量或表达式

    (gdb) undisplay num...
    (gdb) delete display num...
    
  2. 禁用自动显示列表中处于激活状态下的变量或表达式

    (gdb) disable display num...

    参数 num... 表示要激活的变量或表达式的编号,编号的个数可以是多个,表示一次性激活多个变量或表达式。

  3. 激活当前处于禁用状态的变量或表达式

    (gdb) enable display num...

    参数 num... 表示要激活的变量或表达式的编号,编号的个数可以是多个,表示一次性激活多个变量或表达式。

(gdb)handle

GDB 调试器提供了info handles指令,用于查看 GDB 可以处理的信号种类,以及各个信号的具体处理方式。

(gdb) info signals
Signal        Stop Print  Pass to program  Description

SIGHUP        Yes  Yes    Yes              Hangup
SIGINT        Yes  Yes    No               Interrupt
SIGQUIT       Yes  Yes    Yes              Quit
SIGILL        Yes  Yes    Yes              Illegal instruction
SIGTRAP       Yes  Yes    No               Trace/breakpoint trap
SIGABRT       Yes  Yes    Yes              Aborted
SIGEMT        Yes  Yes    Yes              Emulation trap
SIGFPE        Yes  Yes    Yes              Arithmetic exception
SIGKILL       Yes  Yes    Yes              Killed
......

其中各列的含义分别为:

  • Signal:各个信号的名称;
  • Stop:当信号发生时,是否终止程序执行。Yes 表示终止,No 表示当信号发生时程序认可继续执行;
  • Print:当信号发生时,是否要求 GDB 打印出一条提示信息。Yes 表示打印,No 表示不打印;
  • Pass:当信号发生时,该信号是否对程序可见。Yes 表示程序可以捕捉到该信息,No 表示程序不会捕捉到该信息;
  • Description:对信号所表示含义的简单描述。

handle 命令的语法格式如下:

(gdb) handle signal mode

其中:

​ signal 参数表示要设定的目标信号,它通常为某个信号的全名(SIGINT)或者简称(去除‘SIG’后的部分,如 INT);如果要指定所有信号,可以用 all 表示。

​ mode 参数用于明确 GDB 处理该目标信息的方式,其值可以是如下几个:

  • nostop:当信号发生时,GDB 不会暂停程序,其可以继续执行,但会打印出一条提示信息,告诉我们信号已经发生;
  • stop:当信号发生时,GDB 会暂停程序执行。
  • noprint:当信号发生时,GDB 不会打印出任何提示信息;
  • print:当信号发生时,GDB 会打印出必要的提示信息;
  • nopass(或者 ignore):GDB 捕获目标信号的同时,不允许程序自行处理该信号;
  • pass(或者 noignore):GDB 调试在捕获目标信号的同时,也允许程序自动处理该信号。

注意,当 GDB 捕获到信号并暂停程序执行的那一刻,程序是捕获不到信号的,只有等到程序继续执行时,信号才能被程序捕获。

(gdb)frame

main() 主函数对应的栈帧,又称为初始帧或者最外层的帧。

frame 命令的常用形式有 2 个:

i.根据栈帧编号或者栈帧地址,选定要查看的栈帧,语法格式如下:

(gdb) frame spec

该命令可以将 spec 参数指定的栈帧选定为当前栈帧。spec 参数的值,常用的指定方法有 3 种:

  1. 通过栈帧的编号指定。0 为当前被调用函数对应的栈帧号,最大编号的栈帧对应的函数通常就是 main() 主函数;

  2. 借助栈帧的地址指定。栈帧地址可以通过 info frame 命令(后续会讲)打印出的信息中看到;

  3. 通过函数的函数名指定。注意,如果是类似递归函数,其对应多个栈帧的话,通过此方法指定的是编号最小的那个栈帧。

  4. 对于选定一个栈帧作为当前栈帧

    (gdb) up n

    其中 n 为整数,默认值为 1。该命令表示在当前栈帧编号(假设为 m)的基础上,选定 m+n 为编号的栈帧作为新的当前栈帧。

    (gdb) down n

    其中 n 为整数,默认值为 1。该命令表示在当前栈帧编号(假设为 m)的基础上,选定 m-n 为编号的栈帧作为新的当前栈帧。

ii.借助如下命令,我们可以查看当前栈帧中存储的信息:

(gdb) info frame

该命令会依次打印出当前栈帧的如下信息:

  • 当前栈帧的编号,以及栈帧的地址;

  • 当前栈帧对应函数的存储地址,以及该函数被调用时的代码存储的地址

  • 当前函数的调用者,对应的栈帧的地址;

  • 编写此栈帧所用的编程语言;

  • 函数参数的存储地址以及值;

  • 函数中局部变量的存储地址;

  • 栈帧中存储的寄存器变量,例如指令寄存器(64位环境中用 rip 表示,32为环境中用 eip 表示)、堆栈基指针寄存器(64位环境用 rbp 表示,32位环境用 ebp 表示)等。

除此之外,还可以使用info args命令查看当前函数各个参数的值;使用info locals命令查看当前函数中各局部变量的值。

(gdb)backtrace

backtrace 命令用于打印当前调试环境中所有栈帧的信息,常用的语法格式如下:

(gdb) backtrace [-full] [n]

其中,用 [ ] 括起来的参数为可选项,它们的含义分别为:

  • n:一个整数值,当为正整数时,表示打印最里层的 n 个栈帧的信息;n 为负整数时,那么表示打印最外层 n 个栈帧的信息;
  • -full:打印栈帧信息的同时,打印出局部变量的值。

注意,当调试多线程程序时,该命令仅用于打印当前线程中所有栈帧的信息。如果想要打印所有线程的栈帧信息,应执行thread apply all backtrace命令。

(gdb)edit

在 GDB 中编辑源文件中使用 edit 命令,该命令的语法格式如下:

(gdb) edit [location]
(gdb) edit [filename] : [location]

location 表示程序中的位置。这个命令表示激活文件的指定位置,然后进行编辑。

注意,GDB edit 命令编辑文件默认使用的是 ex 编译器,使用的时候可能会遇见下面的情况:

(gdb) editbash: /bin/ex: 没有那个文件或目录

遇到这种问题时,我们可以指定任意的编辑器(例如 Vim)去编辑文件。进入 GDB 调试器前,执行如下命令设置 EDITOR 环境变量:

export EDITOR=/usr/bin/vim

由此,当在 GDB 调试器中执行 edit 命令时,就会自动进入 Vim 编辑器,从而对当前调试的程序进行修改。

注意:

  • 上面修改编辑器的方法只是临时生效,当退出 shell 终端后配置就会被还原,下次使用的时候还要再次使用这条命令。
  • 永久的实现配置,需要去修改配置文件,具体做法是:修改当前 home 目录下的”~/.bashrc”文件,在文件的最后添加上述的命令就可以实现文件的永久配置(修改的是当前用户的配置文件,一般不建议修改系统的配置文件,出现问题不容易恢复)。配置完成重启 shell 终端,就可以完成配置。

(gdb)search

GDB 中提供了相关的源代码搜索的的 search 命令。

search <regexp>reverse-search <regexp>

第一项命令格式表示从当前行的开始向前搜索,后一项表示从当前行开始向后搜索。其中 regexp 就是正则表达式。

若使用命令时可能会下面的情况:

(gdb) search funcExpression not found

表示搜索的范围没有出现要寻找的字符串或者定位到了代码行的末尾

(gdb)help

帮用户打印出目标命令的功能和具体用法

根据各个 GDB 命令的不同功能,help 命令将它们分成了 12 大类,每一类中都包含多个功能类似的 GDB 命令。

(gdb) helpList of classes of commands:aliases -- Aliases of other commandsbreakpoints -- Making program stop at certain pointsdata -- Examining datafiles -- Specifying and examining filesinternals -- Maintenance commandsobscure -- Obscure featuresrunning -- Running the programstack -- Examining the stackstatus -- Status inquiriessupport -- Support facilitiestracepoints -- Tracing of program execution without stopping the programuser-defined -- User-defined commands

(gdb)自动补全命令

  • Tab 键:自动补全整个命令

  • 双击 Tab 键: 将所有可能的命令都罗列出来

  • 除此之外,当我们输入完成的 GDB 命令后,通过双击 Tab 键,GDB 会给我们罗列出该命令可用的所有参数

上一篇:samba 共享ubuntu系统文件夹到Windows


下一篇:高效PHP编程