C++ 程序崩溃排查

程序报错,可以根据报错信息,日志文件来初步排查。但还是无法知道具体原因,则采用Core dump分析。

使用空指针来赋值,故意制造错误。
1、临时开启Core dump存储设置
2、编译代码,运行程序
3、用gdb调试

可以准确的找到报错位置在18行
C++ 程序崩溃排查_第1张图片


#include 
#include 
#include 
using namespace std;

void test(vector<string> v)
{

    cout << "你觉得呢?" << endl;
    for (auto i:v)
    {
        cout << i << endl;
    }

    // 报错部分  
    int *p = nullptr;
    *p = 20;
    // 报错部分  空指针赋值是会报错的

    cout << "你还真别说" << endl;

    /*
    问题:空指针赋值
        错误的本质在于,访问了未被分配或者受系统保护的内存区域,进而造成程序异常终止。

    方案一:让指针指向一个已分配好的内存地址。
        int value = 0;
        int *p = &value;  // 使p指向变量value的地址
    /    *p = 20;         // 把20赋给value

    方案二:借助动态内存分配。
        int *p = new int;  // 动态分配一个int大小的内存空间
    /   *p = 20;          // 给分配的内存空间赋值
        delete p;         // 使用完毕后,释放内存,防止内存泄漏

    */


}


int main()
{
    vector<string> my_vec{"1","2","3"};
    test(my_vec);

    // 程序崩溃如何进行排查
    // 设置存储程序报错信息 

    // 状态检查 查看存储文件最大限制是多少 
    // ulimit -c     若为0则不保存
    // 若显示的数字 换算:1024为512KB
    
    // 设置大小 unlimited 是不限大小
    // ulimit -c unlimited

    // 编译命令: -g 是生成符号表,可以使用gdb中查看报错的多少行的函数名和变量名
    // g++ -g c1.cpp -o a.out
    // 运行 ./a.out

    // 发生报错:Segmentation fault (core dumped)

    
    // 若未发现转存文件
    // cat /proc/sys/kernel/core_pattern
    // 若为:|/usr/share/apport/apport -p%p -s%s -c%c -d%d -P%P -u%u -g%g -- %E

    // 临时禁用 则使用:sudo systemctl stop apport
    // 永久禁用:sudo vim /etc/default/apport
    // 将 enabled=1 改为 enabled=0,保存后重启系统。

    // 进行gdb调试 转存文件名称 后4位是进程号
    // gdb a.out core.4978



    return 0;
}

使用cmake 编译 debug

CMakeLists.txt 文件内容

#CMakeLists.txt
#  设置:版本
cmake_minimum_required(VERSION 3.20)

# 定义 :项目名称
project(first_cmake)


# 设置构建类型为 Debug
set(CMAKE_BUILD_TYPE "Debug")

# 配置 Debug 模式下的编译选项
# -O0: 禁用优化,便于调试
# -Wall: 开启所有常见的编译警告
# -g: 生成调试信息
# -ggdb: 生成供 GDB 使用的详细调试信息
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")

# 配置 Release 模式下的编译选项
# -O3: 开启最高级别的优化
# -Wall: 开启所有常见的编译警告
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

# 变成执行程序
# 参数:项目名字、源码名字、
add_executable(first_cmake first_cmake.cpp)

run.sh 文件内容

# 使用下面步骤代替第一步,原因是有些cmake版本不支持(-S -B)参数
sudo rm -r build 
ulimit -c unlimited

mkdir build
cd build
cmake ..
cd ../
# 下面一样
cmake --build build
# gdb ./build/first_cmake
gdb ./build/first_cmake core.*

运行结果同上

你可能感兴趣的:(C++,基础,c++,开发语言)