当前位置: 首页 > news >正文

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,不能定位到哪一行出错了。

  • 本地运行结果

3f86ad8d35d03e9cf6ab339442947648.png

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

fb529eec86b2b51a92dda9bd40753829.png

build命令:

docker build --rm -f "Dockerfile" -t core-dump-demo:0.0.1 .

build成功后,使用docker images可以看到这个image

2e58c972c0ba8e52494b07aba296e529.png

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文件大小

6deb50858ed2a8e9e8d73953da76e678.png

6. 设置容器中core配置

echo "kernel.core_pattern = /tmp/core.%e.%p.%t">/etc/sysctl.conf
sysctl -p

6a1727ef5268f51307c66efd5c31076e.png

7. 等待容器退出拷贝core dump

  • 查看容器退出状态

Exit code 139表示Segmentation fault

d144488e0ac7f3cf9960c3ff20c7338e.png
  • 拷贝core dump到本地
docker cp core-dump-demo:/tmp ./

935d50b834896474cf1fd109163966c0.png

生成的core dump文件名为 core.core-dump-demo.1.1571388434

8. 分析core dump

gdb core-dump-demo core.core-dump-demo.1.1571388434

0ecd3607e7bb77ab14f834eac67df713.png

很明显可以看出crash的原因是main.cpp第14行的代码导致的,打印指针p的地址发现是0

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 对信息系统集成项目管理的一点看法
  • 电子工程师之家_「德语学习」电气、电子、电力什么区别?
  • javascript操作radio的几种方法
  • arcengine遍历属性表_【Python@arcpy】python操作Excel与属性表批处理
  • ExtremeTable的导出问题
  • 运动估计算法的程序实现_光流法--Lucas Kanade算法
  • 网吧系统母盘制作(系统分区整体考虑优化配置篇)
  • 点在多边形内_空间分析:2-4.Python生成泰森多边形
  • struts2的s:param标签使用
  • leetcode 打印_剑指 Offer 32 - I. 从上到下打印二叉树
  • 使用spring的MBeanExporter暴露hibernate的StatisticsService对象方法
  • springboot分页插件_Spring boot整合Mybatis Generator以及PageHelper源码分析
  • ext2.0不能与prototype1.6一起使用
  • c语言scanf一次不定_初学C语言编程时最容易犯的错误,你踩坑了吗?
  • 知识可以触类旁通。。。
  • [case10]使用RSQL实现端到端的动态查询
  • 【面试系列】之二:关于js原型
  • Android组件 - 收藏集 - 掘金
  • CentOS 7 防火墙操作
  • es6(二):字符串的扩展
  • FineReport中如何实现自动滚屏效果
  • Java-详解HashMap
  • js对象的深浅拷贝
  • MaxCompute访问TableStore(OTS) 数据
  • MySQL数据库运维之数据恢复
  • Vue.js源码(2):初探List Rendering
  • 阿里云Kubernetes容器服务上体验Knative
  • 大主子表关联的性能优化方法
  • 爬虫模拟登陆 SegmentFault
  • 嵌入式文件系统
  • 入门到放弃node系列之Hello Word篇
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 使用SAX解析XML
  • 微信开放平台全网发布【失败】的几点排查方法
  • 小程序button引导用户授权
  • 走向全栈之MongoDB的使用
  • const的用法,特别是用在函数前面与后面的区别
  • 回归生活:清理微信公众号
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #{} 和 ${}区别
  • #include<初见C语言之指针(5)>
  • #laravel部署安装报错loadFactoriesFrom是undefined method #
  • #pragma预处理命令
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • $$$$GB2312-80区位编码表$$$$
  • (3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)
  • (ISPRS,2021)具有遥感知识图谱的鲁棒深度对齐网络用于零样本和广义零样本遥感图像场景分类
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (TOJ2804)Even? Odd?
  • (多级缓存)缓存同步
  • (二)springcloud实战之config配置中心
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740