1. 如何排查程序crash,freeze等问题?

在日常开发中,即使代码写得有多谨慎,免不了还是会发生各种意外的事件,比如服务器内存突然飙高,又或者发生内存溢出(OOM)。当发生这种情况时,我们怎么去排查,怎么去分析原因呢?

最快的解决方式是生成dump文件,通过生成dump文件使用调试工具进行调试,还原程序崩溃时的状态,能够起到快速定位排查问题的作用。

Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中。Dump文件是用来给驱动程序编写人员调试驱动程序用的,这种文件必须用专用工具软件打开,比如使用WinDbg、VS,Jprofiler打开。

2. 什么是dump file?

Windows下Dump文件分为两大类,内核模式Dump和用户模式Dump。内核模式Dump是操作系统创建的崩溃转储,最经典的就是系统蓝屏,这时候会自动创建内核模式的Dump。用户模式Dump进一步可以分为完整Dump(Full Dump)和迷你Dump(Minidump)。完整Dump包含了某个进程完整的地址空间数据,以及许多用于调试的信息,而Minidump则有许多类型,根据需要可以包含不同的信息,有的可能只包含某个线程和部分模块的信息。在程序开发过程中出现的应用崩溃属于用户模式Dump。因此,要弄清楚这种Dump文件的组成、生成方式、作用。

3. Dump文件的作用

Dump文件是进程的内存镜像,可以把程序的执行状态通过调试器保存到dump文件中。主要是用来在系统中出现异常或者崩溃的时候来生成dump文件,然后用调试器进行调试,这样就可以把生产环境中的dmp文件拷贝到自己的开发机上,调试就可以找到程序出错的位置。
在C++编程实践中,通常都会遇到内存访问无效、无效对象、堆栈溢出、空指针调用等常见的C/C++问题,而这些问题最后常会导致:系统崩溃。为解决崩溃问题常用的手段一个就是生成dump文件进行代码调试,另外一个就是使用远程调试remote debugger进行调试。但remote debugger在要求程序源代码和可执行文件在同一个局域网内,对环境的要求较高。因此对于程序崩溃较好的解决方式便是生成dump文件进行解析,快速定位到程序崩溃位置,对问题进行排查。

4. 如何生成dump文件

4.1 主动生成dump file

首先要查找运行的Java程序的pid

然后使用jmap命令生成dump文件。

file后面是保存的文件名称,1246则是java程序的PID。

jmap -dump:format=b,file=user.dump 39830
Last login: Wed Feb 16 09:37:19 on ttys000
yuhyan@YUHYAN-M-W5NE ~ % jmap -dump:format=b,file=user.dump 39830
Exception in thread "main" java.io.IOException: No such processat jdk.attach/sun.tools.attach.VirtualMachineImpl.sendQuitTo(Native Method)at jdk.attach/sun.tools.attach.VirtualMachineImpl.<init>(VirtualMachineImpl.java:94)at jdk.attach/sun.tools.attach.AttachProviderImpl.attachVirtualMachine(AttachProviderImpl.java:58)at jdk.attach/com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:207)at jdk.jcmd/sun.tools.jmap.JMap.executeCommandForPid(JMap.java:128)at jdk.jcmd/sun.tools.jmap.JMap.dump(JMap.java:248)at jdk.jcmd/sun.tools.jmap.JMap.main(JMap.java:114)

4.2 通过使用任务管理器生成

注: 使用任务管理器生成转储文件需要遵循一个原则:用32位任务管理器给32位进程(无论该进程是运行在32位还是64位系统上面)生成转储文件,用64位任务管理器给64位进程生成转储文件。在64位系统上。

  1. 32位的任务管理器位于C:WindowsSysWOW64 askmgr.exe
  2. 默认打开的任务管理器是64位。

在程序崩溃后,先不关闭程序,在任务管理器中找到该程序对应的进程。右键—>创建转储文件

此时会在默认的目录下创建出一个dump文件

4.3 修改注册表

1) Win + R 输入regedit打开注册表

2)找到注册表路径:

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsWindowsError ReportingLocalDumps

3)在右边窗口新建->字符串值 DumpCount,DumpFolder,DumpType 并修改其值,如下:

这样系统在程序崩溃时就会在C:CrashDump 文件夹下生成对应程序的dump文件。在实际工作中,我们可以将这些操作写成一个脚本文件,一键完成。

对上面DumpType解释:

0 = Create a custom dump
1 = Mini dump
2 = Full dump

如何查看和调试dump文件?

5.1 调试Dump文件

5.1.1.VS调试

用VS打开dmp文件。测试时 dmp文件时本地产生的,因此VS会依据dmp文件自行找到exe,pdb和源代码的路径。因此直接点击调试,程序会出错代码行中断。

但若dmp文件是exe在另一台机器上产生的,则我们最好把exe,pdb,dmp放到同一文件夹下,必须保证pdb与出问题的exe是同一时间生成的,用VS打开dmp文件后还需要设置符号表文件路径和源代码路径:

(1)  当把pdb文件与dmp文件放入同一目录下时,就不需设置其路径,否则需要设置

工具->选项->调试->符号:

(2)还需设置源代码路径:

属性->调试源代码:

这样点击“使用仅限本机进行调试”,即可在出错代码行中断:

5.1.2 WinDbg调试

(1)设置pdb路径:File ->Symbol File Path

(2)设置exe路径:File -> Image File Path

