GDB典型开发场景深度解析

GDB典型开发场景深度解析

以下是开发过程中最常见的GDB使用场景,结合具体实例和调试技巧,帮助开发者高效解决实际问题:


一、崩溃分析(Core Dump调试)

场景:程序突然崩溃,生成了core文件

# 启动调试
gdb ./myapp core.1234

诊断流程

查看崩溃位置
检查调用栈
分析变量状态
定位异常内存访问

实例操作

(gdb) bt
#0  0x00005555555551a9 in process_data (ptr=0x0) at src/data.c:25
#1  0x00005555555551e2 in main () at src/main.c:15(gdb) frame 0
(gdb) p *ptr
Cannot access memory at address 0x0  # 空指针解引用(gdb) info locals
data_buffer = 0x7fffffffd2a0
buffer_size = 1024(gdb) x/4xw data_buffer
0x7fffffffd2a0: 0xdeadbeef  0x00000000  0x00000000  0x00000000

二、死锁检测(多线程调试)

场景:多线程程序卡死,疑似死锁

(gdb) info threadsId   Target Id         Frame 
* 1    Thread 0x7f... (LWP 123)  __lll_lock_wait () at lowlevellock.c:522    Thread 0x7f... (LWP 456)  __lll_lock_wait () at lowlevellock.c:52(gdb) thread 1
(gdb) bt
#0  __lll_lock_wait () at lowlevellock.c:52
#1  0x00007f... in pthread_mutex_lock (mutex=0x55555555a2a0) at pthread_mutex_lock.c:115
#2  0x000055... in worker_thread1 (arg=0x0) at src/threads.c:30(gdb) thread 2
(gdb) bt
#0  __lll_lock_wait () at lowlevellock.c:52
#1  0x00007f... in pthread_mutex_lock (mutex=0x55555555a2c0) at pthread_mutex_lock.c:115
#2  0x000055... in worker_thread2 (arg=0x0) at src/threads.c:45

死锁分析表

线程持有锁等待锁位置
1mutexAmutexBthreads.c:30
2mutexBmutexAthreads.c:45

解决方案

  1. 统一锁获取顺序
  2. 使用pthread_mutex_trylock()
  3. 添加锁超时机制

三、内存泄漏追踪

场景:程序运行后内存持续增长

# 在内存分配/释放函数设断点
(gdb) b malloc
(gdb) b free# 添加命令自动记录
(gdb) commands
>silent
>bt 3      # 打印3层调用栈
>continue
>end(gdb) run

内存分配追踪示例

Breakpoint 1, malloc (size=1024) at malloc.c:105
#0  malloc (size=1024) at malloc.c:105
#1  0x000055... in create_buffer (size=1024) at src/memory.c:22
#2  0x000055... in process_request () at src/network.c:88

泄漏检测技巧

  1. 使用watch监控未释放的指针
    (gdb) watch -l *(void**)ptr_addr
    
  2. 结合Valgrind:
    valgrind --leak-check=full ./myapp
    

四、竞态条件调试

场景:多线程程序出现非确定性错误

# 设置观察点监控共享变量
(gdb) watch -l global_counter# 设置条件断点
(gdb) b src/worker.c:55 if global_counter > 100# 线程锁定
(gdb) set scheduler-locking on

调试策略

  1. 重现问题后检查线程状态:
    (gdb) thread apply all bt
    
  2. 检查共享变量历史:
    (gdb) set logging file trace.log
    (gdb) set logging on
    (gdb) display global_counter
    (gdb) continue
    

五、性能瓶颈分析

场景:特定函数执行时间过长

# 在目标函数设断点并统计命中次数
(gdb) b process_data
(gdb) commands
>silent
>set $count = $count + 1
>continue
>end(gdb) run
# 运行结束后查看调用次数
(gdb) p $count
$1 = 14298# 采样分析
(gdb) start
(gdb) while 1
>shell perf record -p `pidof myapp` -g sleep 0.1
>continue
>end

