GDB调试的基本使用、GDB调试多进程

2023-11-17

1. 编译时加选项-g,生成具有调试信息的程序

gcc -g test.c -o test

2. 启动GDB

(1)启动GDB:

gdb test

(2)设置运行时参数:(主函数中可接收运行时参数)

set args  // 设置运行时参数,如set args 10 20 30
show args // 查看设置的运行时参数

(3)启动程序

run      // 执行程序,若有断点,则停在第一个断点处;简写为r
start    // 程序向下执行一行
continue // 执行到第一个断点处

3. 显示源码

list 或 l       // 显示当前行后面的源代码(默认总共显示10行)
list-           // 显示当前行前面的源代码(默认总共显示10行)
list n          // 显示第n行前后的源代码
list func       // 显示func函数的源代码
set listsize n  // 设置一次显示n行
show listsize   // 查看一次显示行数

4. 断点操作

(1)简单断点:使用b或break命令

b n    // 在第n行设置断点
b func // 在func函数入口处设置断点
info b // 显示所有断点,可简写为 i b

(2)多文件断点,假设程序有add.cpp和test.cpp两个文件

b add.cpp:n                  // 在add.cpp源文件第n行设置断点
b add.cpp:func               // 在add.cpp源文件func函数入口处设置断点
b Animal::func               // 在Animal类的func函数入口处设置断点
b Animal::doSth(int, double) // 有函数重载时,必须指定函数形参的情况
b MyNamespace::Animal::func  // 在NyNamespace的Animal类的func函数入口处设置断点

(3)条件断点:为断点设置条件

b test.c:8 if Value == 5
// test.c第8行,Value为5时就停止
// 若为循环,不能停在for语句,要停在循环体中

 (4)维护断点

delete 10-12 // 删除编号为10、11、12的断点,delete可以简写为d
disable n    //禁用编号为n的断点
enable n     //启用编号为n的断点

5. 调试程序

run      // 执行程序,若有断点,则停在第一个断点处,简写为r
next     // 单步跟踪。函数调用当做一条语句直接执行,简写为n
step     // 单步跟踪。函数调用则进入函数体内,简写为s
finish   // 退出进入的函数
until    // 在循环体内单步跟踪时,执行完循环体并退出,简写为c
continue // 继续执行程序,停在下一个断点处
quit     // 退出gdb,简写为q

6. 查看数据

查看运行时变量、字符串、表达式等的值:

print a  // 查看a的值,print可简写为p

7. 自动查看

自己设置需要查看的值,程序停住或单步跟踪时,会自动显示需要查看的值:

display i         // 设置自动显示i的值
info display      // 查看所有被设置为display的变量
undisplay n       // 不显示编号为n的display设置
delete display n  // 删除编号为n的display设置
disable display n // 禁用编号为n的display设置
enable display n  // 启用编号为n的display设置

8. 查看修改变量的类型、值

ptype i          // 查看变量i的类型
p i              // 查看变量i的值
set var i = 100  // 设置变量i的值为100

 9. GDB调试多进程

 有如下的多进程程序,需要使用GDB分别调试父子进程:

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<stdlib.h>

int main(int argc, const char* argv[]) {
    pid_t pid = -1;
    int status = 0;
    int ret = -1;

    pid = fork();
    if (-1 == pid) {
        perror("fork");
        return 1;
    }

    if (pid > 0) {
        // 父进程
        printf("父进程说太强了");
        printf("父进程笑尿了");
        printf("父进程哈哈哈哈哈");
    } else {
        // 子进程
        printf("子进程说太强了");
        printf("子进程笑尿了");
        printf("子进程哈哈哈哈哈");
        exit(0);
    }

    ret = wait(&status); // 父进程等待回收子进程资源
    if(-1 == ret) {
        perror("wait");
        return 1;
    }

    return 0;
}

GDB调试默认跟踪父进程,如下:

如何跟踪子进程呢?

在fork函数调用之前设置跟踪子进程:

set follow-fork-mode child

然后就会跟踪子进程,如下:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GDB调试的基本使用、GDB调试多进程 的相关文章

