gdb调试常用指令及案例讲解

这篇具有很好参考价值的文章主要介绍了gdb调试常用指令及案例讲解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

  • GDB是一个由GNU开源组织发布的、UNIX/LINUX 操作系统下的、基于命令行的、功能强大的程序调试工具。

  • GDB 支持断点、单步执行、打印变量、观察变量、查看寄存器、查看堆栈等调试手段。在 Linux 环境软件开发中,GDB 是主要的调试工具,用来调试 C 和 C++ 程序(也支持 go 等其他语言)。

一、常用指令

-g:		使用该参数编译可以执行文件,得到调试表。
gdb ./a.out
list: 		list 1 列出源码。根据源码指定 行号设置断点。
b: 		b 2020 行位置设置断点。
run/r: 		运行程序
n/next: 	下一条指令(会越过函数)
s/step: 	下一条指令(会进入函数)
p/print: 	p i 查看变量的值。
continue:继续执行断点后续指令。
finish:结束当前函数调用。
quit:退出 gdb 当前调试。

二、案例说明

使用 gdb 之前,要求对文件进行编译时增加 -g 参数,加了这个参数过后生成的编译文件会大一些,这是因为增加了 gdb 调试内容。

1、测试源文件

#include <stdio.h>

void myprint(int i)
{
    if (i % 2 == 1) {
        printf("this run, i = %d\n", i); 
    }   
}

int main(void)
{
    int i = 0;  

    printf("hello world\n");

    for (i = 0; i < 10; i++) {
        myprint(i);
    }   
}

2、编译和调试

①、编译

gcc test.c -o test -g

gdb调试命令大全,linux系统编程,linux
②、启动对 test 的调试

gdb test

gdb调试命令大全,linux系统编程,linux
list/l n 从第 n 行开始显示程序, 后续继续输入 list/l,就可以显示后面的代码
gdb调试命令大全,linux系统编程,linux
break/b n 在第 n 行设置断点,断点那一行不会执行
gdb调试命令大全,linux系统编程,linux
run/r 运行程序
gdb调试命令大全,linux系统编程,linux
接下来按 next/n/step/s 继续向下执行
next/n :下一个,调用函数就跑
step/s :单步,会进入调用的函数
要注意的是,如果是系统函数,按 s 就出不来了,这时用 until+行号直接执行到行号处
gdb调试命令大全,linux系统编程,linux
进到 printf 系统函数出不来的示例
gdb调试命令大全,linux系统编程,linux
使用 until 出来
gdb调试命令大全,linux系统编程,linux
print/p i 查看 i 变量的值
gdb调试命令大全,linux系统编程,linux
continue 直接运行到结束
gdb调试命令大全,linux系统编程,linux

三、其他指令

run:使用 run 查找段错误出现位置。
set args: 设置 main 函数命令行参数 (在 start、 run 之前)
run 字串 1 字串 2 ...: 设置 main 函数命令行参数
info b: 查看断点信息表
b 20 if i = 5: 设置条件断点。
ptype:查看变量类型。
bt:列出当前程序正存活着的栈帧。
frame: 根据栈帧编号,切换栈帧。
display:设置跟踪变量
undisplay:取消设置跟踪变量。 使用跟踪变量的编号

四、案例说明

1、将上述 main 函数做如下修改,制造段错误

int main(void)
{
    int i = 0;  

    char *p = "TEST";
    
    printf("hello world\n");

    p[0] = 'Q';

    for (i = 0; i < 10; i++) {
        myprint(i);
    }   
}
gcc test.c -o test -g
gdb test
run

gdb调试命令大全,linux系统编程,linux
可以看到段错误的位置

2、将上述 main 函数做如下修改,传参测试

int main(int argc, char *argv[])
{
    int i = 0;  

    printf("hello world\n");

    printf("argc = %d\n", argc);
    printf("argv[0] = %s, argv[1] = %s\n", argv[0], argv[1]);

    for (i = 0; i < 10; i++) {
        myprint(i);
    }   
}

命令行执行下述命令

gcc test.c -o test -g
gdb test
run

gdb调试命令大全,linux系统编程,linux
gdb调试命令大全,linux系统编程,linux
3、将上述 main 恢复成最初版本,做断点测试

int main(void)
{
    int i = 0;  

    printf("hello world\n");

    for (i = 0; i < 10; i++) {
        myprint(i);
    }   
}

设置两个断点,一个是普通断点(打在第14行),一个是条件断点(当 i = 6 时打在第6行),再执行 run

b 14
b 6 if i = 6
run

gdb调试命令大全,linux系统编程,linux
backtrace 命令是列出当前堆栈中的所有帧。在下面的例子中,栈上只有一帧,编号为0,属于 main 函数。

backtrace (或者bt)

gdb调试命令大全,linux系统编程,linux
接着,我们执行了 next 命令。下面我们继续通过 backtrace 命令来查看栈帧信息。
gdb调试命令大全,linux系统编程,linux
从上面输出结果,我们能够看出,有两个栈帧,第1帧属于 main 函数,第0帧属于 myprint 函数。
每个栈帧都列出了该函数的参数列表。从上面我们可以看出,main 函数没有参数,而 myprint 函数有参数,并且显示了其参数的值。

有一点我们可能比较迷惑,在第一次执行backtrace的时候,main 函数所在的栈帧编号为0,而第二次执行的时候,main 函数的栈帧为1,而 myprint 函数的栈帧为0,这是因为与栈的向下增长规律一致,我们只需要记住编号最小帧号就是最近一次调用的函数。

4、查看断点信息表 info b
gdb调试命令大全,linux系统编程,linux
5、栈帧 frame
栈帧用来存储函数的变量值等信息,默认情况下,GDB 总是位于当前正在执行函数对应栈帧的上下文中。

