visual studio 怎么生成coredump文件_如何在docker容器中生成core dump
简介
通过core dump来分析问题的原因是c++后台开发比较常用的方法,但是如何在docker容器中生成core dump呢?
基础概念
- core dump
在绝大多数GNU/Linux系统中,当应用程序发生没有捕获的异常信号ARORT/SEGV时,系统会终止当前进程,并生成core dump文件,它一般在程序执行的主目录下,通常命名为core或者core.PID。通常情况下core dump包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息等。在实际的开发场景中,这些信息能够对开发人员调试定位问题提供非常大的帮助,所以在特定场合生成并留存core dump是一件必要而有意义的事情。
- ulimit
ulimit是GNU/Linux的一个命令行工具,用于显示或设置用户可以使用的资源限制。在本例中,我们主要关注core文件大小限制的设置或查看。
使用ulimit -c
查看对core文件大小的限制,例如:
#ulimit -c
unlimited
unlimited
表示没有限制,这意味着当应用程序异常时,系统能够输出任意大小的core dump文件,如果结果是非零数字,则表示系统只能输出限制大小的core dump文件,如果结果为零,则系统不会输出core dump文件。
设置对core文件大小的限制,如:
# ulimit -c unlimited 不限制
# ulimit -c 1024 限制大小为1024
# ulimit -c 0 限制大小为0,即不输出core文件
环境
- 系统版本
Ubuntu 16.04
- docker版本
19.03.1
步骤
1.准备测试程序
- 测试代码
#include <ctime>
#include <iostream>
int main(int argc, char *argv[]) {
time_t begin_time = time(0);
time_t cur_time = time(0);
std::cout << "begin time = " << ctime(&begin_time) << std::endl;
while ((cur_time - begin_time) < 120) {
cur_time = time(0);
}
std::cout << "end time = " << ctime(&cur_time) << std::endl;
char *p = nullptr;
// crash here
*p = 'x';
return 0;
}
- make命令
g++ -std=c++11 -O3 -Wall -g -o core-dump-demo main.cpp
务必加上-g参数,否则用gdb分析dump时会显示缺少symbols,不能定位到哪一行出错了。
- 本地运行结果
2.Build docker image
- dockerfile
FROM ubuntu:16.04
RUN mkdir -p /app
WORKDIR /app
COPY ./core-dump-demo /app
# This command runs your application, comment out this line to compile only
CMD ["./core-dump-demo"]
LABEL Name=core-dump-demo Version=0.0.1
- build image
使用vscode build image
build命令:
docker build --rm -f "Dockerfile" -t core-dump-demo:0.0.1 .
build成功后,使用docker images可以看到这个image
3. 启动容器
docker run --name=core-dump-demo --privileged=true -d core-dump-demo:0.0.1
切记加入参数--privileged=true,否则无法修改core配置
4. 进入容器
docker exec -it core-dump-demo /bin/bash
5. 在容器中查看core文件大小
6. 设置容器中core配置
echo "kernel.core_pattern = /tmp/core.%e.%p.%t">/etc/sysctl.conf
sysctl -p
7. 等待容器退出拷贝core dump
- 查看容器退出状态
Exit code 139表示Segmentation fault
- 拷贝core dump到本地
docker cp core-dump-demo:/tmp ./
生成的core dump文件名为 core.core-dump-demo.1.1571388434
8. 分析core dump
gdb core-dump-demo core.core-dump-demo.1.1571388434
很明显可以看出crash的原因是main.cpp第14行的代码导致的,打印指针p的地址发现是0