GDB调试与coredump详解
创作时间:
作者:
@小白创作中心
GDB调试与coredump详解
引用
CSDN
1.
https://m.blog.csdn.net/afison/article/details/140094800
1. GDB调试
GDB(GNU 调试器)是一个强大的工具,用于调试程序。
安装
- wget http://ftp.gnu.org/gnu/gdb/gdb-8.1.tar.gz
- tar -zxvf gdb-8.1.1.tar.gz
- cd gdb-8.1.1
- ./configure
- make
- make install
基础用法
启动GDB
gdb <executable>
基本调试命令
- run [args]:运行程序并可选地传递参数
run arg1 arg2
- break [location]:在指定位置设置断点。位置可以是函数名、文件:行号、内存地址等。
break main
break myfile.c:10
- delete [breakpoint-num]:删除指定断点,若不指定,则删除所有断点。
delete 1
delete
- info breakpoints:显示所有断点的信息。
info breakpoints
- continue (c):继续执行程序直到下一个断点或程序结束。
continue
- next (n):单步执行下一行代码,不进入函数内部。
next
- step (s):单步执行下一行代码,如果是函数调用,则进入函数内部。
step
- finish:继续执行直到当前函数返回。
finish
检查程序状态
- print [expression]:打印表达式的值。
print x
print my_array[0]
- display [expression]:每次停止时显示表达式的值。
display x
- undisplay [display-num]:取消自动显示某个表达式。
undisplay 1
- info locals:显示当前堆栈帧中所有局部变量的值。
info locals
- info args:显示当前堆栈帧中所有参数的值。
info args
堆栈操作
- backtrace (bt):显示当前调用堆栈。
backtrace
- frame [frame-num]:切换到指定的堆栈帧。
frame 2
- up [n]:向上移动n个堆栈帧,默认为1。
up 1
- down [n]:向下移动n个堆栈帧,默认为1。
down 1
内存操作
- x/nfu [address]:检查内存地址。n是要显示的单位数,f是格式(x=hex,d=decimal,u=unsigned decimal,o=octal,t=binary,a=address,c=char,s=string),u是单位(b=bytes,h=halfwords,w=words,g=giant words)。
x/4xw 0x600d90
x/s 0x600d90
修改变量
- set var [variable] = [value]:设置变量的值。
set var x = 10
set var my_array[0] = 20
程序控制
- kill:终止正在调试的程序。
kill
- quit:退出GDB。
quit
其它有用命令
- list [location]:显示源代码。location可以是函数名、文件:行号、内存地址等。
list main
list myfile.c:10
- info functions:显示所有已知的函数。
info functions
- info variables:显示所有已知的全局和静态变量。
info variables
调试用例
#include <iostream>
using namespace std;
void printArray(int *arr, int size) {
for(int i = 0; i < size; ++i) {
cout << arr[i] << " ";
}
cout << endl;
}
int main() {
int arr[5] = {1, 2, 3, 4, 5};
printArray(arr, 5);
//bug: 超出数组索引
cout << arr[10] << endl;
return 0;
}
编译和启动GDB
设置断点并运行程序
在GDB中,首先设置一个断点并运行程序:
单步执行代码
使用next命令单步执行代码:
打印变量的值
使用print命令检查变量的值:
注意到arr[10]是未定义的行为,它可能会显示随机值。
继续执行程序
(gdb) continue
Continuing.
Program received signal SIGSEGV, Segmentation fault.
0x00000000004006d6 in main () at main.cpp:14
14 cout << arr[10] << endl;
程序崩溃在访问arr[10]时,导致段错误。
检查堆栈
使用backtrace命令检查调用堆栈:
(gdb) backtrace
#0 0x00000000004006d6 in main () at main.cpp:16
退出GDB
调试完成后,可以使用quit命令退出GDB:
(gdb) quit
2. Coredump调试
Coredump 是计算机系统中的一种文件,用于在程序崩溃时保存程序的内存状态、寄存器值和其他相关信息。
什么是 Coredump
- 定义:Coredump 是一个包含程序在崩溃时内存状态的文件。它记录了程序的堆栈、堆、全局和静态变量等内容。
- 用途:主要用于调试和分析程序崩溃的原因,帮助开发者确定问题的根源。
生成 Coredump
- 配置系统:在 Linux 系统中,通过设置系统参数可以控制是否生成 Coredump 文件及其存放位置。
- 查看和设置 coredump 文件大小限制:
ulimit -c
ulimit -c unlimited # 允许生成 coredump 文件
- 配置 Coredump 文件的存放路径:修改/etc/sysctl.conf文件或使用sysctl命令
- 重启服务或系统以应用新的配置。
echo "/path/to/store/corefile/core.%e.%p" | sudo tee /proc/sys/kernel/core_pattern
分析 Coredump
- GDB 调试工具:GDB 是一个强大的调试工具,可以用于加载和分析 Coredump 文件。
gdb /path/to/executable /path/to/corefile
- 基本命令:
- bt (backtrace):显示调用栈,帮助确定程序崩溃的位置。
- info registers:查看寄存器的值。
- list:显示源代码。
- print:打印变量值。
- quit:退出 GDB。
实际示例
假设有一个简单的 C++ 程序崩溃并生成了 Coredump 文件:
代码示例
#include <iostream>
int main() {
int *p = nullptr;
*p = 10; // 这行会导致程序崩溃(Segmentation fault)
return 0;
}
编译和运行
g++ -g -o test_program test_program.cpp # 使用 -g 选项编译以包含调试信息
ulimit -c unlimited # 允许生成 coredump 文件
./test_program # 运行程序,导致崩溃并生成 coredump 文件
使用 GDB 分析 Coredump
gdb ./test_program core
在 GDB 中可以使用以下命令进行分析:
(gdb) bt # 显示调用栈
(gdb) info registers # 查看寄存器的值
(gdb) list # 显示出错位置的源代码
(gdb) print p # 打印指针 p 的值
其他工具和方法
- coredumpctl:在现代 Linux 系统中,systemd提供了coredumpctl工具来管理和分析 Coredump 文件。
coredumpctl list # 列出所有 coredump
coredumpctl info <PID> # 显示特定 coredump 的信息
coredumpctl gdb <PID> # 使用 gdb 分析特定 coredump
预防和改进
- 代码审查和测试:通过严格的代码审查和测试,尽早发现和修复潜在的问题。
- 静态分析工具:使用静态分析工具如clang-tidy、cppcheck等,可以在编译阶段发现潜在的崩溃问题。
- 动态分析工具:如valgrind可以在运行时检测内存泄漏和非法内存访问。
通过这些步骤和工具,开发者可以有效地分析和调试程序崩溃,提升程序的稳定性和可靠性。
3. 联系
GDB:GDB 是一个强大的调试工具,允许开发者在程序运行时或在程序崩溃后进行交互式调试。
使用场景:
- 实时调试:在开发过程中,通过设置断点、单步执行等方式调试代码。
- 分析 Coredump 文件:在程序崩溃后,使用 Coredump 文件分析崩溃原因。
Coredump:Coredump 是程序崩溃时生成的一个文件,记录了程序在崩溃时的内存状态、寄存器值等信息。
使用场景:
- 崩溃分析:在生产环境中,程序崩溃后可以生成 Coredump 文件,开发者下载后进行离线分析。
- 长时间运行的程序:对于难以重现的崩溃,通过 Coredump 文件捕捉崩溃时的状态进行分析。
关联:
- GDB 可以加载和分析 Coredump 文件,帮助开发者查看崩溃时的调用栈、变量值和内存状态。
- 两者结合使用时,GDB 提供了强大的交互式工具,使得分析 Coredump 文件更加高效。
区别:
- 性质不同:GDB 是一个调试工具,而 Coredump 是一个文件。
- 生成时机不同:GDB 在程序运行时或崩溃后使用,Coredump 在程序崩溃时自动生成。
- 使用方式不同:GDB 需要开发者交互操作进行调试,Coredump 是自动生成的静态文件,需借助工具(如 GDB)进行分析。
热门推荐
Excel中筛选同一品种价格最低的多种方法
荷兰式拍卖是怎样的?有哪些特点和操作方式?
Excel数据验证实战:下拉列表、提示和警告弹出窗口
工控机的CPU睿频是什么?有什么用?
早期倾倒综合症的防治方法
物质无限可分9:夸克的颜色
激发孩子内在潜能!家长必知的三部曲兴趣培养法
房子漏水房东不修怎么办?举报维权指南
秦洪看盘|动量资金加仓意愿强,助力A股构建强势格局
针对AI搜索对内容时效性,如何规划内容更新频率?
每天洗头会导致脱发吗?多久洗一次最好?上海毛发专家这么说→
拉单杠好处:让全身肌肉都在燃烧!每天坚持7分钟就能【爆量增肌】
法官与律师辩护案例范文:司法公正与法律信仰的维护
神奇!能被手融化的金属,凭啥让钢铁秒变“渣”?
懒,说明你气虚;掉头发,说明你血虚;长痘痘,说明你阴虚!你是哪种虚?
贷款结清后征信会立即更新吗?
周易第十五卦谦卦九三爻详解:劳谦君子,有终吉
罗汉果热量揭秘:健康饮品还是热量陷阱?
能跑完一个半程马拉松,身体素质在什么水平?
怎么克服3D眩晕症
怎么克服3D眩晕症
小鱼缸多久换一次水?这份详细的换水指南请收好
简历怎么设计比较好
狗的咬合力究竟有多大?比人类的咬合力强吗?
关于澡堂过夜收费是否犯法的法律分析
十岁女孩应该摄入哪些营养食物以帮助身高增长
禽流感导致鸡蛋价格前飙升,超过1.11亿只禽类被宰杀
慢性胰腺炎是什么?症状、影响与预防全解析
如何评估不同地区的居住环境?这些环境如何影响生活质量?
如何提升居住地的环境质量?环境改善对居民生活的影响有多大?