gdb常用命令

1.开启Core崩溃状态采集(Core Dump)

Core Dump(核心转储)是指将程序运行时的内存状态(包括程序的代码、数据、堆栈等信息)保存到一个文件中。这个文件通常被称为“core 文件”或“core dump 文件”

1. 启用Core Dump

首先需要确保系统允许生成Core文件。

修改 ulimit 设置

ulimit 用于设置当前shell会话的资源限制。默认情况下,很多Linux系统会限制Core文件的生成大小。你可以使用以下命令查看当前的设置:

ulimit -c

如果返回值是0,表示当前不允许生成Core Dump。

  • 临时设置:在运行程序之前,再次确认 ulimit 设置:

    ulimit -c unlimited
  • 永久设置

    echo "ulimit -c unlimited" >> ~/.bashrc
    source ~/.bashrc

如果希望这个设置永久生效,可以将它添加到用户的启动配置文件(如 ~/.bashrc/etc/profile)中:

ulimit -S -c unlimited > /dev/null 2>&1
2. 配置Core文件路径

默认情况下,Core文件会生成在程序运行目录。如果希望将Core文件保存到指定目录,可以通过修改 core_pattern 来设置路径。编辑 /etc/sysctl.conf 或者直接使用 sysctl 命令:

kernel.core_pattern=./core_%t_%p_%e
kernel.core_uses_pid = 1

然后应用配置:

sudo sysctl -p

3.使用这个 Core 文件来调试程序

1. 启动 GDB
gdb ./client core_1743515142_231272_client
2. 查看堆栈信息
backtrace
3. 查看变量和寄存器
info locals   # 查看当前函数中的局部变量
info args     # 查看当前函数的参数
info registers  # 查看寄存器状态
4. 检查崩溃点
list your_function_name
5. 检查指针和内存访问

段错误通常是由于无效的指针访问或越界访问引起的。检查崩溃点附近的代码,确认是否有以下问题:

  • 未初始化的指针。

  • 已释放的指针。

  • 数组或内存越界访问。

2. 编译程序

在使用GDB之前,需要确保程序在编译时启用了调试信息。对于C/C++程序,可以使用gccg++-g选项。例如:

gcc -g -o my_program my_program.c

或者

g++ -g -o my_program my_program.cpp

如果使用的是 CMake,确保你设置了 CMAKE_BUILD_TYPEDebug,这样 CMake 会添加 -g 到编译选项中。

CMakeLists.txt 文件中,添加或修改如下:

set(CMAKE_BUILD_TYPE Debug)

3. 启动GDB

运行GDB并加载程序:

gdb my_program

如果需要直接运行程序并调试,也可以使用以下命令:

gdb --args my_program arg1 arg2

其中arg1arg2是程序的命令行参数。


4. 基本命令

(1) 设置断点
  • 在指定行设置断点:

    break <filename>:<line_number>
    break main.c:10
  • 在函数入口设置断点:

    break <function_name>
    break main
(2) 运行程序
  • 开始运行程序:

    run
  • 如果程序需要参数,可以在run命令后直接添加参数:

    run arg1 arg2
(3) 查看断点
  • 列出所有断点:

    info breakpoints
(4) 删除断点
  • 删除指定编号的断点:

    delete <breakpoint_number>
  • 删除所有断点:

    delete

5. 程序运行控制

(1) 单步执行
  • 单步执行(进入函数内部):

    step
  • 单步执行(不进入函数内部):

    next
(2) 继续运行
  • 在断点处停止后,继续运行程序:

    continue
(3) 返回上一层函数
  • 如果当前在函数内部,返回到调用该函数的地方:

    finish

5. 查看变量和内存

(1) 查看变量
  • 查看变量的值:

    print <variable_name>
(2) 修改变量
  • 修改变量的值:

    set <variable_name> = <value>

    例如:

    set x = 10
(3) 查看内存
  • 查看内存地址的内容:

    x/<format> <address>

    其中<format>可以是b(字节)、h(半字)、w(字)等,<address>是内存地址。 例如:

    x/10b 0x12345678

6. 查看调用栈

  • 查看当前调用栈:

    backtrace
    bt

7. 退出GDB

  • 退出GDB:

    quit

8. 其他常用命令

  • list:查看源代码。

  • info locals:查看当前函数的局部变量。

  • watch:设置观察点,当变量值发生变化时暂停程序。

    watch <variable_name>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值