首页 > 其他分享 >GDB Quick Start

GDB Quick Start

时间:2023-12-18 16:35:10浏览次数:25  
标签:arr 命令 程序 gdb Start GDB Quick 断点

什么是 GDB

GDB 是 GNU 项目下的一个调试器,它允许在程序运行的时候检查程序内部到底发生了什么。

GDB 可以做到以下事情:

  1. 开始程序,设置观测参数。
  2. 在特殊情况下暂停程序执行。
  3. 当程序停止执行的时候,检查程序状态。
  4. 修改程序,在修复某个 bug 后可以继续进行测试,寻找其他的 bug。

GDB 是一个跨平台的调试器,UNIX,Windows,MAC OS X 上均可使用。

GDB 支持以下语言:

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

快速使用

编写一份 test.c 代码

#include <stdio.h>

int main()
{
  int arr[4] = {1, 2, 3, 4};
  for(int i = 0 ; i < 4 ; i ++)
    printf("%d\n", arr[i]);
  return 0;
}

现在要使用 gdb 调试这份代码:

gcc -g test.c # 编译时加 -g 表示编译时带调试信息
gdb ./a.out # gdb启动执行程序

在做完上面两步之后,进入 gdb 模式,终端输出如下内容

GNU gdb (Ubuntu 12.1-0ubuntu1~22.04) 12.1
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from a.out...
(No debugging symbols found in a.out)
(gdb) 

这表示已经进入了 gdb 模式,并正在对 a.out 进行调试。

在进入 gdb 之后,要实现调试的目的,还需要知道下面这些命令(或者可以 man gdb 来查找命令):

run 命令

r               # (或 run) 执行程序

可以看到,输入 run 命令,程序被执行,输出了 1, 2, 3, 4 。

quit 命令

quit            # 退出 gdb 模式

可以看到,输入 quit 命令,退出了 gdb 模式,回到终端。

break 命令

b               # (或 break) 后跟函数名或者行数,设置断点

break 命令用于添加断点,程序在运行到断点时会自动暂停执行。

b 7             # 在第 7 行添加断点
b main          # 在 main 函数处添加断点

main 函数在第四行,此时程序在第四行处设置了断点。

可以看到,程序在执行到第四行的时候暂停了并提示运行到 main() at test.c:4

next 命令

n               # (或 next) 在 gdb 暂停程序后,命令程序单步执行

刚才在第 4 行暂停执行了,输入 next 命令让程序继续执行。

可以看到,每次输入 next 命令,程序执行一步。

continue 命令

c               # (或 continue) 在 gdb 暂停程序后,命令程序继续执行

暂停执行后,输入 continue 命令让程序继续运行,直至再次遇到断点。

可以看到,程序遇到主函数的断点之后,输入 continue 命令,程序继续执行,遇到第七行的断点之后又被暂停。

list 命令

打断点的时候通常需要看一下源代码,使用 list 命令来在终端里打印源代码

list            # 显示当前位置向下 10 行代码
list -          # 显示当前位置向上 10 行代码

由于比较简单,不再展示。

step 命令

如果程序执行到调用某个函数,step 命令将跟踪观察被调函数,否则和 next 的作用一样。

修改一下源代码:

//test1.c
#include <stdio.h>

void hello()
{
	printf("Hello, ZTer~");
}

int main()
{
	int arr[4] = {1, 2, 3, 4};
	int i = 0;
	for(i = 0 ; i < 4 ; i ++)
	{
		printf("%d\n", arr[i]);
	}
	hello();
	return 0;
}

在 15 行添加断点,输入 step 命令。

可以看到,程序跟踪进入了 hello() 函数。

使用 print 后跟变量名以显示变量当前的值,也可以显示变量的地址。

  • 在执行赋值操作之前,查询 arr[0] 的值,得到无效值 -7351 。
  • 使用 next 命令,赋值操作执行,再次查询,得到 1 。
  • 查询 arr[0] 和 arr[1] 的地址,相差 4 字节(一个 int)。

watchpoint 命令

watchpoint 是一个观察点,可以对一个对象或者一个内存设置观察点。当这个对象或者这块内存里的变量有变化时,自动生成提示。

