资源下载

Window端Qt Create dmp的生成与解析

生成

.pro 中的配置

在 pro中加入以下内容,否在在 release下 无法生成pdb

QMAKE_LFLAGS_RELEASE = /INCREMENTAL:NO /DEBUG#加入调试信息
QMAKE_CFLAGS_RELEASE += -g
QMAKE_CXXFLAGS_RELEASE += -g
#禁止优化
QMAKE_CFLAGS_RELEASE -= -O2
QMAKE_CXXFLAGS_RELEASE -= -O2
#release在最后link时默认有"-s”参数,表示"Omit all symbol information from the output file",因此要去掉该参数
QMAKE_LFLAGS_RELEASE = -mthreads #-WlLIBS += -lDbgHelp

在main 函数 添加如下代码

头文件
#ifdef Q_OS_WIN#include <windows.h>#include <dbghelp.h>
#endif
dmp文件的存儲方法
static LONG WINAPI exceptionCallback(struct _EXCEPTION_POINTERS* exceptionInfo)
{QCoreApplication *app = QApplication::instance();QString savePath = app->applicationDirPath() + "dump/";qDebug()<<"save path :"<<savePath;QDir dir(savePath);if (!dir.exists() && !dir.mkpath(savePath)) {app->exit(E_UNEXPECTED);return EXCEPTION_EXECUTE_HANDLER;}savePath.append("assit_");savePath.append(QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz"));savePath.append(".dmp");HANDLE dump = CreateFileW(savePath.toStdWString().c_str(), GENERIC_WRITE,0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if (INVALID_HANDLE_VALUE == dump) {app->exit(E_UNEXPECTED);return EXCEPTION_EXECUTE_HANDLER;}MINIDUMP_EXCEPTION_INFORMATION miniDumpExceptionInfo;miniDumpExceptionInfo.ExceptionPointers = exceptionInfo;miniDumpExceptionInfo.ThreadId = GetCurrentThreadId();miniDumpExceptionInfo.ClientPointers = TRUE;DWORD idProcess = GetCurrentProcessId();MiniDumpWriteDump(GetCurrentProcess(), idProcess, dump,MiniDumpNormal, &miniDumpExceptionInfo, NULL, NULL);CloseHandle(dump);app->exit(E_UNEXPECTED);return EXCEPTION_EXECUTE_HANDLER;
}
mian中調用
#ifdef Q_OS_WINSetUnhandledExceptionFilter(exceptionCallback);
#endif
測試方法
void crash() { volatile int* a = (int*)(NULL); *a = 1; }int main(int argc, char *argv[])
{QApplication a(argc, argv);#ifdef Q_OS_WINSetUnhandledExceptionFilter(exceptionCallback);
#endifMainWindow w;w.show();crash();return a.exec();
}
完整代碼
#include "mainwindow.h"
#include <QApplication>#include <QDir>
#include <qdebug.h>
#include <QDateTime>
#include <QFile>
#include <qglobal.h>#ifdef Q_OS_WIN
#include <windows.h>
#include <dbghelp.h>
#endif#ifdef Q_OS_WIN
static LONG WINAPI exceptionCallback(struct _EXCEPTION_POINTERS* exceptionInfo)
{QCoreApplication *app = QApplication::instance();QString savePath = app->applicationDirPath() + "dump/";qDebug()<<"save path :"<<savePath;QDir dir(savePath);if (!dir.exists() && !dir.mkpath(savePath)) {app->exit(E_UNEXPECTED);return EXCEPTION_EXECUTE_HANDLER;}savePath.append("assit_");savePath.append(QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz"));savePath.append(".dmp");HANDLE dump = CreateFileW(savePath.toStdWString().c_str(), GENERIC_WRITE,0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if (INVALID_HANDLE_VALUE == dump) {app->exit(E_UNEXPECTED);return EXCEPTION_EXECUTE_HANDLER;}MINIDUMP_EXCEPTION_INFORMATION miniDumpExceptionInfo;miniDumpExceptionInfo.ExceptionPointers = exceptionInfo;miniDumpExceptionInfo.ThreadId = GetCurrentThreadId();miniDumpExceptionInfo.ClientPointers = TRUE;DWORD idProcess = GetCurrentProcessId();MiniDumpWriteDump(GetCurrentProcess(), idProcess, dump,MiniDumpNormal, &miniDumpExceptionInfo, NULL, NULL);CloseHandle(dump);app->exit(E_UNEXPECTED);return EXCEPTION_EXECUTE_HANDLER;
}
#endifvoid crash() { volatile int* a = (int*)(NULL); *a = 1; }int main(int argc, char *argv[])
{QApplication a(argc, argv);#ifdef Q_OS_WINSetUnhandledExceptionFilter(exceptionCallback);
#endifMainWindow w;w.show();crash();return a.exec();
}

運行之後,我們發現編譯生成的目錄結構如下 可以看到在debugdump 目錄下生成了.dmp

│ .qmake.stash
│ contents.txt
│ list.bat
│ Makefile
│ Makefile.Debug
│ Makefile.Release
│ ui_mainwindow.h

├─debug
│ Demo.exe
│ main.o
│ mainwindow.o
│ moc_mainwindow.cpp
│ moc_mainwindow.o
│ moc_predefs.h

├─debugdump
│ assit_20200408095624048.dmp

└─release

解析

在Window工具目錄下會有如下文件:

D:/Project/DumTools/| cv2pdb.exe| dbg_amd64.msi
生成pdb

將編譯運行的程序以及dmp文件拷貝到該文件目錄下,打開終端輸入下入命令

./CV2pdb.exe Demo.exe

之後則會在該目錄下生成pdb,我們會發現文件結構如下:

D:/Project/DumTools/| assit_20200408100730098.dmp| cv2pdb.exe| dbg_amd64.msi| Demo.exe| Demo.pdb
安裝windbg.exe

直接點擊該目錄下的dbg_amd64.msi 安裝完成之後,在所按章的目錄下會有一個 windbg.exe 程序。 打開該程序並完成以下配置

依次完成如下配置

打開File 需要完成 Symbol File Path 、Source File Path、Image File Path 的配置

1、Symbol File Path :這裏就是加載pdb文件的路徑,我們直接使用

D:/Project/DumTools/

2、 Source File Path: 加载程序代码 存放的路径(注意切回發佈版本的代碼

D:/Project/Demo/

3、Image File Path: 加載exe 存放的路徑

D:/Project/DumTools/

4、選擇Open Crash Dump 導入生成的dmp文件

5、 输入命令 !analyze -v ,等待几秒后会打印出错误信息

最終完整的解析信息如下:


Microsoft (R) Windows Debugger Version 6.12.0002.633 AMD64
Copyright (c) Microsoft Corporation. All rights reserved.Loading Dump File [D:\tiertime_window\window\assit_20200408100730098.dmp]
User Mini Dump File: Only registers, stack and portions of memory are availableWARNING: Minidump contains unknown stream type 0x15
WARNING: Minidump contains unknown stream type 0x16
Symbol search path is: D:\tiertime_window\window
Executable search path is: D:\tiertime_window\window
Windows 7 Version 18362 MP (4 procs) Free x64
Product: WinNt, suite: SingleUserTS
Machine Name:
Debug session time: Wed Apr  8 10:07:30.000 2020 (UTC + 8:00)
System Uptime: not available
Process Uptime: 0 days 0:00:07.000
................................................................
..........................
This dump file has an exception of interest stored in it.
The stored exception information can be accessed via .ecxr.
(4e04.49f0): Access violation - code c0000005 (first/second chance not available)
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for ntdll.dll -
ntdll!ZwGetContextThread+0x14:
00007ffa`2a1dde54 c3              ret
0:000> !analyze -v
*******************************************************************************
*                                                                             *
*                        Exception Analysis                                   *
*                                                                             *
********************************************************************************** ERROR: Symbol file could not be found.  Defaulted to export symbols for kernel32.dll -
***** OS symbols are WRONG. Please fix symbols to do analysis.*************************************************************************
***                                                                   ***
***                                                                   ***
***    Your debugger is not using the correct symbols                 ***
***                                                                   ***
***    In order for this command to work properly, your symbol path   ***
***    must point to .pdb files that have full type information.      ***
***                                                                   ***
***    Certain .pdb files (such as the public OS symbols) do not      ***
***    contain the required information.  Contact the group that      ***
***    provided you with these symbols if you need this command to    ***
***    work.                                                          ***
***                                                                   ***
***    Type referenced: nt!IMAGE_NT_HEADERS32                         ***
***                                                                   ***
*************************************************************************
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for ole32.dll -
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for Qt5Core.dll -
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for combase.dll -
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for SogouPY.ime -
Failed calling InternetOpenUrl, GLE=12029FAULTING_IP:
Demo!crash+14 [..\Demo\main.cpp @ 56]
00000000`0040191b c70001000000    mov     dword ptr [rax],1EXCEPTION_RECORD:  ffffffffffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 000000000040191b (Demo!crash+0x0000000000000014)ExceptionCode: c0000005 (Access violation)ExceptionFlags: 00000000
NumberParameters: 2Parameter[0]: 0000000000000001Parameter[1]: 0000000000000000
Attempt to write to address 0000000000000000PROCESS_NAME:  Demo.exeADDITIONAL_DEBUG_TEXT:
Use '!findthebuild' command to search for the target build information.
If the build information is available, run '!findthebuild -s ; .reload' to set symbol path and load symbols.MODULE_NAME: DemoFAULTING_MODULE: 00007ffa2a140000 ntdllDEBUG_FLR_IMAGE_TIMESTAMP:  5e8d31d9ERROR_CODE: (NTSTATUS) 0xc0000005 - 0x%pEXCEPTION_CODE: (NTSTATUS) 0xc0000005 - 0x%pEXCEPTION_PARAMETER1:  0000000000000001EXCEPTION_PARAMETER2:  0000000000000000WRITE_ADDRESS:  0000000000000000 FOLLOWUP_IP:
Demo!crash+14 [..\Demo\main.cpp @ 56]
00000000`0040191b c70001000000    mov     dword ptr [rax],1MOD_LIST: <ANALYSIS/>FAULTING_THREAD:  00000000000049f0BUGCHECK_STR:  APPLICATION_FAULT_NULL_POINTER_WRITE_WRONG_SYMBOLSPRIMARY_PROBLEM_CLASS:  NULL_POINTER_WRITEDEFAULT_BUCKET_ID:  NULL_POINTER_WRITELAST_CONTROL_TRANSFER:  from 0000000000401994 to 000000000040191bSTACK_TEXT:
00000000`0073fce0 00000000`00401994 : 00000000`0073fd20 00000000`00000000 ffffffff`00000056 00000000`00070000 : Demo!crash+0x14 [..\Demo\main.cpp @ 56]
00000000`0073fd00 00000000`00403550 : 00000000`00000001 00000000`001c6f60 00000000`02c02490 00000000`00000056 : Demo!qMain+0x6c [..\Demo\main.cpp @ 72]
00000000`0073fd90 00000000`004013c7 : 00000000`00000000 00000000`00000056 00000000`00409970 00000000`00000000 : Demo!GLOBAL__sub_I.00101__ZN10MainWindow18qt_static_metacallEP7QObjectN11QMetaObject4CallEiPPv+0x18da
00000000`0073fe30 00000000`004014cb : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : Demo!public_all+0x3c7
00000000`0073ff00 00007ffa`29347bd4 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : Demo!public_all+0x4cb
00000000`0073ff30 00007ffa`2a1aced1 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : kernel32!BaseThreadInitThunk+0x14
00000000`0073ff60 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!RtlUserThreadStart+0x21STACK_COMMAND:  ~0s; .ecxr ; kbFAULTING_SOURCE_CODE:  52: }53: #endif54: 55:
>   56: 57: void crash() { volatile int* a = (int*)(NULL); *a = 1; }58: 59: int main(int argc, char *argv[])60: {61:     QApplication a(argc, argv);SYMBOL_STACK_INDEX:  0SYMBOL_NAME:  demo!crash+14FOLLOWUP_NAME:  MachineOwnerIMAGE_NAME:  Demo.exeBUCKET_ID:  WRONG_SYMBOLSFAILURE_BUCKET_ID:  NULL_POINTER_WRITE_c0000005_Demo.exe!crashWATSON_STAGEONE_URL:  http://watson.microsoft.com/StageOne/Demo_exe/0_0_0_0/5e8d31d9/Demo_exe/0_0_0_0/5e8d31d9/c0000005/0000191b.htm?Retriage=1Followup: MachineOwner
---------

可以看到 具體的崩潰代碼行 以及具體的方法。

Window端Qt Create dmp的生成与解析相关推荐

  1. QT zint一维码生成解析

    一.前言 本文主要讲解一维码生成的相关知识,并提供zint库编译源码(支持Windows和Linux),以及一个简单运用的Demo 二.相关知识 zint是一维码生成库,可以生成code39,code ...

  2. QT Create OCI方式连接达梦数据库

    QT OCI方式连接达梦数据库 一.背景 用户使用QT Create开发集成软件 OCI的方式连接数据库. 需要说明的是,本人非开发人员,所以在C++代码编写思路或者使用方式上难免有些低级操作,调试中 ...

  3. Qt之JSON生成与解析

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.它基于JavaScript(Standard ECMA-262 3rd Edition - December ...

  4. Qt学习笔记之——生成exe可执行文件并打包生成安装软件

    之前用MFC生成过安装文件,今天想尝试采用Qt生成的exe文件打包并生成安装软件. 开始我认为比较简单,但是尝试过程中遇到了很多问题.下面一一列出来 首先:我认为,要完成一个软件,应尽可能的使用Rel ...

  5. Qt - OpenCV 连续图片生成视频

    Qt - OpenCV 连续图片生成视频 此博客始创于:http://blog.csdn.net/lys211 转载请注明出处 主要是测试OpenCV将连续命名的图片转换成视频的过程. OpenCV的 ...

  6. qt中调用matlab生成的动态库

    前言: 前面已经实现了在vc中调用matlab生成的动态库,请参考:vc中调用matlab生成的动态库 现在在前面已经生成好的matlab动态库的基础上,在qt中调用matlab生成的动态库.生成ma ...

  7. qt实现证件照片自动生成

    qt实现证件照片自动生成. 接上篇,用vs2015生成人像精细分割服务程序后.用qt与opencv+人脸识别来生成证件照 界面如下. 界面很简洁,主要功能有批量生成:背景颜色:选择图片,生成证件照. ...

  8. 使用CLion在Window端进行linux开发

    以往不管是开发x86端linux程序还是arm端linux程序,都是使用Source Insight作为源码编辑工具的,如下图 去年底,发现CLion的2018.3更新版本,可以支持remote ho ...

  9. Kali渗透测试:远程控制被控端免杀及DLL生成、注入反弹

    Kali渗透测试:远程控制被控端免杀及DLL生成.注入反弹 ​ 长期以来,杀毒软件厂商和黑客一直处于博弈的状态,杀毒软件厂商研究了各种检测和清除远程控制被控端的方法,而黑客也在一直致力于研究避开检测的 ...

最新文章

  1. LeetCode 1119. Remove Vowels from a String--C++,Java,Python解法
  2. install tomcat
  3. c带gui的图书馆管理系统_定了!区图书馆24小时城市书屋即将在这天正式对外开放...
  4. linux c语言链表的简单应用之创建链表
  5. boost::multiprecision模块complex128相关的测试程序
  6. 元神一直显示连接服务器失败,原神连接服务器失败是什么情况-提示连接服务器失败处理办法-去秀手游网...
  7. oracle11gasm,Oracle11gASM之ACFS创建案例
  8. JAVA入门级教学之(异常机制的原理到底是什么)
  9. Java基础篇(04):日期与时间API用法详解
  10. linux 查看端口号
  11. 文件压缩 Huffman编码 (java)
  12. virtualBox虚拟机安装UBuntu系统问题及处理
  13. numpy中的方差、协方差、相关系数
  14. java 内嵌机制_[转] Java中public,private,final,static等概念的解读
  15. 【任务分配】基于matlab蚁群算法无人机任务分配【含Matlab源码 1265期】
  16. 金盾播放器android安卓,金盾跨平台视频加密系统
  17. Apache DolphinSchedulerShenYu(Incubating)联合 Meetup,暖春 3 月与你相约!
  18. AutoCAD2014官方原版软件下载
  19. OSWorkflow(转载)
  20. 旷视科技(Face++)和孙剑博士近期一些研究工作总结

热门文章

  1. Mathematica中的绘图
  2. 解决IE6兼容性问题常见方法
  3. Linux_01_课堂笔记
  4. 24 个常见的 Docker 疑难杂症处理技巧
  5. Chrome 升级成最新v33 造成开发上面诸多不便,赶紧回滚v32
  6. UVA1103 古代象形符号 Ancient Messages
  7. Lind.DDD.Messaging框架通讯组件介绍
  8. 三星s8怎么分屏操作_领跑折叠屏手机 三星Galaxy Z Fold2 5G魅力何在
  9. TI DLP4500EVM轻度使用——Pattern创建、烧录、投影
  10. 业务埋点实现用户画像分析,助力精准推送