熟悉Linux的开发人员都知道,在Linux下开发程序,如果程序崩溃了,可以通过配置Core Dump,来让程序崩溃的瞬间产生一个Dump文件,然后通过dump文件来调试程序为什么崩溃。但是windows下就比较麻烦。

windows下配置用户态程序的Dump非常麻烦, https://msdn.microsoft.com/en-us/library/windows/desktop/bb787181(v=vs.85).aspx

上面那个链接说了一堆,反正我没有细看。来看经过搜索,发现StackOverflow上推荐了一个UserDump.exe的命令行工具,

这个工具是微软官方出品的,https://support.microsoft.com/zh-cn/help/241215/how-to-use-the-userdump-exe-tool-to-create-a-dump-file

用法是:

下载下来,安装,解压到特定目录,里面就可以看到userdump.exe这个命令行工具了,把这个命令行工具随着公司的产品软件打包,在产品软件中的main函数中编写如下代码:

  1. LONG __stdcall
  2. MyUnhandledExceptionFilter(
  3. EXCEPTION_POINTERS *ExceptionInfo
  4. )
  5. {
  6. // Invoke userdump here.
  7. // The implementation is similar to MyFilterFunction,
  8. // above.
  9. (void)ExceptionInfo;
  10.  
  11. QString dumperExe = QString("%1/%2/%3").arg(qApp->applicationDirPath()).arg("dumper").arg("userdump.exe");
  12. QString cmdLine = QString("%1 -k -w %2").arg(dumperExe).arg("TRMSMonitor.exe");
  13.  
  14. QProcess* startDump = new QProcess;
  15. startDump->start(cmdLine);
  16. startDump->waitForFinished(-);
  17.  
  18. return EXCEPTION_EXECUTE_HANDLER;
  19. }
  20.  
  21. int main(int argc, char* argv[])
  22. {
  23. QApplication a(argc, argv);
  24.  
  25. SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
  26.  
  27. //主程序单例模式
  28. RunGuard guard("TRMS");
  29. if (!guard.tryToRun()) {
  30. exit(-);
  31. }
  32.  
  33. //设置Qt的TEXT编码器
  34. QTextCodec::setCodecForLocale(QTextCodec::codecForName("gb18030"));
  35.  
  36. // any code here
  37.  
  38. return a.exec();
  39. }

以上代码的意思是,在程序崩溃的瞬间,未处理异常的时刻,调用userdump命令行来生成程序自身的Dump文件,我试过了,解引用空指针的异常成功生成了Dump文件。TRMSMonitor.exe,这个可以替换为产品主程序的exe名。

userdump命令行还有其他用法,可以做很多事情。这里不多说了,这里只是让程序崩溃产生自身的Dump,类似Linux。

当然,还有修改注册表的方式来让系统自动产生Dump,最推荐这样的方式,这样产生的Dump最为准确: https://www.cnblogs.com/hushaojun/p/6388153.html

