GDB使用方法及问题排查

本文详细介绍了GDB的基本操作,包括开启调试、查看core文件和使用Watch点定位问题。此外,还分析了程序崩溃和卡死的常见原因,如内存访问错误和死锁。文章提及Valgrind工具集,特别是memcheck和Helgrind,用于检测内存错误和多线程问题。最后,提供了参考资料以供深入学习。
摘要由CSDN通过智能技术生成

1. GDB基本操作

(1) 开启GDB调试
  • 调试可执行文件program,一般直接在需要调试的文件目录下执行。注意,待调试的文件需要使用-g参数编译才能使用GDB调试。

    $gdb program

    gdb gateway

  • 常用操作

    r(run) 开始调试,会自动跳到第一个断点,若没有断点,直到执行完代码或错误停止。

    l(list) 查看当前执行代码上下文,方便调试过程中查看代码。

    n(next) 单步调试,执行下一句代码,若下一句代码为函数调用,不进入函数内部执行。

    s(step) 进入函数内部调试。

    c(continue) 继续执行,直到下一个断点或错误停止。

    p(print) x 打印出x的当前值。

    until l 直接运行至指定行数l。

    f(finish) 运行程序直到程序结束。

    q(quit) 退出gdb。

  • 断点相关操作

    info break 查看当前所有断点的信息。

    b(break) 13 在第13行设置一个断点。

    b main 在main函数入口处设置一个断点。

    break server.cpp:25 在当前文件夹下其他文件server.cpp中的第25行设置断点。

    break sdk/net/ws.cpp:28 在当前项目其他文件ws.cpp中的第28行设置断点。

    delete 5删除编号为5的断点。

    disable/enable 25 禁用/启用编号为25的断点。

    break 15(where) if i3(condition) 假设第15行代码为for(int i = 0; i < 10; ++i),当执行该语句且i3时,此处断点生效。

在实际项目中,需要多次调试同一个文件,因此保留每次调试的断点设置是很有必要的,gdb中也提供这样的功能,能够方便的存储和读取断点。

  1. 保存断点

先用info b 查看一下目前设置的断点,使用save breakpoint命令保存到指定的文件,这里以进程名字+bp后缀为文件名,输入命令

save breakpoint gateway.bp

  1. 读取断点

注意,在gdb已经加载进程的过程中,是不能够读取断点文件的,必须在gdb加载文件的命令中指定断点文件,具体操作是使用-x参数。例如,我需要调试gateway_server这个文件,同时使用上次存储的断点文件gateway.bp。输入命令

gdb gateway_server -x gateway.bp

  • 多线程调试

info thread 查看当前进程的线程。

thread 切换调试的线程为指定ID的线程。

(2) GDB查看core文件,定位问题代码

core是程序非法执行后core dump后产生的文件。测试源代码如下图࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员之光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值