GDB调试器

本文详细介绍了使用GDB进行程序调试的各种操作,包括禁用编译优化、添加和管理断点、查看调用堆栈、监控变量变化以及切换线程等。通过这些技巧,开发者可以更有效地定位和解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编译带调试信息的程序

# 禁用编译器优化,便于查阅代码时对齐
gcc -g hello.c -o hello -O0

# 移除调试信息
strip hello

启动调试

  • 调试未启动的程序
gdb hello
  • 调试已启动的程序
# 获取进程PID
ps -ef | grep hello
# attach 进程
gdb attach 进程PID
# 结束调试,gdb和程序分离,程序继续运行
detach
quit

常用命令

  • tbreak
    添加一个临时断点,断点一旦被触发就会被自动删除

  • backtrace(bt)
    查看当前所在线程的调用堆栈

  • frame
    切换堆栈编号 frame 堆栈编号 ,查看调用关系

  • info break
    查看断点信息

  • enable、disable、delete
    启用,禁用,删除断点,命令后面如果不加编号则作用于所有断点

  • list(l)
    查看当前断点处附近的代码,也可以查看某文件某一行的代码。list - 从当前位置向前显示10行代码

  • print(p)
    输出变量的值,也可以输出特定表达式的值,或者函数执行的结果;也可以修改变量的值

p server.port       # 打印
p server.port=1080  # 修改值
  • info threads
    查看当前进程的所以线程信息

  • thread
    切换到某一线程 thread 2

  • info args
    打印线程中断处调用函数参数的值

  • next

  • step

  • finish、return

    • finish 执行完整的函数体,正常返回上层调用
    • return 从函数当前位置立即返回上层,不执行剩余代码
  • until(u)
    运行到指定的行

  • disassemble
    输出当前函数的汇编指令,默认格式为AT&T格式

# intel 汇编格式
set disassembly-flavor intel
disassemble
  • watch
    监视一个变量或者一段内存,当变量或者内存处值发生变化,gdb就会中断。当观察点是局部变量时,局部变量失效后,观察点也会失效。
int i
watch i

char *p
watch p   # p本身 *(&p)
watch *p  # p所指的内存的值

char buf[128]
watch buf
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值