如果WinDbg下载了符号表,那么直接可以把产生crash的源码崩溃地点显示出来:

  1. Microsoft (R) Windows Debugger Version 6.12.0002.633 X86
  2. Copyright (c) Microsoft Corporation. All rights reserved.
  3.  
  4. Loading Dump File [C:\crashdumps\mid.exe.2324.dmp]
  5. User Mini Dump File with Full Memory: Only application data is available
  6.  
  7. WARNING: Minidump contains unknown stream type 0x15
  8. WARNING: Minidump contains unknown stream type 0x16
  9. Symbol search path is: srv*c:\symbols*http://msdl.microsoft.com/download/symbols
  10. Executable search path is:
  11. Windows 7 Version 16299 MP (4 procs) Free x64
  12. Product: WinNt, suite: SingleUserTS
  13. Machine Name:
  14. Debug session time: Fri May 4 10:57:03.000 2018 (UTC + 8:00)
  15. System Uptime: 0 days 23:20:34.747
  16. Process Uptime: 0 days 0:00:03.000
  17. ........................................
  18. This dump file has an exception of interest stored in it.
  19. The stored exception information can be accessed via .ecxr.
  20. (914.35c4): Access violation - code c0000005 (first/second chance not available)
  21. ntdll!ZwWaitForMultipleObjects+0x14:
  22. 00007ffe`5c5b0e14 c3 ret
  23. 0:000> !analyze -v
  24. *******************************************************************************
  25. * *
  26. * Exception Analysis *
  27. * *
  28. *******************************************************************************
  29.  
  30. Failed calling InternetOpenUrl, GLE=12029
  31.  
  32. FAULTING_IP:
  33. mid!CJASE2000App::InitInstance+3c [d:\furen-work\furen-projects\tuxedo-projects\zjj\mid\jase2000.cpp @ 223]
  34. 00007ff6`ced7aa9c 45892424 mov dword ptr [r12],r12d
  35.  
  36. EXCEPTION_RECORD: ffffffffffffffff -- (.exr 0xffffffffffffffff)
  37. ExceptionAddress: 00007ff6ced7aa9c (mid!CJASE2000App::InitInstance+0x000000000000003c)
  38. ExceptionCode: c0000005 (Access violation)
  39. ExceptionFlags: 00000000
  40. NumberParameters: 2
  41. Parameter[0]: 0000000000000001
  42. Parameter[1]: 0000000000000000
  43. Attempt to write to address 0000000000000000
  44.  
  45. DEFAULT_BUCKET_ID: NULL_POINTER_WRITE
  46.  
  47. PROCESS_NAME: mid.exe
  48.  
  49. ERROR_CODE: (NTSTATUS) 0xc0000005 - 0x%p
  50.  
  51. EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - 0x%p
  52.  
  53. EXCEPTION_PARAMETER1: 0000000000000001
  54.  
  55. EXCEPTION_PARAMETER2: 0000000000000000
  56.  
  57. WRITE_ADDRESS: 0000000000000000
  58.  
  59. FOLLOWUP_IP:
  60. mid!CJASE2000App::InitInstance+3c [d:\furen-work\furen-projects\tuxedo-projects\zjj\mid\jase2000.cpp @ 223]
  61. 00007ff6`ced7aa9c 45892424 mov dword ptr [r12],r12d
  62.  
  63. MOD_LIST: <ANALYSIS/>
  64.  
  65. NTGLOBALFLAG: 0
  66.  
  67. APPLICATION_VERIFIER_FLAGS: 0
  68.  
  69. FAULTING_THREAD: 00000000000035c4
  70.  
  71. PRIMARY_PROBLEM_CLASS: NULL_POINTER_WRITE
  72.  
  73. BUGCHECK_STR: APPLICATION_FAULT_NULL_POINTER_WRITE
  74.  
  75. LAST_CONTROL_TRANSFER: from 000000005e44ccae to 00007ff6ced7aa9c
  76.  
  77. STACK_TEXT:
  78. 00000000`00cff3a0 00000000`5e44ccae : 00000000`00000001 00000000`00000001 00007ff6`ced30000 00000000`00000000 : mid!CJASE2000App::InitInstance+0x3c [d:\furen-work\furen-projects\tuxedo-projects\zjj\mid\jase2000.cpp @ 223]
  79. 00000000`00cff710 00007ff6`ceda05e3 : 00000000`02eb4383 00000000`00000000 00000000`00000000 00000000`00000000 : mfc100!AfxWinMain+0x76
  80. 00000000`00cff750 00007ffe`5a8d1fe4 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : mid!__tmainCRTStartup+0x15f [f:\dd\vctools\crt_bld\self_64_amd64\crt\src\crtexe.c @ 547]
  81. 00000000`00cff800 00007ffe`5c57f061 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : kernel32!BaseThreadInitThunk+0x14
  82. 00000000`00cff830 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!RtlUserThreadStart+0x21
  83.  
  84. FAULTING_SOURCE_CODE:
  85. 219: // registerExceptionHandler();
  86. 220:
  87. 221: int *pSS = NULL;
  88. 222:
  89. > 223: *pSS = 0;
  90. 224:
  91. 225: m_hMutex = CreateMutex(
  92. 226: NULL, // no security descriptor
  93. 227: FALSE, // mutex not owned
  94. 228: "KD20_Transaction"); // object name
  95.  
  96. SYMBOL_STACK_INDEX: 0
  97.  
  98. SYMBOL_NAME: mid!CJASE2000App::InitInstance+3c
  99.  
  100. FOLLOWUP_NAME: MachineOwner
  101.  
  102. MODULE_NAME: mid
  103.  
  104. IMAGE_NAME: mid.exe
  105.  
  106. DEBUG_FLR_IMAGE_TIMESTAMP: 5aebcbd4
  107.  
  108. STACK_COMMAND: dt ntdll!LdrpLastDllInitializer BaseDllName ; dt ntdll!LdrpFailureData ; ~0s; .ecxr ; kb
  109.  
  110. FAILURE_BUCKET_ID: NULL_POINTER_WRITE_c0000005_mid.exe!CJASE2000App::InitInstance
  111.  
  112. BUCKET_ID: X64_APPLICATION_FAULT_NULL_POINTER_WRITE_mid!CJASE2000App::InitInstance+3c
  113.  
  114. WATSON_STAGEONE_URL: http://watson.microsoft.com/StageOne/mid_exe/2_0_0_0/5aebcbd4/mid_exe/2_0_0_0/5aebcbd4/c0000005/0004aa9c.htm?Retriage=1
  115.  
  116. Followup: MachineOwner
  117. ---------

