学习C++的时候,对于cpp进行调试是不可避免的

demo.cpp

#include <iostream>
using namespace std;
int main() {
char *a;
a[0] = 'a';
cout << a << endl;
cout << "Hello World" << endl;
return 0;
}

下面开始编译该程序

g++ demo.cpp -o demo -g

得到demo可执行文件
运行可执行文件

段错误(核心已转储)

下面是进行gdb调试的方法

gdb ./demo

命名名字

描述

run(r)

启动程序

start(s)

启动,停留在main函数,分步测试

next(n)

下一条指令

step

下一条指令,进入到函数内部

quit

退出gdb

set +参数名=值

设置启动参数

display

查看变量,具体什么时候变化

undisplay

删除显示变量,查看编号

list

显示代码(一次显示十行)

break+行数

设置断点

info b

查看断点

del +断点号

删除断点

continue(c)

进入到下一个断点

print(p)

查看一个变量的值

如果有bug了,这样一个一个找断点是不是太麻烦了?我也觉得
不是说核心已转储嘛?那我们直接看core文件
正常情况下是不会出现core这个文件的,因为此时他的文件大小为0

ulimit -c   // 查看core文件大小
0

那我们就把这个文件大小设置为一个正整数
一般有两种方法

  • ulimit -c +大小
  • ulimit -c unlimited
ulimit -c unlimited

再来看看core文件大小

ulimit -c   // 查看core文件大小
ulimited

好了,现在加上这个core文件一起进行gdb吧

gdb ./demo core
...
warning: Source file is more recent than executable.
6 a[0] = 'a';

如果还是好难看懂直接使用where命令

where
...
0x0000560b23fa31b9 in main () at demo.cpp:6

耶斯莫拉!