性能热点定位

  1. 使用perf生成火焰图:
    perf script | stackcollapse-perf.pl | flamegraph.pl > perf.svg
    

在这里插入图片描述

六、生产环境调试

场景:无法在开发环境复现的生产环境问题

核心转储配置

# 启用core dump
ulimit -c unlimited
echo "/tmp/core-%e-%p-%t" > /proc/sys/kernel/core_pattern# 离线调试
gdb -c /tmp/core-myapp-1234-162000000 ./myapp

实时调试技巧

# 附加到运行进程
gdb -p 1234# 不中断程序设置观察点
(gdb) catch syscall exit_group  # 程序退出时中断
(gdb) continue# 动态修改代码
(gdb) set {int}0x400510 = 0x90909090  # NOP掉问题指令

七、网络应用调试

场景:网络服务响应异常

# 监控socket系统调用
(gdb) catch syscall socket
(gdb) catch syscall sendto
(gdb) catch syscall recvfrom# 检查连接状态
(gdb) p *((struct sockaddr_in*)&client_addr)
$1 = {sin_family = 2, sin_port = 57344, sin_addr = {s_addr = 16777343}}# 数据包检查
(gdb) x/32xb send_buffer
0x7fffffffda00: 0x48 0x54 0x54 0x50 0x2f 0x31 0x2e 0x31
0x7fffffffda08: 0x20 0x32 0x30 0x30 0x20 0x4f 0x4b 0x0d

网络调试工具链

工具用途GDB集成方式
tcpdump抓包分析!tcpdump -i eth0
netstat连接状态!netstat -tunap
strace系统调用跟踪strace -p <pid>

八、GUI应用调试

场景:图形界面无响应或渲染异常

# 附加到GUI进程
gdb -p $(pidof mygui)# 设置X11事件断点
(gdb) b XNextEvent# 检查OpenGL状态(需调试符号)
(gdb) p *gl_context
$1 = {viewport = {0, 0, 1920, 1080},shader_program = 42,textures = {0x607260, 0x607280, 0x0}
}# 渲染诊断
(gdb) call glGetError()
$2 = 1282  // GL_INVALID_OPERATION

图形调试工具

  1. RenderDoc:帧捕获分析
  2. apitrace:图形API跟踪
  3. GDB TUI模式实时查看界面状态

九、脚本化调试

场景:自动化重复调试任务

# 调试脚本 (debug.gdb)
set pagination off
b main
run
while 1if $pc == 0x400550p/x *buffer_ptrendstepi
end# 执行脚本
gdb -x debug.gdb ./myapp

自动化调试场景

  1. 崩溃重现路径记录
  2. 内存泄漏自动化检测
  3. 单元测试故障注入
# 故障注入示例
b compute_result
commandsset *(&input_data) = 0x7FFFFFFF  // 注入最大值continue
end

十、内核模块调试

场景:Linux内核模块崩溃

# 配置KGDB
echo ttyS0 > /sys/module/kgdboc/parameters/kgdboc# 目标机器
gdb vmlinux
(gdb) target remote /dev/ttyS0
(gdb) lx-symbols drivers/mymodule  # 加载模块符号

内核调试命令

(gdb) b mymodule_init
(gdb) b *(0xffffffffc00a3000+0x125)  # 模块内地址# 查看内核数据结构
(gdb) p *current
$1 = {state = 0, stack = 0xffff888007e2c000, usage = ...}(gdb) lx-ps  # 查看进程列表

开发调试决策树

程序异常
崩溃?
卡死?
错误结果?
性能问题?
Core Dump分析
死锁检测
数据断点
性能剖析
bt+frame分析
thread apply all bt
watch+条件断点
perf+调用统计
空指针/越界
锁依赖分析
竞态条件
热点函数优化

