面试题: 使用 GDB 如何调试 Core 文件?

旅行   2024-11-18 08:08   广东  

欢迎关注本公众号,专注面试题拆解

分享一套视频课程《C++百万并发服务器开发》,有需要的加我微信获取:fb964919126

面试题:使用 GDB 如何调试 Core 文件?

core文件是在程序崩溃时由操作系统生成的文件,通常包含了程序崩溃时的内存快照、堆栈信息和其他调试信息。通过 GDB 调试 core 文件,我们可以查看程序崩溃时的状态,包括程序变量、调用栈等。(文末赠书)

1

生成core文件

为了使用 GDB 调试 core 文件,首先需要确保程序能够生成 core 文件。

在 Linux 系统中,出于安全考虑,生成的 core 文件的大小默认是限制的。可以使用 ulimit 命令查看和修改这个限制。为了确保程序生成 core 文件,可以运行以下命令:

   ulimit -c unlimited

该命令取消了对 core 文件大小的限制。无限制的核心转储文件可能会消耗大量磁盘空间,因此在生产环境中使用时需要谨慎。建议在开发和测试环境中使用,以方便调试。

如果希望永久性地设置核心转储文件的大小限制,需要编辑系统的配置文件,可以修改 /etc/security/limits.conf 文件或者修改 /etc/profile 或 /etc/bashrc 文件

默认情况下,生成的 core 文件通常保存在程序的当前工作目录中,文件名为 core。如果希望将 core 文件保存在特定的目录并设置不同的文件名格式,可以修改 `/proc/sys/kernel/core_pattern` 文件。

程序崩溃时(例如访问非法内存、除零错误等),操作系统会自动生成 core 文件,前提是程序启用了生成 core 文件的选项。

2

使用 GDB 调试 Core 文件

调试命令格式
GDB 调试 core文件的基本命令格式如下:

gdb <可执行文件> <core文件>

<可执行文件>:是程序的可执行文件,通常是编译后的程序。
<core文件>是程序崩溃时生成的 core文件。

例如,假设程序的可执行文件名是 my_program,生成的 core文件为 core.12345,可以用以下命令启动 GDB 调试

gdb my_program core.12345


执行上述命令时,GDB 会加载可执行文件和 core 文件,尝试重建崩溃时的程序状态。如果程序崩溃时包含了符号信息(例如通过调试符号编译),会得到更详细的信息。
在 GDB 启动后,可以看到类似下面的输出

Core was generated by `./my_program'.Program terminated with signal SIGSEGV, Segmentation fault.#0  0x080484b6 in crash_function () at my_program.c:4545          *ptr = 10;  // 访问了空指针


查看崩溃点
在 GDB 中,可以使用 backtrace命令查看程序的调用栈,帮助定位崩溃发生的位置。

(gdb) backtrace

直接输入简写:bt 也是一样的效果。
这将列出程序崩溃时的调用栈,显示函数的调用顺序。例如:

#0  0x080484b6 in crash_function () at my_program.c:45#1  0x080484d1 in main () at my_program.c:60


查看变量值
在调试 core 文件时,可能需要查看崩溃时变量的值。可以通过 GDB 的 print 命令来查看特定变量的值:

(gdb) print ptr$1 = (int *) 0x0

这表示 ptr 是一个空指针,导致了崩溃。

3

关于调试符号

在调试 core 文件时,调试符号对定位错误非常重要。调试符号包含了源代码信息(如函数名、变量名、行号等),没有调试符号的 core文件会显示不完整的信息,通常只有机器码级别的堆栈追踪。

为了确保生成的 core 文件包含调试信息,编译时需要使用 -g 选项生成调试符号。例如,在使用 gcc 编译程序时:

gcc -g -o my_program my_program.c

4

其他常用调试命令

1、list:查看崩溃位置附近的源代码。

  (gdb) list

2、info locals:查看当前函数中所有局部变量的值

  (gdb) info locals

3、info registers:查看 CPU 寄存器的内容,特别有用来诊断程序崩溃时的状态。

  (gdb) info registers

4、frame:查看当前栈帧的详细信息,可以使用 frame 命令切换到不同的堆栈帧

  (gdb) frame 1


总结:

调试 core 文件的流程通常包括:

1. 确保生成 core 文件。

2. 使用 gdb <可执行文件> <core文件> 命令加载可执行文件和 core 文件。

3. 使用 backtrace 等命令查看崩溃时的调用栈。

4. 查看崩溃时的变量值和程序状态。

5. 根据调试信息分析和修复问题。

本周送书福利
AI绘画商业案例全领域指南:插画领域+营销领域+产品设计领域+摄影领域+建筑领域+电影领域+网站和社交软件领域+游戏领域,8大领域100+案例带你轻松玩转AI绘画,领略无限艺术可能。
以项目实践为引导,通过有趣的AI插画辅助学习增加学习趣味性,通过【原理输出】和【实操练习】助力学与练,从而解锁人工智能与大规模语言模型精髓。

参与方法:

关注本公众号,在本篇文章下面留言。


会随机抽取,中奖者可以获得上面的纸质书籍任选1本,免费包邮到家。

活动截止时间:2024年11月25日 12:00 整

兑奖截止时间:2024年11月26日 12:00 整

end



CppPlayer 



关注,回复【电子书】珍藏CPP电子书资料赠送

精彩文章合集

专题推荐

【专辑】计算机网络真题拆解
【专辑】大厂最新真题
【专辑】C/C++面试真题拆解

CppPlayer
一个专注面试题拆解的公众号
 最新文章