info b          # 查看断点情况
shell           # 在 gdb 模式下使用终端命令
set logging on  # 开启/关闭(off)日志模式,该模式会记录 gdb 的输出

标签:arr,命令,程序,gdb,Start,GDB,Quick,断点
From: https://www.cnblogs.com/zaza-zt/p/17911561.html

相关文章

  • gdb基本使用介绍
    GDB介绍GDB是GNUDebugger的简称,其作用是可以在程序运行时,检测程序正在做什么。GDB程序自身是使用C/C++程序编写的,但可以支持除C/Cpp之外很多编程语言的调试。GDB原生支持调试的语言包含:C/Cpp/D/Go/Object-C/OpenCLC/Fortran/Rust等等。使用GDB,我们可以方便地进行如下任务:如果......
  • 无涯教程-Java - boolean startsWith(String prefix, int toffset)函数
    判断字符串是否以prefix开头。booleanstartsWith-语法这是此方法的语法-publicbooleanstartsWith(Stringprefix,inttoffset)这是参数的详细信息-prefix   -要匹配的前缀。toffset  -从何处开始查找字符串。booleanstartsWith-返回值如果参数表示......
  • 无涯教程-Java - boolean startsWith(String prefix)函数
    判断字符串是否以prefix开头。booleanstartsWith-语法publicbooleanstartsWith(Stringprefix)这是参数的详细信息-prefix  - 要匹配的前缀。booleanstartsWith-返回值如果是以prefix开头,则返回true,否则为false。booleanstartsWith-示例importjava.io.*......
  • 用gdb临时解决tmux hang死问题
    表现:在rhel8.6上,tmux在调整窗口layout的时候,有机会出现hang死问题,所有tmux窗口卡死。 tmux版本:3.3a  目的:假如此时想要把某些内容保存下来,可通过gdb临时解决。 解决办法:1.gdb-ptmux进程号2.backtrace查看当前执行的位置,发现当前执行到grid_reflow_join方法上。......
  • spring boot启动耗时分析-spring-startup-analyzer使用
    github地址:https://github.com/linyimin0812/spring-startup-analyzer1、安装curl-sShttps://raw.githubusercontent.com/linyimin0812/spring-startup-analyzer/main/bin/install.sh|sh 2、maven<parent><groupId>io.github.linyimin0812</groupI......
  • gdb远程调试
    gdb远程调试功能允许你在一台机器上运行你的程序,而在另外一台机器上使用gdb或者使用IDE来进行调试。可以是在移动平台运行程序,在pc上进行调试。甚至是在docker里面运行程序,在主机上调试。配合IDE,你能够像是在本地运行程序一样的去调试。只要你运行程序的机器上有gdbserver,并且能通......
  • quickjs运行typescript?
    一、前言quickjs是标准的js引擎,不可能直接运行ts文件。所以需要对ts文件,进行编译,编译成符合当前版本的js脚本,然后在运行。二、简单ts例子安装typescript,就有tsc编译器。使用npm之类安装。使用tsc--init创建项目,此时会得到一个tsconfig.js配置文件。在src目录创建一......
  • springcloudalibabada搭建过程中springboot启动卡住起不来 (Started MoonceProviderApp
    如下图一样springcloudAlibaba在创建新模块之后启动新模块没有注册到nacos上,而是直接卡住起不来原因 原因是:引入了错误的web包: 解决办法:引入相应的 spring-boot-starter-web包:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot......
  • quickjs C功能扩展的四种写法
    一、前言 茴香豆的“茴”字有多少种写法?这篇博客不是为了炫技,是JS就是这么多种情况。比如C语言,就只能通过函数调用,没有类的概念。比如Java,就只能通过类、对象的方式。不能单独创建函数。哪怕main函数也要包装成一个class。而JS,即可以提供函数,也可以提供类。在ES5之前,JS......
  • gdb调试带参数的应用程序
    $gdb--args./AV1V2V3$gdb./A,进入gdb后 runV1V2V3$gdb./A,进入gdb后 设置参数setargsV1V2V3再直接run。 参考:https://blog.csdn.net/guoqianqian5812/article/details/51755852?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-b......