先写一个运行后会崩溃并产生core文件的demo
#include <iostream>
#include <thread>
class MyClass
{
public:
void PrintNum(int num)
{
static int* ptr = nullptr;
if (num > 10)
{
std::cout << "*********" << *ptr << std::endl;
}
std::cout << "----" << num << std::endl;
}
void func1(int num)
{
func2(num);
}
void func2(int num)
{
func3(num);
}
void func3(int num)
{
PrintNum(num);
}
};
int main()
{
MyClass obj;
int i = 0;
while (true)
{
i++;
obj.func1(i);
}
}
运行下面命令,产生可执行文件:
g++ -std=c++11 -g main.cpp
运行后,产生core文件。如下图:
调试core文件,运行命令
gdb a.out core-a.out-11-0-0-57233-1661611440
1、 backtrace 命令(简写bt)
执行bt命令,查看运行栈
可以看出,当程序崩溃,栈中共有 5 个栈帧,从栈顶到栈底分别被编号为 0 ~ 4。
2、 frame命令(简写f)
切换到栈帧3
3、 info命令
执行 info args
可以看到打印出了this指针的地址和参数的值,如果没有参数,则只会打印this指针的值
执行 info locals
可以看到打印出了当前函数本地的变量的值
4、 print命令
打印变量的值可以用print命令
可以看到 ptr 的值为nullptr
分析结果
切换到栈顶
执行了代码:
std::cout << "*********" << *ptr << std::endl;
根据print命令显示,ptr指针是空。所以崩溃原因是因为代码尝试输出空指针的值,所以崩溃。分析结束。