掌握这些典型场景的调试技巧,可解决90%以上的开发问题。关键点:

  1. 崩溃分析:优先btframeinfo locals三部曲
  2. 并发问题:结合watch和线程状态分析
  3. 内存问题:malloc/free断点+Valgrind组合
  4. 性能优化:采样统计与热点定位
  5. 生产调试:核心转储+远程调试能力
  6. 自动化:GDB脚本提高复杂问题调试效率

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/95766.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/95766.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

存储、硬盘、文件系统、 IO相关常识总结

目录 &#xff08;一&#xff09;存储 &#xff08;1&#xff09;定义 &#xff08;2&#xff09;分类 &#xff08;二&#xff09;硬盘 &#xff08;1&#xff09;容量&#xff08;最主要的参数&#xff09; &#xff08;2&#xff09;转速 &#xff08;3&#xff09;访…

docker安装mongodb及java连接实战

1.docker部署mongodb docker run --name mongodb -d -p 27017:27017 -v /data/mongodbdata:/data/db -e MONGO_INITDB_ROOT_USERNAMEtestmongo -e MONGO_INITDB_ROOT_PASSWORDtest123456 mongodb:4.0.112.项目实战 <dependencies><dependency><groupId>org.m…

Java设计模式之《工厂模式》

目录 1、介绍 1.1、定义 1.2、优缺点 1.3、使用场景 2、实现 2.1、简单工厂模式 2.2、工厂方法模式 2.3、抽象工厂模式 3、小结 前言 在面向对象编程中&#xff0c;创建对象实例最常用的方式就是通过 new 操作符构造一个对象实例&#xff0c;但在某些情况下&#xff0…

【异步】js中异步的实现方式 async await /Promise / Generator

JS的异步相关知识 js里面一共有以下异步的解决方案 传统的回调 省略 。。。。 生成器 Generator 函数是 ES6 提供的一种异步编程解决方案, 语法上&#xff0c;首先可以把它理解成&#xff0c;Generator 函数是一个状态机&#xff0c;封装了多个内部状态。执行 Generator 函数…

JVM字节码文件结构

Class文件结构class文件是二进制文件&#xff0c;这里要介绍的是这个二级制文件的结构。思考&#xff1a;一个java文件编译成class文件&#xff0c;如果要描述一个java文件&#xff0c;需要哪些信息呢&#xff1f;基本信息&#xff1a;类名、父类、实现哪些接口、方法个数、每个…

11.web api 2

5. 操作元素属性 5.1操作元素常用属性 &#xff1a;通过 JS 设置/修改标签元素属性&#xff0c;比如通过 src更换 图片最常见的属性比如&#xff1a; href、title、src 等5.2 操作元素样式属性 &#xff1a;通过 JS 设置/修改标签元素的样式属性。使用 className 有什么好处&a…

java中数组和list的区别是什么?

在Java中&#xff0c;数组&#xff08;Array&#xff09;和List&#xff08;通常指java.util.List接口的实现类&#xff0c;如ArrayList、LinkedList&#xff09;是两种常用的容器&#xff0c;但它们在设计、功能和使用场景上有显著区别。以下从核心特性、使用方式等方面详细对…

Python爬取推特(X)的各种数据

&#x1f31f; Hello&#xff0c;我是蒋星熠Jaxonic&#xff01; &#x1f308; 在浩瀚无垠的技术宇宙中&#xff0c;我是一名执着的星际旅人&#xff0c;用代码绘制探索的轨迹。 &#x1f680; 每一个算法都是我点燃的推进器&#xff0c;每一行代码都是我航行的星图。 &#x…

Oracle数据库文件管理与空间问题解决指南

在Oracle数据库运维中&#xff0c;表空间、数据文件及相关日志文件的管理是保障数据库稳定运行的核心环节。本文将系统梳理表空间与数据文件的调整、关键文件的移动、自动扩展配置&#xff0c;以及常见空间不足错误的排查解决方法&#xff0c;为数据库管理员提供全面参考。 一、…

华为实验综合小练习

