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++程序,可以使用gcc
或g++
的-g
选项。例如:
gcc -g -o my_program my_program.c
或者
g++ -g -o my_program my_program.cpp
如果使用的是 CMake,确保你设置了 CMAKE_BUILD_TYPE
为 Debug
,这样 CMake 会添加 -g
到编译选项中。
在 CMakeLists.txt
文件中,添加或修改如下:
set(CMAKE_BUILD_TYPE Debug)
3. 启动GDB
运行GDB并加载程序:
gdb my_program
如果需要直接运行程序并调试,也可以使用以下命令:
gdb --args my_program arg1 arg2
其中arg1
、arg2
是程序的命令行参数。
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>