windows用戶態程序的Dump

熟悉Linux的開發人員都知道,在Linux下開發程序,若是程序崩潰了,能夠經過配置Core Dump,來讓程序崩潰的瞬間產生一個Dump文件,而後經過dump文件來調試程序爲何崩潰。可是windows下就比較麻煩。html

windows下配置用戶態程序的Dump很是麻煩, https://msdn.microsoft.com/en-us/library/windows/desktop/bb787181(v=vs.85).aspxwindows

上面那個連接說了一堆,反正我沒有細看。來看通過搜索,發現StackOverflow上推薦了一個UserDump.exe的命令行工具,session

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

用法是:函數

 

下載下來,安裝,解壓到特定目錄,裏面就能夠看到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名。ui

userdump命令行還有其餘用法,能夠作不少事情。這裏很少說了,這裏只是讓程序崩潰產生自身的Dump,相似Linux。編碼

 

固然,還有修改註冊表的方式來讓系統自動產生Dump,最推薦這樣的方式,這樣產生的Dump最爲準確: https://www.cnblogs.com/hushaojun/p/6388153.htmlspa

 

若是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 available

WARNING: 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=12029

FAULTING_IP: 
mid!CJASE2000App::InitInstance+3c [d:\furen-work\furen-projects\tuxedo-projects\zjj\mid\jase2000.cpp @ 223]
00007ff6`ced7aa9c 45892424        mov     dword ptr [r12],r12d

EXCEPTION_RECORD:  ffffffffffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 00007ff6ced7aa9c (mid!CJASE2000App::InitInstance+0x000000000000003c)
   ExceptionCode: c0000005 (Access violation)
  ExceptionFlags: 00000000
NumberParameters: 2
   Parameter[0]: 0000000000000001
   Parameter[1]: 0000000000000000
Attempt to write to address 0000000000000000

DEFAULT_BUCKET_ID:  NULL_POINTER_WRITE

PROCESS_NAME:  mid.exe

ERROR_CODE: (NTSTATUS) 0xc0000005 - 0x%p

EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - 0x%p

EXCEPTION_PARAMETER1:  0000000000000001

EXCEPTION_PARAMETER2:  0000000000000000

WRITE_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],r12d

MOD_LIST: <ANALYSIS/>

NTGLOBALFLAG:  0

APPLICATION_VERIFIER_FLAGS:  0

FAULTING_THREAD:  00000000000035c4

PRIMARY_PROBLEM_CLASS:  NULL_POINTER_WRITE

BUGCHECK_STR:  APPLICATION_FAULT_NULL_POINTER_WRITE

LAST_CONTROL_TRANSFER:  from 000000005e44ccae to 00007ff6ced7aa9c

STACK_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+0x21


FAULTING_SOURCE_CODE:  
   219:    // registerExceptionHandler(); 
   220: 
   221:     int *pSS = NULL;
   222: 
>  223:     *pSS = 0;
   224:     
   225:     m_hMutex = CreateMutex( 
   226: 		NULL,                  // no security descriptor
   227: 		FALSE,                 // mutex not owned
   228: 		"KD20_Transaction");  // object name


SYMBOL_STACK_INDEX:  0

SYMBOL_NAME:  mid!CJASE2000App::InitInstance+3c

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: mid

IMAGE_NAME:  mid.exe

DEBUG_FLR_IMAGE_TIMESTAMP:  5aebcbd4

STACK_COMMAND:  dt ntdll!LdrpLastDllInitializer BaseDllName ; dt ntdll!LdrpFailureData ; ~0s; .ecxr ; kb

FAILURE_BUCKET_ID:  NULL_POINTER_WRITE_c0000005_mid.exe!CJASE2000App::InitInstance

BUCKET_ID:  X64_APPLICATION_FAULT_NULL_POINTER_WRITE_mid!CJASE2000App::InitInstance+3c

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

Followup: MachineOwner
---------
相關文章
相關標籤/搜索