cgo程序崩溃如何生成core文件

前言

我们在编译cgo程序后,在运行时可能会出现段错误(segment fault),这通常是指针错误引起的,这不像编译的时候会提示哪个文件哪行代码出错。这时,程序会直接崩溃,没有提示信息,找不到出错原因。

Core Dump

当我们运行一个程序时出现异常终止或崩溃时,操作系统会将程序的内存状态记录下来,保存在一个文件中,这种行为就叫做 Core Dump,生成的文件一般称为Core文件。简单来说,Core Dump 就是“内存快照”,除了内存信息外,还包含其他有用的信息。我们能够使用Core文件还原程序崩溃是的情景。

使用Core文件调试

通常,程序崩溃时,由于设置的原因,并没有自动生成Core文件,因此需要进行相关设置。

打开Core文件大小限制
在终端中输入ulimit -c,输出结果为0,说明core dump是默认关闭的,此时不会生成core文件。
通过使用ulimit -c unlimited开启core dump,并且不限制文件大小,如果需要限制文件大小,可将 unlimited 改为需要限制的最大值,单位为 blocks(KB)。

注意
该命令只对当前shell生效,如果需要永久生效,可将该命令写入系统配置文件中。

修改core文件保存路径
默认生成的core保存在可执行文件所在目录下,文件名为core。
可以通过修改 /proc/sys/kernel/core_pattern 来控制生成core文件的位置和文件名。例如,执行echo '/tmp/core.%t.%e.%p' | tee /proc/sys/kernel/core_pattern 设置生成的core文件保存下 /tmp 目录下,文件名格式为 core.时间戳.命令名.pid

设置环境变量
特别的对于go程序,需要设置环境变量 export GOTRACEBACK=crash,也可以在执行程序前加上环境变量,即 GOTRACEBACK=crash ./test

调试core文件

编写示例

#include 
int main()
{
    int *p = NULL;
    *p = 0;
    return 0;
}

编译执行

gcc -o test test.c
./test

此时会出现 Segmentation fault (core dumped) 错误。

开始调试

gdb test /tmp/core.1675679513.test.68

此时会进入可交互式模式,可以输入相关gdb命令进行调试。

GDB是Linux系统下最常用的程序调试器,GDB已经迭代了多个版本,当前的GDB支持Go、C、C++等多种语言。

GDB调试命令

下面是最常用的命令:

  • bt 打印堆栈信息
  • bt full 查看所有的frame
  • frame 查看指定的frame
  • print 查看指定变量的值

其他

打印堆栈信息时,无法定位C++源码出错的位置,提示 No symbol table info available 。这是因为C++源码在编译后丢失了源码信息,同时编译器也会进行代码优化。如果想要保留相关信息,需要在编译的 makefile 文件中的 CFLAGS 变量中加入-g 选项。如果是使用CMake,需在 CMakeLists.txt 文件中添加以下内容:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -g")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0 -g")

参考文章

https://blog.csdn.net/liuzhuc...
https://www.cnblogs.com/Anker...

你可能感兴趣的:(cgo程序崩溃如何生成core文件)