windows用户态程序的Dump的更多相关文章

  1. Linux用户态程序计时方式详解

    前言 良好的计时器可帮助程序开发人员确定程序的性能瓶颈,或对不同算法进行性能比较.但要精确测量程序的运行时间并不容易,因为进程切换.中断.共享的多用户.网络流量.高速缓存访问及转移预测等因素都会对程序 ...

  2. Linux用户态程序计时方式详解[转]

    转自: http://www.cnblogs.com/clover-toeic/p/3845210.html 前言 良好的计时器可帮助程序开发人员确定程序的性能瓶颈,或对不同算法进行性能比较.但要精确 ...

  3. Windbg 内核态调试用户态程序然后下断点正确触发方法(亲自实现发现有效)

    先开启真机内核态kernel调试 !process 0 0 svchost.exe 找到进程cid的地址 然后进入 .process /p  fffffa8032be2870 然后 .process ...

  4. 初探Windows用户态调试机制

    我们在感叹Onlydbg强大与便利的同时,是否考虑过它实现的原理呢? 作为一个技术人员知其然必知其所以然,这才是我们追求的本心. 最近在学习张银奎老师的<软件调试>,获益良多.熟悉Wind ...

  5. 总在用户态调试 C# 程序,终还是搭了一个内核态环境

    一:背景 一直在用 WinDbg 调试用户态程序,并没有用它调试过 内核态,毕竟不是做驱动开发,也没有在分析 dump 中需要接触用内核态的需求,但未知的事情总觉得很酷,加上最近在看 <深入解析 ...

  6. NtCallbackReturn是否导致了用户态栈的不平衡

    0:000> u ntdll!KiFastSystemCall ntdll!KiFastSystemCall: 7c92eb8b 8bd4 mov edx,esp 7c92eb8d 0f34 s ...

  7. Linux用户态和内核态

    究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子: 1)例 ...

  8. linux 用户态 内核态

    http://blog.chinaunix.net/uid-1829236-id-3182279.html 究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在 ...

  9. Linux 用户态和内核态

    1.特权级特权级用来管理和控制程序执行.如Intel x86架构的CPU,有0~3四个特权级,0级最高,3级最低.硬件在执行每条指令时都会检查指令具有的特权级.硬件提供了特权级使用机制,对操作系统来说 ...

随机推荐

  1. Tiny210 U-BOOT(二)----配置时钟频率基本原理

    U-BOOT在启动的过程中,需要配置系统时钟. 配置系统时钟,大概是以下几个步骤: (1)设置系统PLL锁定时间 (2)配置PLL (3)配置各模块分频系数 (4)切换到PLL时钟 1.基本原理 首先 ...

  2. 奇怪吸引子---BurkeShaw

    奇怪吸引子是混沌学的重要组成理论,用于演化过程的终极状态,具有如下特征:终极性.稳定性.吸引性.吸引子是一个数学概念,描写运动的收敛类型.它是指这样的一个集合,当时间趋于无穷大时,在任何一个有界集上出 ...

  3. bat 批处理切换到当前脚本所在文件夹

    bat 批处理切换到当前脚本所在文件夹   切换到当前脚本所在的文件夹 ? 1 cd  %~dp0 另外附上一些bat基本内容 —————————————————————————————— 批处理常用 ...

  4. 关于android SDK安装Failed to fetch URL 一点思考

    最近SDK出问题了,然后在google下载了一个android-sdk-windows.rar,然后点击SDK Manager,结果一直不能刷新API Level,然后就开始在网上找了好多资料,解决这 ...

  5. Android -- MediaRecord

    MediaRecord 集成了录音.编码.压缩等,支持少量的录音音频格式,大概有.aac .amr .3gp 优点:大部分以及集成,直接调用相关接口即可,代码量小 缺点:无法实时处理音频:输出的音频格 ...

  6. 实战HMM-Viterbi角色标注地名识别

    http://www.hankcs.com/nlp/ner/place-names-to-identify-actual-hmm-viterbi-role-labeling.html 命名实体识别(N ...

  7. Linux系统中查找、删除重复文件,释放磁盘空间。

    在Linux系操作系统中查找并删除重复文件的方法的确有很多,不过这里介绍的是一款非常简单实用的软件FSlint.FSlint是一个重复文件查找工具,可以使用它来清除不必要的重复文件,笔者经常使用它来释 ...

  8. 强制开启android webview debug模式使用Chrome inspect

    强制开启android webview debug模式使用Chrome inspect https://blog.csdn.net/zhulin2609/article/details/5143782 ...

  9. VMware中创建Ubuntu16.0.4虚拟桥连方式无法上网

    一.问题描述 在本地VMvare中已经安装了两台虚拟机,网络方式都是桥连,上网都可以自动获取IP地址 和HOST主机是一个号段的 ,同为192.168.1.X KingServer1(原始安装)  桥 ...

  10. linux 常用命令--------雪松整理

    linux 常用命令--------雪松整理 博客: http://hi.baidu.com/quanzhou722/blog错误在所难免,还望指正!========================= ...