概述:

  1. 注册生成dump文件的函数。
  2. 当程序收到没有捕获的异常时,调用上述函数,生成dump文件。
  3. 利用Windbg结合编译程序时生成的pdb和代码来分析dump文件,定位问题。

如下代码生成dump文件(转):

#include <Windows.h>
#include <stdio.h>
#include <DbgHelp.h>
#pragma comment(lib, "dbghelp.lib") inline BOOL IsDataSectionNeeded(const WCHAR* pModuleName)
{
if(pModuleName == NULL)
{
return FALSE;
} WCHAR szFileName[_MAX_FNAME] = L"";
_wsplitpath(pModuleName, NULL, NULL, szFileName, NULL); if(wcsicmp(szFileName, L"ntdll") == )
return TRUE; return FALSE;
} inline BOOL CALLBACK MiniDumpCallback(PVOID pParam,
const PMINIDUMP_CALLBACK_INPUT pInput,
PMINIDUMP_CALLBACK_OUTPUT pOutput)
{
if(pInput == || pOutput == )
return FALSE; switch(pInput->CallbackType)
{
case ModuleCallback:
if(pOutput->ModuleWriteFlags & ModuleWriteDataSeg)
if(!IsDataSectionNeeded(pInput->Module.FullPath))
pOutput->ModuleWriteFlags &= (~ModuleWriteDataSeg);
case IncludeModuleCallback:
case IncludeThreadCallback:
case ThreadCallback:
case ThreadExCallback:
return TRUE;
default:;
} return FALSE;
} inline void CreateMiniDump(PEXCEPTION_POINTERS pep, LPCTSTR strFileName)
{
HANDLE hFile = CreateFile(strFileName, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(hFile != INVALID_HANDLE_VALUE)
{
MINIDUMP_EXCEPTION_INFORMATION mdei;
mdei.ThreadId = GetCurrentThreadId();
mdei.ExceptionPointers = pep;
mdei.ClientPointers = FALSE; MINIDUMP_CALLBACK_INFORMATION mci;
mci.CallbackRoutine = (MINIDUMP_CALLBACK_ROUTINE)MiniDumpCallback;
mci.CallbackParam = NULL; ::MiniDumpWriteDump(::GetCurrentProcess(), ::GetCurrentProcessId(), hFile, MiniDumpNormal, (pep != NULL) ? &mdei : NULL, NULL, &mci); CloseHandle(hFile);
}
} LONG __stdcall MyUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)
{
CreateMiniDump(pExceptionInfo, "core.dmp"); return EXCEPTION_EXECUTE_HANDLER;
}

确保程序开始执行如下代码,然后程序崩溃时会调用上面代码创建dump文件:

SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);

分析生成的dump文件需要如下:

  • 编译程序时生成的PDB,如果是release版本:

    •   需要禁用优化 - VS - Project Property - C/C++ Optimization - Release - Optimization - Disabled
    •   启用生成调试信息 - VS - Project Property - Linker - Debugging - Generate Debug Info - Yes.
  • 代码

分析dump文件步骤如下:

  1. 运行Windbg。
  2. 指定PDB文件路径: File - Symbol File Path。多个路径用分号分隔。
  3. 指定代码路径:File - Source File Path
  4. 载入dump文件。
  5. Windbg命令行输入:  !analyze -v
  6. 等待结果 - 函数调用堆栈,程序崩溃代码。busy状态表示正在生成结果。

注释:

  • 没有代码,只有PDB,也可以显示函数调用堆栈,但是不会定位到具体代码。
  • Windbg中,配置 Symbol File Path: srv*c:\symbols*http://msdl.microsoft.com/download/symbols,可以解决本地找不到symbol问题。定位一般问题,不是必须。c:\symbols为本地缓存PDB目录。只会同步用到的symbol。
  • Windbg的附带工具symchk可以用来下载指定dll的pdb文件:
    • 下载特定dll的pdb文件:symchk /r c:\windows\system32\secur32.dll /s SRV*c:\symbols\*http://msdl.microsoft.com/download/symbols
    • 下载特定目录下的dll的pdb文件:symchk /r c:\windows\system32 /s SRV*c:\symbols\*http://msdl.microsoft.com/download/symbols
  • 如果dump文件被拷贝到编译程序的机器上,无需指定代码路径,只需指定pdb文件,可自动定位代码。

