熟悉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(-1);
17
18     return EXCEPTION_EXECUTE_HANDLER;
19 }
20
21
22 int main(int argc, char* argv[])
23 {
24     QApplication a(argc, argv);
25
26     SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
27
28     //主程序单例模式
29     RunGuard guard("TRMS");
30     if (!guard.tryToRun()) {
31         exit(-1);
32     }
33
34
35
36     //设置Qt的TEXT编码器
37     QTextCodec::setCodecForLocale(QTextCodec::codecForName("gb18030"));
38
39    // any code here
40
41     return a.exec();
42 }

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

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

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

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

Microsoft (R) Windows Debugger Version 6.12.0002.633 X86
Copyright (c) Microsoft Corporation. All rights reserved.Loading Dump File [C:\crashdumps\mid.exe.2324.dmp]
User Mini Dump File with Full Memory: Only application data is availableWARNING: Minidump contains unknown stream type 0x15
WARNING: Minidump contains unknown stream type 0x16
Symbol search path is: srv*c:\symbols*http://msdl.microsoft.com/download/symbols
Executable search path is:
Windows 7 Version 16299 MP (4 procs) Free x64
Product: WinNt, suite: SingleUserTS
Machine Name:
Debug session time: Fri May  4 10:57:03.000 2018 (UTC + 8:00)
System Uptime: 0 days 23:20:34.747
Process Uptime: 0 days 0:00:03.000
........................................
This dump file has an exception of interest stored in it.
The stored exception information can be accessed via .ecxr.
(914.35c4): Access violation - code c0000005 (first/second chance not available)
ntdll!ZwWaitForMultipleObjects+0x14:
00007ffe`5c5b0e14 c3              ret
0:000> !analyze -v
*******************************************************************************
*                                                                             *
*                        Exception Analysis                                   *
*                                                                             *
*******************************************************************************Failed calling InternetOpenUrl, GLE=12029FAULTING_IP:
mid!CJASE2000App::InitInstance+3c [d:\furen-work\furen-projects\tuxedo-projects\zjj\mid\jase2000.cpp @ 223]
00007ff6`ced7aa9c 45892424        mov     dword ptr [r12],r12dEXCEPTION_RECORD:  ffffffffffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 00007ff6ced7aa9c (mid!CJASE2000App::InitInstance+0x000000000000003c)ExceptionCode: c0000005 (Access violation)ExceptionFlags: 00000000
NumberParameters: 2Parameter[0]: 0000000000000001Parameter[1]: 0000000000000000
Attempt to write to address 0000000000000000DEFAULT_BUCKET_ID:  NULL_POINTER_WRITEPROCESS_NAME:  mid.exeERROR_CODE: (NTSTATUS) 0xc0000005 - 0x%pEXCEPTION_CODE: (NTSTATUS) 0xc0000005 - 0x%pEXCEPTION_PARAMETER1:  0000000000000001EXCEPTION_PARAMETER2:  0000000000000000WRITE_ADDRESS:  0000000000000000 FOLLOWUP_IP:
mid!CJASE2000App::InitInstance+3c [d:\furen-work\furen-projects\tuxedo-projects\zjj\mid\jase2000.cpp @ 223]
00007ff6`ced7aa9c 45892424        mov     dword ptr [r12],r12dMOD_LIST: <ANALYSIS/>NTGLOBALFLAG:  0APPLICATION_VERIFIER_FLAGS:  0FAULTING_THREAD:  00000000000035c4PRIMARY_PROBLEM_CLASS:  NULL_POINTER_WRITEBUGCHECK_STR:  APPLICATION_FAULT_NULL_POINTER_WRITELAST_CONTROL_TRANSFER:  from 000000005e44ccae to 00007ff6ced7aa9cSTACK_TEXT:
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]
00000000`00cff710 00007ff6`ceda05e3 : 00000000`02eb4383 00000000`00000000 00000000`00000000 00000000`00000000 : mfc100!AfxWinMain+0x76
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]
00000000`00cff800 00007ffe`5c57f061 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : kernel32!BaseThreadInitThunk+0x14
00000000`00cff830 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!RtlUserThreadStart+0x21FAULTING_SOURCE_CODE:  219:    // registerExceptionHandler(); 220: 221:     int *pSS = NULL;222:
>  223:     *pSS = 0;224:     225:     m_hMutex = CreateMutex( 226:        NULL,                  // no security descriptor227:        FALSE,                 // mutex not owned228:       "KD20_Transaction");  // object nameSYMBOL_STACK_INDEX:  0SYMBOL_NAME:  mid!CJASE2000App::InitInstance+3cFOLLOWUP_NAME:  MachineOwnerMODULE_NAME: midIMAGE_NAME:  mid.exeDEBUG_FLR_IMAGE_TIMESTAMP:  5aebcbd4STACK_COMMAND:  dt ntdll!LdrpLastDllInitializer BaseDllName ; dt ntdll!LdrpFailureData ; ~0s; .ecxr ; kbFAILURE_BUCKET_ID:  NULL_POINTER_WRITE_c0000005_mid.exe!CJASE2000App::InitInstanceBUCKET_ID:  X64_APPLICATION_FAULT_NULL_POINTER_WRITE_mid!CJASE2000App::InitInstance+3cWATSON_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=1Followup: MachineOwner
---------

转载于:https://www.cnblogs.com/foohack/p/7842651.html

windows用户态程序的Dump相关推荐

  1. LibcarePlus用户态程序热补丁

    LibcarePlus https://gitee.com/openeuler/docs/edit/stable2-20.03_LTS_SP1/docs/zh/docs/Virtualization/ ...

  2. 用windbg内核模式调试用户态程序

    使用内核调试会话也可以执行一些用户态调试任务,比如向位于用户态的模块设置断点.但这样做与使用用户态调试器有什么不同呢?我们就以向NTDLL.dll模块的ZwTerminateProcess函数(Stu ...

  3. 用户态程序调用系统态程序-快速系统调用

    在调试程序中,经常发现程序最后会调用到系统态的程序.这个过程是怎样的?用户空间的程序怎样进行系统调用,在此过程中是怎样进入和退出内核的. 根据运行状态和执行代码所在的内存空间的不同,CPU既可以运行于 ...

  4. perf 程序追踪 USDT 用户态程序静态跟踪点

    perf 中的 usdt 在学习 ebpf 的 usdt 探针的时候遇到了问题,看了一些网上的链接,在 gregg 大神的博客中找到了 perf 中与 usdt 相关的内容,就研究了一下. perf ...

  5. 使用Windbg内核调试连接调试用户态程序的方法

    1. 中断目标计算机: 2. kd>!process 0 0 3. 找到要调试的程序对应进程: 4. kd>.process /i TARGETPROCESSADDRESS 5. kd&g ...

  6. 用户态程序阻塞原因_进程阻塞 操作系统某种情况进行进程的阻塞和唤醒操作...

    进程阻塞 1)请求系统服务.例如打印服务,进程在提出打印请求后,系统创建打印服务进程为该进程服务,而提出打印请求可能被阻塞起来等待打印的完成. 2)启动某种操作.例如,进程发出启动I/O或启动打印机的 ...

  7. 操作系统基础知识用户态和内核态的区别

    这节课给你带来了一道非常经典的面试题目:用户态线程和内核态线程有什么区别? 这是一个组合型的问题,由很多小问题组装而成,比如: 用户态和内核态是什么? 用户级线程和内核级线程是一个怎样的对应关系? 内 ...

  8. 用户态和内核态:用户态线程和内核态线程有什么区别?

    转载 文章来源于 拉钩教育 重学操作系统 林䭽 用户态和内核态:用户态线程和内核态线程有什么区别? 什么是用户态和内核态 Kernel 运行在超级权限模式(Supervisor Mode)下,所以拥有 ...

  9. Linux用户态和内核态

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