描述&#xff1a; 1 内网有A、B、C 三个部门。所在网段如图所示。 2 内网服务器配置静态IP,网关192.168.100.1。 3 sw1和R1之间使用vlan200 192.168.200.0/30 互联。 4 R1向运营商申请企业宽带并申请了5个公网IP&#xff1a;200.1.1.1-.5子网掩码 255.255.255.248&#xff0c;网…

Flink面试题及详细答案100道(1-20)- 基础概念与架构

《前后端面试题》专栏集合了前后端各个知识模块的面试题&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

爬虫逆向之滑块验证码加密分析(轨迹和坐标)

本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的。否则由此产生的一切后果均与作者无关&#xff01;在爬虫开发过程中&#xff0c;滑块验证码常常成为我们获取数据的一大阻碍。而滑块验证码的加密方式多种多样&#xff0c;其中轨迹加密和坐标加密是比较常见的…

微信小程序实现导航至目的地

本人做的导航页面相关功能和效果的代码 javascript相关 Page({data: {markers: [],latitude: , // 中心点坐标longitude: ,FIXED_LAT: 31.2304, // 1. 写死的目标点坐标, 示例&#xff1a;上海人民广场FIXED_LNG: 121.4737},onLoad: function () {// 如果要显示地图可以看onLo…

中国科学社简史

中国科学社简史中国科学社&#xff0c;作为中国近代史上第一个民间综合性科学团体&#xff0c;为中国现代科学文化事业的发展做出了卓越贡献。其历程不仅见证了中国科学从萌芽到蓬勃发展的转变&#xff0c;还反映了中国科学体制化的艰难探索与辉煌成就。中国科学社的起源可追溯…

若尔当型,Jordon Form

文章目录一、相似二、若尔当型1.1 认识若尔当型1.2 凯莱-哈密顿定理 (Cayley-Hamilton Theorem)一、相似 Every matrix CB−1ABC B^{-1}ABCB−1AB has the same eigenvalues as A. These C’s are similar to A. 任意一个矩阵C&#xff0c;满足 CB−1ABC B^{-1}ABCB−1AB 都和…

解决uni-app微信小程序编译报错:unexpected character `1`

问题原因在uni-app微信小程序开发中&#xff0c;当template模板中包含英文符号<或>时&#xff0c;微信小程序的编译器会将这些符号误认为是HTML标签的开闭符号&#xff0c;从而导致类似unexpected character 1的编译错误。错误示例<view class"plan-bmi">…

[Linux] RAID存储技术

目录 RAID实现方式 RAID 0 RAID 1 RAID 5 RAID 10 管理RAID0 创建RAID 查看RAID 格式化和挂载 删除RAID 管理RAID1 创建RAID 查看RAID 格式化和挂载 增加热备盘 模拟故障 删除故障磁盘 删除RAID 管理RAID5 创建RAID 查看RAID md5设备划分分区 RAID实现方…

程序设计|C语言教学——C语言基础4:进阶

一、预处理指令预处理指令在编译前执行&#xff0c;除了#include&#xff0c;还有以下常用指令&#xff1a;1. #define 宏定义无参宏&#xff1a;定义常量或代码片段&#xff0c;编译时直接替换&#xff08;无类型检查&#xff09;。#define PI 3.1415926 // 定义常量 #define…

数据结构之heap算法

文章目录前言1. heap结构概述2. push_heap3. pop_heap4. sort_heap5. make_heap前言 heap这种数据结构&#xff0c;允许用户以任何次序将任何数据放入该结构中&#xff0c;但是最后取出数据的时候一定是权值最高&#xff08;或者最低&#xff09;的元素。主要和实现有关&#x…

MCU 软件断点调试注意事项!!!

——为什么调试器会在运行中改我的Flash程序&#xff1f;调试单片机时&#xff0c;很多人都有这样的疑问&#xff1a;明明我在调试前刷进去的固件是好的&#xff0c;为什么加了一个断点之后&#xff0c;调试器居然去改了 Flash&#xff1f; 如果我拔掉调试器&#xff0c;这个固…