Windows下利用Windbg 分析dump的更多相关文章

  1. mac下利用Breakpad的dump文件进行调试

    一.前情回顾 最近把公司的一个视频处理程序更新了一个版本,准备提交测试的发现了崩溃的情况.这个程序采用Qt和ffmpeg技术栈开发,主要用于对视频进行渲染拼接处理,在Windows和mac两个平台同时 ...

  2. WinDbg分析Dump常用方法和命令

    记录下自己使用WinDbg分析Dump时常用的一些方法和命令 !analyze -v //找出出错的堆 .exrc //找到程序崩溃的位置 !heap //打印出错函数的局部位置 !for_each_ ...

  3. windows下利用iis建立网站网站并实现局域共享

    博客园 首页 新随笔 联系 管理 订阅 随笔- 54  文章- 9  评论- 0  Windows下利用IIS建立网站并实现局域网共享 https://blog.csdn.net/qq_4148541 ...

  4. 使用 WinDbg 分析dump文件

    步骤一: 生成dump文件. #include <Windows.h> #include <iostream> #include <DbgHelp.h> #incl ...

  5. WinDbg分析DUMP文件

    1. 如何生成dump文件?     原理:通过SetUnhandledExceptionFilter设置捕获dump的入口,然后通过MiniDumpWriteDump生成dump文件:       ...

  6. 利用Windbg分析Magicodes.IE一次错误编写导致内存剧增

    由于这近一年时间一直忙于写书和工作,一直没有水文,但是近期有几位朋友使用我们的Magicodes.IE反馈在导出过程中内存暴涨...好吧,不管怎样,不能苦了我们朋友,接下来我们通过windbg来看一下 ...

  7. WinDbg 分析dump

    1.生成dump文件. 在代码捕获异常,并将异常写入dump文件. #include "stdafx.h" #include <Windows.h> #include ...

  8. windows下利用dll生成lib

    原来工程编译的一些dll库,这次项目需要静态库,偷懒想直接转化.看到网上一些教程,使用VC工具和建立lib项目来实现.有点麻烦.还有一种方法,仅仅利用工具和几条命令转化.来试试看.文章参考harrie ...

  9. 利用windbg分析崩溃,句柄泄漏,死锁,CPU高,内存泄漏

    Windbg的一些简单使用命令 一.崩溃 1.  输入.ecxr;kbn得到崩溃的堆栈 其中源代码如下 2.  查看堆栈和源代码,发现第0帧导致崩溃,代码也是本地代码 输入.frame  0,切到第0 ...

随机推荐

  1. enmo_day_05

    大文件表空间 小文件表空间 临时表空间 :不需自己删除,session断了之后自动删除 永久表空间 : 本地管理表空间 :使用位图表示表空间,0表示没有数据,1表示有数据, 数据字典管理表空间 eg ...

  2. WCF开发指南之构建服务

    一. 引言 Windows通讯基础(简称为WCF)是一种SDK,用于让你使用典型的CLR编程结构(例如用于发布和消费服务的类和接口等)来构建Windows面向服务的应用程序.WCF的编程模型是声明性的 ...

  3. 安装生物信息学软件-Samtools

    装完Bowtie2,官方文档给出的栗子说可以玩一玩samtools,所以我入个坑 参考这篇http://m.010lm.com/roll/2016/0620/2343389.html Step 1: ...

  4. hibernate的数据库乱码问题

    <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration ...

  5. Javascript 事件(一)

    焦点事件获取焦点事件onfocus \  失去焦点事件 onblur 使浏览器能够区分用户输入的对象,当一个元素有焦点的时候,那么他就可以接收用户的输入.我们可以通过一些方式给元素设置焦点    1. ...

  6. Bootstap datetimepicker报错TypeError: intermediate value(转)

    原文转自:http://blog.chinaunix.net/uid-20332519-id-5733546.html Bootstrap datetimepicker有多个版本,官方的链接中,只是d ...

  7. windows环境下,如何启动chromedriver

    java -jar selenium-server-standalone-2.41.0.jar -Dwebdriver.chrome.driver="C:\Program Files\Goo ...

  8. Openstack Neutron L2 Population

    Why do we need it, whatever it is? VM unicast, multicast and broadcast traffic flow is detailed in m ...

  9. Python Queue队列

    queue is especially useful in threaded programming when information must be exchanged safely between ...

  10. [zz] 混合高斯模型 Gaussian Mixture Model

    聚类(1)——混合高斯模型 Gaussian Mixture Model http://blog.csdn.net/jwh_bupt/article/details/7663885 聚类系列: 聚类( ...