python gdb coredump_GDB 调试 C++ 程序 core dump

前天晚上(2013.10.15)参加 Topcoder 竞赛时, 碰到一个比较没有头绪的问题, 想解法就想了半天, 写代码时又出了问题,以前在 Visual Studio 下图形化调试的习惯根深蒂固,GDB 又不熟悉, 所以只能用最笨的 printf 来进行调试, 大大降低了效率, 到了急需砍柴时才后悔没有磨好刀啊.

现在趁着有时间, 就把 GDB 再好好练习一下, 就不罗列一大堆命令了, 只是把碰到的/用过的整理一下, 以后再使用到新的命令, 再补充. 有几篇总结的比较好的文章可以参考: 《LINUX C/C++ GDB调试(概述)上》、《LINUX C/C++ GDB调试(概述)下》、《手把手教你玩转GDB(二)——Breakpoint, Watchpoint和Catchpoint》

1.添加调试信息为了能使用 gdb 进行调试, 需要添加 -g 选项添加调试信息.

g++ -g test.cpp -o test

2.常用命令

使用 gdb test 即可以进入调试程序, 以下列出几个常用命

令.

显示图形化代码 Ctrl+x+a

启动程序 r (run)

断点 b (breakpoint)

清除/禁用/启用断点 delete/disable/enable

单步 s (step 碰到函数会进入)

单行 n (next 碰到函数不会进行, 而是整条执行)

执行到下一个断点 c (continue)

查看变量 p (print)

显示变量 display

查看当前调用堆栈 bt (backtrace)

查看某一层调用代码 f (frame)

3.调试 core dump程序执行时, 经常会因为段错误(Segment Fault)而退出, 操作系统会把此程序当前内存信息 dump 到磁盘上(详见wiki), 即生成 core 文件. 对 core 进行分析可以很快分析出导致程序 crash 的地方.

(1).设置 core 文件大小

系统默认不会生成 core 文件, 需要进一步设置. core 文件的生成依赖于 shell 的设置, 在 shell 中运行命令: ulimit -a, 从第一行的设置项可以看到系统设置的 core file size 为 0, 即不生成 core file.

使用命令: ulimit -c unlimited 可以设置 core file size 为无限.

(2).生成简单 core 文件在 C++ 中制造一个 segment falt 太容易了, 直接给一个空指针赋值就可以了.

int main(int argc, char const *argv[])

{

char* p = nullptr;

*p = 'a';

return 0;

}

保存文件为 coreDumpTest.cpp, 编译并运行, 即可以现磁盘上多了一个 core 文件, 就是这个程序发生段错误 dump 下来的进程信息.

(3).调试简单 core 文件使用gdb ./coreDumpTest core来调试 core, 发现 gdb 直接就定位到了出错的语句(第4行赋值语句), 还可以通过 print 来查看当前上下文变量, 如指针 p 的值为 nullptr.

(4).生成稍复杂 core 文件

上面的例子太简单了, 下面通过一个稍微复杂的例子来介绍一下 gdb 中命令 backtrace 和 frame 的使用. 下面代码很简单, 就是越界访问, 用 vector 是为了体现调用层次...

#include

using namespace std;

int main(int argc, char const *argv[])

{

vector a;

vector b;

b.push_back(a[0]);

return 0;

}

(5).调试稍复杂 core 文件

编译运行程序, 生成 core 文件,使用

gdb

来调试 core, 可以看到此时直接定位到的地方是库函数中的某一行;

库函数都是经过千锤百炼, 基本不可能出错, 所以我们先从自己的程序找起. 这时我们需要知道的是代码是从哪条语句执行到这里的, 使用

backtrace(或者 where)

命令列出当前调用堆栈, 再使用

frame n

命令列出第 n 层堆栈的信息, 就可以直接看到出错的代码语句了, 接下来就是进一步分析了.

4.环境:Ubuntu 12.04(64-bit) + gcc 4.8.1 + gdb 7.6.1

待添加: 设置 core file size 在所有 shell 都生效, 不要每次打开一个 shell 就要设置一下.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!要调试核心转储文件(core dump),你可以使用GDB(GNU调试器)。下面是一些基本的步骤: 1. 确保你的程序在编译时启用了调试信息。使用 `-g` 标志进行编译,例如:`gcc -g myfile.c -o myprogram`。 2. 运行程序并生成 core dump 文件。你可以通过执行以下命令来启用核心转储:`ulimit -c unlimited`。然后运行程序,当它崩溃时,会生成一个名为 `core` 的文件。 3. 使用 GDB 载入核心转储文件和可执行文件。执行以下命令:`gdb -c core myprogram`,其中 `core` 是核心转储文件的路径,`myprogram` 是可执行文件的路径。 4. 开始调试。一旦 GDB 加载了核心转储文件和可执行文件,你就可以开始调试了。你可以使用各种 GDB 命令来检查崩溃发生的位置、回溯信息、变量的值等。 以下是一些常用的 GDB 调试命令: - `run`:重新运行程序。 - `backtrace`(或 `bt`):显示回溯信息。 - `print <variable>`(或 `p <variable>`):打印变量的值。 - `break <line>`(或 `b <line>`):在指定行设置断点。 - `continue`(或 `c`):继续执行程序。 - `step`(或 `s`):单步执行程序。 - `next`(或 `n`):按行执行程序,不进入函数。 - `quit`(或 `q`):退出 GDB。 这只是一些基本的调试命令,你可以根据需要查阅 GDB 的文档来了解更多详细信息。希望对你有帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值