随机推荐

  • 内容管理系统——后台登录

    在课上 我通过 Laravel框架开发实践 一书学习了有关PHP的知识和应用 也通过书本上的 内容管理系统 案例实践并应用了所学的知识 下面将对这一案例中的后台登录模块进行介绍 目录 前言 一 创建用户表 二 显示登录页面 1 登录表单 2
  • R语言处理Time series

    Time series Introduction Simple time series models ARIMA Validating a model Spectral Analysis Wavelets Digital Signal Pr
  • Java当中读取Json文件转换为Java对象

    这里我用的是一个hutool工具包 里面包含了很多丰富的util 并且还有中文的API
  • Qt对象树

    一 什么是对象树 Qt中的对象树就是Qt中对象间的父子关系 每一个对象都有它所有子对象的指针 都有一个指向其父 二 示例 1 创建一个MyPushButton对象 继承QPushButton 2 在mypushbutton cpp中对MyP
  • virtIO前后端notify机制详解

    本来这是在前端驱动后期分析的 但是这部分内容比较多 且分析了后端notify前端的机制 所以还是单独拿出一节分析比较好 还是拿网络驱动部分做案例 网络驱动部分有两个队列 忽略控制队列 接收队列和发送队列 每个队列都对应一个virtqueue
  • FFmpeg:UDP外网传输花屏严重问题完美解决

    1 前言 最近发现 UDP外网传输是 丢帧严重 我的环境是 视频流是济南移动 播放端是济南电信家庭宽带 由于视频流没有固定IP 所以我想了一个办法 让视频流网络穿透 直接点对点传输到我的播放端 但是发现我的播放端花屏严重 如下图 2 解决
  • 如何选择开源许可证?

    作者 阮一峰 日期 2011年5月 2日 如何为代码选择开源许可证 这是一个问题 世界上的开源许可证 大概有上百种 很少有人搞得清楚它们的区别 即使在最流行的六种 GPL BSD MIT Mozilla Apache和LGPL 之中做选择
  • R语言与金融数据分析 浙江工商学院 第一章:R简介 测试和作业

    本次作业数量为2题 作业互评时按每题50分 合计100分批改 统计成绩时系统会自动折算 要求在规定时间内完成并递交 采取同学互评的形式批改 请大家注意截止时间 按时完成 依照学术诚信条款 我保证此回答为本人原创 所有回答中引用的外部材料已经
  • 解决报错ImportError: IProgress not found. Please update jupyter and ipywidgets

    在终端 pip install ipywidgets 然后重启jupyter notebook即可
  • mysql 修改字符编码

    修改表的字符编码 查看 show create table ods goods alter table ods goods default character set utf8 修改字段的字符编码 alter table ods goods
  • 学MySQL的前置条件--会不断更新

    在MySQL软件中关于数据的操作无非就是CRUD C 插入数据记录操作 create R 查询数据记录操作 read U 更新数据记录操作 update D 删除数据操作记录 delete 所有的SQL语言中 学明白了CRUD加上实战几年
  • IDA+VirtulKD+VMware实现高速双机调试

    目录 前言 一 环境 二 配置步骤 1 配置VirtualKD 2 配置IDA 前言 我尝试只使用windbg作为调试器 但它界面不够友好 我又尝试使用IDA作为调试器 但是使用pipe传输速度太慢了 导致IDA卡的不行 单步特慢 前段时间
  • 在nginx中部署https服务,详细步骤

    目录 前言 一 https是什么 二 部署步骤 1 下载SSL证书 2 上传文件 3 解压文件 4 在nginx conf配置文件中 修改https服务 5 修改hosts文件 6 http跳转到https中 三 注意事项 前言 Web服务
  • 线程管理之Thread类相关方法简介

    CurrentThread 静态方法 currentThread 方法可返回代码段正在被那个线程调用的信息 简单案列 打印main 方法 正在被那个线程调用 package com zzg thread import com zzg obj
  • [工具使用]黑暗引擎FOFA

    黑暗引擎FOFA FOFA 点我进入 逻辑运算符 搜索子域名domain 搜索指定内容的host全部域名 body cert 搜索选定应用的网站 搜索指定开放端口的IP 搜索指定协议的IP 搜索IP或者网段的信息 搜索指定CSS JS网站
  • 物联网毕设选题 机器视觉口罩佩戴检测系统 - 单片机 stm32 嵌入式

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 设计原理 5 部分核心代码 6 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学弟学妹告诉
  • VSCode插件开发

    VSCode插件开发 文章目录 VSCode插件开发 创建项目 Extension ts Package json Contribution Points Activation Events 创建项目 npm g i yo generato
  • 【Linux旅行记】进度条小程序

    文章目录 一 预备知识 1 1回车换行 1 2缓冲区 二 倒计时 三 进度条 3 1普通版本源代码 3 2高级版本源代码 小结 博客主页 小智 x0 0x 欢迎关注 点赞 收藏 留言 系列专栏 Linux入门到精通 代码仓库 小智的代码仓库
  • word中目录右边页码对不齐解决方法

    这个目录对不齐原因未知 解决方法 1 在视图中打开标尺 2 选择对不齐的目录项 如果整个目录都有出现不对齐 选择整个目录 3 拖动标尺 进行对齐 4 被治愈了
  • GDB调试的基本使用、GDB调试多进程

    1 编译时加选项 g 生成具有调试信息的程序 gcc g test c o test 2 启动GDB 1 启动GDB gdb test 2 设置运行时参数 主函数中可接收运行时参数 set args 设置运行时参数 如set args 10