当前位置: 首页 > news >正文

段错误?死锁?Core Dump不会用?3个GDB技巧让你调试效率翻倍

段错误?死锁?Core Dump不会用?3个GDB技巧让你调试效率翻倍

嵌入式开发里最浪费时间的事情是什么?不是写代码,是找bug。尤其是那些"我代码逻辑没问题啊,怎么就崩了"的bug。

今天聊3个GDB实战技巧,每一个都是我在调试Linux驱动和嵌入式应用时反复用到的。不扯理论,直接上命令。


技巧一:搞定段错误——从Core Dump回溯现场

段错误是嵌入式开发者的老朋友了。指针飞了、数组越界、栈溢出,结果都是SIGSEGV。

第一步:打开Core Dump

默认系统不开core dump,先打开:

ulimit-cunlimitedecho"/tmp/core.%p.%e">/proc/sys/kernel/core_pattern

这样程序崩溃后,/tmp/core.1234.myapp就有了。

第二步:回溯现场

gdb ./myapp /tmp/core.1234.myapp(gdb)bt(gdb)bt full(gdb)info registers

bt看调用栈,bt full看每层函数的局部变量值。80%的段错误,一看到崩溃在哪个函数、传了什么参数,马上就能定位。

第三步:查看内存

有时候崩溃在memcpy里,bt看到的是libc的栈帧,没用。这时候看参数:

(gdb) frame 1 # 切到上一帧(调用memcpy的代码) (gdb) info args (gdb) p src (gdb) p dst (gdb) p/x *src@20 # 打印src指向的前20个字节

真实案例:一次调试WiFi驱动,skb->data指向了已释放的内存。运行几小时后随机崩溃。bt一看在memcpy,打印src发现地址在kmalloc-128 slab之外,一查是上层模块提前kfree_skb了。半小时定位,之前纯靠加printk搞了三天没找到。


技巧二:条件断点+自动化——调试时序问题

嵌入式里最恶心的一类bug:跑100次偶尔崩1次。条件断点就是干这个的。

条件断点

(gdb) break gpio_irq_handler if irq_num == 42 (gdb) break kmalloc if size > 4096 (gdb) break my_func if strcmp(name, "sensor0") == 0

自动打印+继续

调试中断处理或者驱动probe时,不想每次都手动敲命令:

(gdb) break device_probe (gdb) commands > printf "Probing %s\n", pdev->name > print devm_kzalloc(pdev, 0x1000) > continue > end

观察点(Watchpoint)

调试"哪个不要脸的改了我的变量":

(gdb) watch my_global_var # 写触发 (gdb) rwatch my_global_var # 读触发 (gdb) awatch my_global_var # 读写都触发

真实案例:调试一个I2C触摸屏驱动,g_touch_state总是不对。怀疑被别的模块改了但找不到。watch g_touch_state一上,断下来发现是DMA完成回调里直接写了共享内存——但锁机制没覆盖这个路径。5分钟找到,之前printk打了一百行没看出来。


技巧三:远程调试(gdbserver)——嵌入式板子的标配

嵌入式开发,程序跑在ARM/MIPS板子上,调试器在主机的x86上。用gdbserver:

板子端

# 编译带调试符号的目标程序arm-linux-gnueabihf-gcc-g-O0-omyapp myapp.c# 板子上启动gdbservergdbserver :2345 ./myapp

主机端

arm-linux-gnueabihf-gdb ./myapp(gdb)target remote192.168.1.100:2345(gdb)continue

剩下的和在本地一样,break、next、print全部操作远程板子的内存和寄存器。

小技巧:加载内核模块调试符号

调试驱动时:

# 板子上insmod mydriver.kocat/sys/module/mydriver/sections/.textcat/sys/module/mydriver/sections/.datacat/sys/module/mydriver/sections/.bss# GDB里(gdb)add-symbol-file mydriver.o 0x<.text地址>-s.data 0x<.data地址>-s.bss 0x<.bss地址>

然后就可以在驱动函数里打断点、单步调试了。比printk刷日志爽一百倍。

target remote

add-symbol-file

断点/单步

BKPT指令

主机 x86

gdbserver on ARM板

被调试进程

GDB 符号解析

内核模块符号

硬件调试寄存器


课后练习

  1. 写一个故意段错误的程序(比如解引用空指针),编译后用gdb的bt定位到具体行
  2. 用watchpoint找出"谁改了全局变量"
  3. 配置一个gdbserver+QEMU的远程调试环境,验证远程断点可用

一句话总结

三个技巧吃透了,大部分嵌入式调试场景不用再加printk重编。尤其Core Dump和远程调试,省的是实打实的编译部署时间,一次省半小时,一个月下来够你摸好几天的鱼。

http://www.jsqmd.com/news/1169186/

相关文章:

  • 广东正规文武学校哪家强?认准嵩山少林小龙文武学校!40年老校实力详解 - 全国文武学校招生
  • 研发协作工具迁移实战:从Coding Lite停用到云效落地
  • 图像标注工具LabelImg:免费开源的数据标注神器
  • 2026年7月最新乌鲁木齐宝珀官方售后客户服务电话及线下网点地址 - 宝珀官方售后服务中心
  • 主流文档预处理工具
  • 商用会议屏幕共享源码发布,私有化会议系统协作链路完善 - 壹软科技
  • SysML v2:三大架构革新如何重塑复杂系统建模范式?
  • AI搜索优化实战:Webflow+Claude批量优化300+博客内容
  • 软考模拟软件-系统架构设计师 Hyper-v版
  • 宝珀中国官方售后服务中心|官方地址及24小时售后电话权威信息声明(2026年7月最新) - 宝珀官方售后服务中心
  • 商用多人音视频会议源码发布,企业会议平台多端能力升级 - 壹软科技
  • 2026年7月最新天梭杭州大悦城维修保养服务电话 - 天梭服务中心
  • 2026制造业工业智能体服务商全景评测:市场调研数据拆解、6家头部机构优劣对比、六点选型避坑标准 - 互联网科技品牌测评
  • 汽配厂既做研发加计又做出口退税,两笔账怎么不打架?|口径不冲突实操 - 欢欢在创业
  • QMCDecode:Mac平台QQ音乐加密格式转换技术解析
  • 2026年7月最新泰州劳力士官方售后客户服务热线与维修网点地址汇总 - 劳力士官方服务中心
  • 小新PAD pro 2021 zui15 root
  • 2026企业AI Agent软件哪家好?智能体开发部署运维全链路能力是关键
  • Java开发者必备的代码质量检查工具推荐
  • 2026 年现阶段龙岗专业的报刊亭生产商选哪家,旧地图折角处,藏着你未曾发现的城市秘密角落 - 品质体验官
  • 3天从零掌握LabelImg图像标注:免费开源工具实战完全指南
  • 2026年瓷砖区域经销商如何用一物一码解决窜货乱价定价难题 - 紫棠月云霞
  • 2026.07深圳企业AI智能体服务商精选榜单
  • Java游戏集成Steamworks4j:成就、云存档与多人联机实战指南
  • 查询一个apk是否包含32-bit 64bit的方法!
  • 亲身探访广州万国官方售后服务中心|完整热线电话与网点地址(2026年7月最新) - 万国中国官方服务中心
  • Nchu Aircraft Instrument Panel
  • 6个改变硕博论文写作的信息工具与实操方法
  • 长沙靠谱收钻门店精选,高报价无套路持证实体稳居优选 - 讯息早知道
  • CVE-2026-31694 漏洞深度分析:Linux 内核 FUSE 组件存在本地提权风险,普通用户可直取 root 权限