(3)设置源代码路径:File -> Source File Path(指sln所在目录)

(4)打开dmp文件:File ->Open Crash Dump

(5)执行命令 !analyze –v

参考:https://blog.csdn.net/zhaihaibo168/article/details/103706585

icandoit2010的专栏_wufeng_asia_CSDN博客-c/c++,linux,杂谈领域博主

Dump 文件的生产,作用,查看和调试相关推荐

  1. 生成和查看dump文件

    在日常开发中,即使代码写得有多谨慎,免不了还是会发生各种意外的事件,比如服务器内存突然飙高,又或者发生内存溢出(OOM).当发生这种情况时,我们怎么去排查,怎么去分析原因呢? 1. 什么是dump文件 ...

  2. 自定义VS程序异常处理及调试Dump文件(一)

    1. Dump文件 1. Dump文件介绍 Dump文件(Dump File),也叫转储文件,以.DMP为文件后缀.dump文件是进程在内存中的镜像文件,通过转换然后存储成以.DMP后缀的文件.dum ...

  3. vs2008调试c语言,VS2008调试Release程序-Dump文件方式_C/C++技术分享_看流星社区 www.kanliuxing.com...

    在Windows平台下用C++开发应用程序,最不想见到的情况恐怕就是程序崩溃,而要想解决引起问题的bug,最困难的应该就是调试release版本了.因为release版本来就少了很多调试信息,更何况一 ...

  4. dump文件,windbg

    dump文件,在VC中的调试还是非常非常非常有用的,因为我们也不会经每一行代码都加上日志,当然如果你愿意,也可以每一行都加上日志: 在Windows上,添加dump文件有两种方法: 方法一:一个是在程 ...

  5. DUMP文件分析4:栈溢出

    前面说到过,栈溢出类型的异常通过编程的方式获取DUMP可能不成功,因为栈溢出会破坏SEH(结构化异常处理)框架.实际上,通过DUMP文件来调试栈溢出同样是困难的,因为栈溢出本身一般不会造成异常,异常往 ...

  6. 关于Windows程序崩溃(Crash)以及生成dump文件的探究

    文章目录 关于Windows程序崩溃(Crash)以及生成dump文件的探究 什么是崩溃(Crash),崩溃(Crash)的现象 崩溃(Crash)的原因是什么 如何消除崩溃时出现的异常信息对话框 如 ...

  7. java 生成dump文件_程序自动生成Dump文件

    前言:通过drwtsn32.NTSD.CDB等调试工具生成Dump文件,drwtsn32存在的缺点虽然NTSD.CDB可以完全解决,但并不是所有的操作系统中都安装了NTSD.CDB等调试工具.了解了m ...

  8. dotnet core调试docker下生成的dump文件

    最近公司预生产环境.net core应用的docker容器经常出现内存暴涨现象,有时会突然吃掉几个G,触发监控预警,造成容器重启. 分析了各种可能原因,修复了可能发生的内存泄露,经测试本地正常,但是发 ...

  9. centos7 lldb 调试netcore应用的内存泄漏和死循环示例(dump文件调试)

    写个demo来玩一玩linux平台下使用lldb加载sos来调试netcore应用. 当然,在真实的产线环境中需要分析的数据和难度远远高于demo所示,所以demo的作用也仅仅只能起到介绍工具的作用. ...

最新文章

  1. 视频|每日CeBIT:IBM九大展区各显神通,传统工业与工业4.0的博弈
  2. MFC+opencv 显示mat图像
  3. ​CPU单挑到群架发展史
  4. 厂办大集体改制不签字_许昌二印,磨砂技术被外国觊觎,老工人说烂在肚子里也不外漏...
  5. 第一个将Palette Mode引入VVC(H.266),阿里云在JVET会议上引起关注
  6. Mac用户装机必备——让 Mac 也能右键新建/剪切文件,多达 10 余项实用功能
  7. java 内部类 作用,内部类,java内部类的四大作用
  8. 《Java虚拟机原理图解》1.3、class文件里的訪问标志、类索引、父类索引、接口索引集合...
  9. 集总参数电路的判定——电源波长λ和元件尺寸L的比较
  10. 基于OpenCV的计算机视觉入门(5)图像美化(上)
  11. Android应用内存泄漏的定位、分析与解决策略
  12. 如何在MacOS Big Sur中访问隐藏的Mac设置?
  13. Linux命令基础5-文件重定向
  14. 小程序 获取小程序链接
  15. C语言之判断直角三角形
  16. 作为面试官准备提问的问题及其答案
  17. win10计算机管理里找不到设备管理器的解决方法
  18. vbs 打开指定浏览器网页
  19. 传世单机版怎么建立服务端?
  20. 基于微信小程序的汽车租赁系统源码

热门文章

  1. 计算机图形学应用调研论文,计算机图形学的应用论文(2)
  2. (*p)[3]与*p[3]的区别
  3. 用Unity做半个2D战棋小游戏
  4. 芝加哥大学有计算机专业吗,芝加哥大学计算机专业
  5. Google 2016面试题
  6. Photoshop中PNG转TGA的方法
  7. Gingko Framework(struts集成ibatis)
  8. Unity学习 — VideoPlayer控制视频播放、暂停、上下选择播放!
  9. CSS3(Cascading Style Sheet) 层叠样式表
  10. mysql8.0源代码解析_源码解读:MySQL 8.0 InnoDB无锁化设计的日志系统