实战指南:GDB调试、Coredump分析与Valgrind内存检测全解析

1. 开发调试利器GDB实战指南

记得我刚入行那会儿,最头疼的就是程序运行着突然崩溃,然后一脸茫然不知道从哪里开始排查。后来师傅教我使用了GDB,简直像是打开了新世界的大门。GDB就像是程序的X光机,能让你看清楚代码内部的每一个执行细节。

首先要确保编译时加上-g选项,这个选项会在可执行文件中嵌入调试信息。比如在Makefile中这样写:

CC = gcc
CFLAGS = -g -Wall

demo: demo.c
    $(CC) $(CFGFLAGS) -o demo demo.c

这样编译出来的程序就包含了调试信息,GDB才能显示具体的代码行和变量信息。

启动GDB很简单,直接运行gdb your_program就进入了调试环境。我习惯先用list命令查看代码结构,这样心里有个底。GDB的帮助系统很强大,输入help可以看到12个大类命令,比如想查看断点相关的命令就用help breakpoints

设置断点是调试的核心技能。我经常使用break filename:lineno在特定文件的特定行设置断点,或者用break function_name在函数入口处中断。更高级的是条件断点,比如break main.c:20 if count > 100,只有当count大于100时才会触发断点。

# 启动GDB
gdb ./demo

# 在main函数设置断点
(gdb) break main

# 在第20行设置条件断点
(gdb) break demo.c:20 if count > 100

# 查看所有断点
(gdb) info breakpoints

运行程序用run命令,程序会在第一个断点处暂停。这时候可以用next单步执行(不进入函数),或者用step单步执行(进入函数内部)。我有个小技巧:如果想让程序连续执行多步,可以用next 3这样执行3步后再暂停。

监视变量值变化是调试的另一个重要环节。print variable_name可以打印变量当前值,但如果想持续监视变量变化,最好使用watch variable_name设置观察点。一旦变量值发生变化,程序就会自动暂停。

# 运行程序
(gdb) run

# 单步执行
(gdb) next

# 打印变量值
(gdb) print count

# 设置观察点
(gdb) watch count

有时候为了测试特定场景,我需要临时修改变量值。GDB的set var variable=value命令非常实用,比如set var count=0可以将count强制设为0,测试边界情况。

当程序调用层次较深时,backtrace命令(缩写bt)可以显示完整的调用栈,让你清楚知道当前执行位置在调用链的哪个环节。如果需要查看特定栈帧的详细信息,可以用frame n切换到第n层栈帧。

实际调试中我经常遇到多线程问题。GDB的info threads可以显示所有线程信息,thread n可以切换到指定线程进行调试。这对于排查死锁、竞态条件等问题特别有用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值