在前面的例子中,由于当前正在 myprint函数中执行,GDB 位于第0帧的上下文中。可以通过 frame 命令来获取当前正在执行的上下文所在的帧。
gdb调试命令大全,linux系统编程,linux
下面,我们尝试使用 print 命令打印下当前栈帧的值,如下:
gdb调试命令大全,linux系统编程,linux
如果我们想看其他栈帧的内容呢?比如 main 函数中的变量,那需要先切换栈帧再查看,我们可以通过 frame [num] 来切换栈帧,如下:
gdb调试命令大全,linux系统编程,linux
6、通过 ptype 查看变量的类型
gdb调试命令大全,linux系统编程,linux
7、通过 display 设置跟踪变量
和 print 命令一样,display 命令也用于调试阶段查看某个变量或表达式的值,它们的区别是,使用 display 命令查看变量或表达式的值,每当程序暂停执行(例如单步执行)时,GDB 调试器都会自动帮我们打印出来,而 print 命令则不会。

也就是说,使用 1 次 print 命令只能查看 1 次某个变量或表达式的值,而同样使用 1 次 display 命令,每次程序暂停执行时都会自动打印出目标变量或表达式的值。因此,当我们想频繁查看某个变量或表达式的值从而观察它的变化情况时,使用 display 命令可以一劳永逸。gdb调试命令大全,linux系统编程,linux
undisplay:取消设置跟踪变量。 使用跟踪变量的编号
gdb调试命令大全,linux系统编程,linux


我的qq:2442391036,欢迎交流!文章来源地址https://www.toymoban.com/news/detail-759934.html

到了这里,关于gdb调试常用指令及案例讲解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【linux命令讲解大全】014.Git:分布式版本控制系统的先驱和常用命令清单(三)

    git log --pretty=oneline 文件名 :列出文件的所有改动历史 git show c178bf49 :某次的改动的修改记录 git log -p c178bf49 :某次的改动的修改记录 git blame 文件名 :显示文件的每一行是在那个版本最后修改。 git whatchanged 文件名 :显示某个文件的每个版本提交信息:提交日期,提交人员

    2024年02月10日
    浏览(40)
  • 【linux命令讲解大全】012.Git:分布式版本控制系统的先驱和常用命令清单(一)

    Git是目前世界上最先进的分布式版本控制系统。 很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。 Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代

    2024年02月10日
    浏览(41)
  • Linux下常用基本指令大全

    目录 在XShell下的复制粘贴 1. ls指令 2. pwd指令 3. cd指令 拓展 4. tree指令 5. whoami指令 6. touch指令 7. stat指令 8. mkdir指令 9. rmdir指令 rm 指令 10. man指令 11. cp指令 12. mv指令 13. cat指令 14. more指令 15. less指令 16. head指令 17. tail指令 18. date指令 19. cal指令 20. find指令 21. which 22. alias 23.

    2024年02月03日
    浏览(102)
  • Linux操作系统常用指令大全(一)

    语法:shutdown shutdown -h now 【立即关机】 shutdown -h 1 【1分钟后关机,shutdown后不填默认一分钟后关机】 shutdown -r now 【立即重启】 无论是要关机还是重启,建议先运行 sync 命令将内存数据保存到磁盘。 语法:man 命令或配置文件 man ls 【查看 ls 命令的帮助手册】 man netstat 【查看

    2024年01月23日
    浏览(67)
  • 【linux命令讲解大全】027.Linux权限管理详解

    显示给定模块的详细信息 bmodinfo 命令用于显示给定模块的详细信息。 -a :显示模块作者 -d :显示模块的描述信息 -l :显示模块的许可信息 -p :显示模块的参数信息 -n :显示模块对应的文字信息 -0 :用ASCII码的0字符分割字段值,而不使用新行 模块名:要显示详细信息的模

    2024年02月11日
    浏览(42)
  • 【linux命令讲解大全】022.网络管理工具和命令概述

    用于查看文件的第二扩展文件系统属性。 语法 lsattr(选项)(参数) 选项 -E :可显示设备属性的当前值,但这个当前值是从用户设备数据库中获得的,而不是从设备直接获得的。 -D :显示属性的名称,属性的默认值,描述和用户是否可以修改属性值的标志。 -R :递归的操作方式

    2024年02月11日
    浏览(45)
  • 【linux命令讲解大全】105.掌握磁盘配额管理的edquota命令

    用于编辑指定用户或工作组磁盘配额 edquota 命令用于编辑指定用户或工作组的磁盘配额。 edquota 预设会使用vi来编辑使用者或群组的quota设置。 -u :设置用户的quota,这是预设的参数; -g :设置群组的quota; -p 源用户名称 :将源用户的quota设置套用至其他用户或群组; -t :设

    2024年02月09日
    浏览(46)
  • 【linux命令讲解大全】029.深入了解od命令:文件数据解析利器

    od 命令用于输出文件的八进制、十六进制或其它格式编码的字节,通常用于显示或查看文件中不能直接显示在终端的字符。 常见的文件为文本文件和二进制文件。此命令主要用来查看保存在二进制文件中的值。比如,程序可能输出大量的数据记录,每个数据是一个单精度浮点

    2024年02月10日
    浏览(41)
  • Linux常见指令大全及周边知识:让你的命令行变得更加强大

    目录 文章目录 前言 一,Linux操作系统是啥? 二,Linux操作系统具有以下特点 三,指令的学习 1,指令是什么? 2,ls 指令及其常用的衍生指令: 周边知识: ls:指令的作用是显示当前路径下的文件名 ls -l :显示当前路径下更详细的文件属性包括文件名 ls -a :显示当前路径下的

    2024年02月05日
    浏览(44)
  • Linux 常用命令大全

    目录

    2024年02月12日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包