GDB调试指南

news/2024/10/19 6:18:13/

GDB调试指南

  • 操作使用
  • 使用场景

操作使用

进入gdb调试

  1. gdb ./helloworld
  2. 后台进入gdb调试:sudo gdb attach PID
    r/run 开始/重新开始执行应用程序,应用程序重头开始,直到遇到断点
    list列出源码,持续键入回车,代码向后展开
    n/next 单步执行,单步调试
    回车 重复执行上条命令
    focus 显示源码 ctrl+x A 退出focus
    finish/fin 结束当前函数
    s 跳入函数
    b func/line 用于设置断点,可以在文件某一行,某个函数等
    del 1 删除1号断点
    dis 1 关闭1号断点
    en 1 打开1号断点
    info b 查看所有断点
    info register 查看寄存器
    p var 打印变量,可以打印当前所有变量,打印类型需要匹配
    x /10 ptr 向上dump ptr附近的10个字节内容
    set var 设置变量值
    bt 查看调用栈
    watch 观察点(地址),当地址中的内容发生变化,程序会停下来
    condition 当 0x565d046c 的内容被修改成 0 时停下来
    frame 3 跳到栈的第三层,方便查看当前栈信息
    c 继续执行,直到下一个断点
    disassemble func 对函数进行反汇编
    disassemble /m ptr 反汇编出指针附近的代码
    q 退出GDB

使用场景

  1. 异常退出
  • 场景:运行程序,报错、程序异常crash退出,程序终止
  • 解决方法: gdb lunch程序,输入r正常运行,当程序终止时,可以使用gdb命令bt查看调用栈,排查问题
  1. ** 忙等待**
  • 场景: 运行程序,终端卡住,不能输出任何内容
  • 解决方法:
    A. 可以在后台查看当前程序的pid,使用sudo gdb attach pid,接手程序运行,使用命令bt查看调用栈,排查问题。
    B. pkill -SIGSTOP nuttx
    C. kill -19 pid
  1. 变量被改
  • 场景: 运行程序,多线程,一个变量被修改,但不知道是谁
  • 解决方法: gdb lunch程序,然后使用命令watch 加变量的地址,当变量内容发生变化时,程序停止,使用bt查看调用栈,排查问题。
  1. 函数异常返回
  • 场景: 运行程序,函数异常返回,但不知道对应哪个逻辑
  • 解决方法: gdb lunch程序,然后使用命令b 加函数名称,设置断点,r运行,当程序停下来时,使用n或者s进行单步跟踪,直到异常退出

http://www.ppmy.cn/news/18493.html

相关文章

动态内存管理(C语言)

目录 为什么要存在动态内存分配 动态内存函数的介绍 malloc函数 free函数 calloc函数 realloc函数 常见的动态内存错误 对NULL指针解引用错误 对动态开辟的空间越界访问 对非动态开辟内存使用free释放 使用free释放一块动态开辟内存的一部分 对同一块动态内存多次释放 动态开辟…

【Kotlin】接口和抽象类 ( 接口属性和方法定义 | 接口默认方法实现 | 抽象类 )

文章目录一、接口属性和方法定义二、接口默认方法实现三、抽象类一、接口属性和方法定义 Kotlin 中使用 interface 关键字 定义接口 , 接口中的 所有 属性 和 函数 默认都是 open 的 , 在 接口 实现类中 , 必须 使用 override 重写 接口的 属性 和 函数 ; 重写 接口属性 主要是…

针对容器场景的多功能渗透工具

介绍 CDK是一款为容器环境定制的渗透测试工具,在已攻陷的容器内部提供零依赖的常用命令及PoC/EXP。集成Docker/K8s场景特有的 逃逸、横向移动、持久化利用方式,插件化管理。 下载/植入 将可执行文件投递到已攻入的容器内部开始使用 https://github.c…

Java补充内容(Junit 反射 注解)

1 Junit测试 测试分类: 1. 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值。 2. 白盒测试:需要写代码的。关注程序具体的执行流程。 Junit使用:白盒测试 步骤: 定义一个测试类(测试…

go语言学习笔记【一】

一、初入GO语言 我们先还是看看GO语言的hello world是怎么写的吧 package main import "fmt" func main() {fmt.Println("Hello world!") }第一行 :包声明,编写源文件时,必须在非注释的第一行指明这个文件属于哪个包…

gdb使用简介

目录 编译时,加入-g选项 不加-g选项,将不能加断点 加入-g选项,才能加断点 run与start start run break continue 编译时,加入-g选项 不加-g选项,将不能加断点 加入-g选项,才能加断点 run与start …

C/C++预处理指令总结

前言C/C源码需要经过四个阶段才能得到可执行程序,这个四个阶段依次是:预处理、编译、汇编、链接。具体过程可以参考一文看懂C/C编译过程以及g编译选项。今天重点讲一下预处理指令,显然这些指令都是在预处理阶段起作用。预处理指令可以分为三大…

Centos Java1.8+Nginx+redis+pgsql 手工配置

一、系统升级,安装系统常用工具及配置 1.1 升级软件及Centos 内核 yum update -y yum clean all cat /etc/redhat-release 1.2 安装虚拟机守护进程 yum install qemu-guest-agent -y 1.3 安装系统常用工具包 yum install lrzsz vim wget dnf -y 1.4关…