最新文章

  1. 别再盲目学 Python 了!
  2. 初识github之注册和基本概念
  3. kafka mysql安装与配置_Mac环境canal+mysql+kafka的安装及使用
  4. 完美解决NV4_disp.dll已正常停止工作”蓝屏问题
  5. git add后取消_git 必看,各种撤销操作
  6. dumpbin发现没有入口函数_JavaScript基础之入口函数-2020版
  7. 【upstream】Nginx配置upstream实现负载均衡
  8. MXRuntimeUtils,替代 [NSObject performSelector object object ]的工具
  9. 数据结构: 树 (查找树)
  10. 深入浅出通信原理知识点10
  11. window电脑H265(HEVC)编码的mp4不显示缩略图解决办法
  12. 64位oracle plsql developer 下载地址,plsql developer
  13. Ubuntu 16.04 显示器分辨率低
  14. C语言用一维数组模拟抛硬币,模拟抛硬币(C语言实现)
  15. 聊聊游戏本推荐排行榜 这一款竟成黑马
  16. Python - 随机生成英文字母
  17. Linux下安装bugzilla
  18. linux网卡slave状态,生产环境中linux bonding 主备模式slave网卡切换的方法
  19. android浏览器插件介绍
  20. 我的世界末日之后无限法则服务器,Last Day Rules官方版

热门文章

  1. VB:将短文件名格式转成长文件名
  2. 最新手机芯片AI跑分出炉:高通、联发科力压华为
  3. GitHub标星2600,从零开始的深度学习实用教程 | PyTorch官方推荐
  4. 吴恩达:我的AI商业化方法论
  5. 有钱了不起?!苹果猎头挖到马斯克没脾气,特斯拉股东公开求收购
  6.  ̄□ ̄他咬了蜘蛛一口,从此蜘蛛精通C语言
  7. Docker动荡在继续:创始人兼CTO离职
  8. 李飞飞最新研究成果!斯坦福正在用算法判断政治倾向
  9. AI如何变革阿里电商?iDST首席科学家任小枫首次公开演讲
  10. iOS开发之使用Git的基本使用(二)