2018-01-12  创建人:Ruo_Xiao
2018-01-15  修改人:Ruo_Xiao
添加为dump、exe和pdb版本保持一致的原因。

一、minidump文件

  1. 崩溃转储是创建一个应用程序崩溃瞬间的状态镜像。
  2. 初代的转储文件是记录了进程的虚拟空间中全部内容,但是这样的文件非常大,而且对于不太熟练使用的人员来说冗余信息太多。
  3. xp之后,MicroSoft发明了“minidump”的转储技术,即:小型的,只是包含了必要的线程调用堆栈等信息文件。该文件很小,很容易通过网络发送,同时也可以定制该文件记录的信息,非常的灵活。
  4. 生成minidump的函数包含在DbgHelp.dll中。

二、pdb文件

后续加入!

三、注意事项

1、 exe文件、dmp文件和pdb文件必须保持一致!

在上篇博客中,我们简单的介绍了如何用dmp文件和pdb文件定位代码中崩溃位置。链接如下:
http://blog.csdn.net/itworld123/article/details/79041500
上述能够成功定位的一个前提是exe文件、dmp文件和pdb文件都是同时生成的,即:exe文件和pdb文件同时生成,dmp文件是由当前exe生成的。若生成崩溃信息之后,又重新编译了exe,与此同时也重新生成了pdb文件,那么即使代码没有任何改动,此时WinDbg也没有办法进行代码行号定位了,显示的信息如下:

WRITE_ADDRESS:  0000000c FOLLOWUP_IP:
TEST11+100b
012b100b c7050c00000005000000 mov dword ptr ds:[0Ch],5MOD_LIST: <ANALYSIS/>FAULTING_THREAD:  0000139cBUGCHECK_STR:  APPLICATION_FAULT_NULL_CLASS_PTR_DEREFERENCE_INVALID_POINTER_WRITE_WRONG_SYMBOLSPRIMARY_PROBLEM_CLASS:  NULL_CLASS_PTR_DEREFERENCEDEFAULT_BUCKET_ID:  NULL_CLASS_PTR_DEREFERENCELAST_CONTROL_TRANSFER:  from 746b336a to 012b100bSTACK_TEXT:
WARNING: Stack unwind information not available. Following frames may be wrong.
0029f934 746b336a 7efde000 0029f980 77139902 TEST11+0x100b
0029f940 77139902 7efde000 7735f926 00000000 kernel32!BaseThreadInitThunk+0x12
0029f980 771398d5 012b132d 7efde000 00000000 ntdll!RtlInitializeExceptionChain+0x63
0029f998 00000000 012b132d 7efde000 00000000 ntdll!RtlInitializeExceptionChain+0x36STACK_COMMAND:  ~0s; .ecxr ; kbSYMBOL_STACK_INDEX:  0SYMBOL_NAME:  TEST11+100bFOLLOWUP_NAME:  MachineOwnerIMAGE_NAME:  TEST11.exeBUCKET_ID:  WRONG_SYMBOLSFAILURE_BUCKET_ID:  NULL_CLASS_PTR_DEREFERENCE_c0000005_TEST11.exe!UnknownWATSON_STAGEONE_URL:  http://watson.microsoft.com/StageOne/TEST11_exe/0_0_0_0/5a58a12a/TEST11_exe/0_0_0_0/5a58a12a/c0000005/0000100b.htm?Retriage=1Followup: MachineOwner

上述信息大家可以看到,定位源码的功能已经消失了。

2、关闭代码优化功能。

#include "stdafx.h"
#include <windows.h>#include <DbgHelp.h>
#pragma comment(lib,"Dbghelp.lib")static long  __stdcall CrashInfocallback(_EXCEPTION_POINTERS *pexcp);void ErrorFun(int *p)
{p[2] = 10;  //这里崩溃
}int _tmain(int argc, _TCHAR* argv[])
{::SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)CrashInfocallback);int *pi = NULL;  ErrorFun(pi);  return 0;
}long  __stdcall CrashInfocallback( _EXCEPTION_POINTERS *pexcp)
{HANDLE hDumpFile = ::CreateFile(L"MEMORY.DMP",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);if( hDumpFile != INVALID_HANDLE_VALUE){MINIDUMP_EXCEPTION_INFORMATION dumpInfo;dumpInfo.ExceptionPointers = pexcp;dumpInfo.ThreadId = ::GetCurrentThreadId();dumpInfo.ClientPointers = TRUE;::MiniDumpWriteDump(::GetCurrentProcess(),::GetCurrentProcessId(),hDumpFile,MiniDumpNormal,&dumpInfo,NULL,NULL);}::CloseHandle(hDumpFile);return 0;
}

上述代码在没有关闭代码优化功能的情况下,按照上篇博客的方法,生成的信息如下:

WRITE_ADDRESS:  00000008 FOLLOWUP_IP:
TEST11!wmain+b [d:\huawei\projects\test11\test11\test11.cpp @ 22]
013e100b c705080000000a000000 mov dword ptr ds:[8],0AhMOD_LIST: <ANALYSIS/>FAULTING_THREAD:  00000814BUGCHECK_STR:  APPLICATION_FAULT_NULL_CLASS_PTR_DEREFERENCE_INVALID_POINTER_WRITE_WRONG_SYMBOLSPRIMARY_PROBLEM_CLASS:  NULL_CLASS_PTR_DEREFERENCEDEFAULT_BUCKET_ID:  NULL_CLASS_PTR_DEREFERENCELAST_CONTROL_TRANSFER:  from 013e120c to 013e100bSTACK_TEXT:
0038f9cc 013e120c 00000001 00032888 00033a40 TEST11!wmain+0xb [d:\huawei\projects\test11\test11\test11.cpp @ 22]
0038fa10 746b336a 7efde000 0038fa5c 77139902 TEST11!__tmainCRTStartup+0x122 [f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c @ 552]
WARNING: Stack unwind information not available. Following frames may be wrong.
0038fa1c 77139902 7efde000 775e96bf 00000000 kernel32!BaseThreadInitThunk+0x12
0038fa5c 771398d5 013e132d 7efde000 00000000 ntdll!RtlInitializeExceptionChain+0x63
0038fa74 00000000 013e132d 7efde000 00000000 ntdll!RtlInitializeExceptionChain+0x36STACK_COMMAND:  ~0s; .ecxr ; kbFAULTING_SOURCE_CODE:  18: int _tmain(int argc, _TCHAR* argv[])19: {20:  ::SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)CrashInfocallback);21:  int *pi = NULL;
>   22:  ErrorFun(pi);  23:  return 0;24: }25: 26: long  __stdcall CrashInfocallback( _EXCEPTION_POINTERS *pexcp)27: {SYMBOL_STACK_INDEX:  0SYMBOL_NAME:  test11!wmain+bFOLLOWUP_NAME:  MachineOwnerIMAGE_NAME:  TEST11.exeBUCKET_ID:  WRONG_SYMBOLSFAILURE_BUCKET_ID:  NULL_CLASS_PTR_DEREFERENCE_c0000005_TEST11.exe!wmainWATSON_STAGEONE_URL:  http://watson.microsoft.com/StageOne/TEST11_exe/0_0_0_0/5a58a3c4/TEST11_exe/0_0_0_0/5a58a3c4/c0000005/0000100b.htm?Retriage=1Followup: MachineOwner

大家可以发现,WinDbg确实定位到了源码位置,但是仅仅是函数外面,没有进去。
后来上网查了很多资料,最后隐约感觉到可能是Release代码优化的原因,所以当我关闭代码优化的时候,成功地定位到了真正的位置。信息如下:

WRITE_ADDRESS:  00000008 FOLLOWUP_IP:
TEST11!ErrorFun+6 [d:\huawei\projects\test11\test11\test11.cpp @ 15]
00df1006 c740080a000000  mov     dword ptr [eax+8],0AhMOD_LIST: <ANALYSIS/>FAULTING_THREAD:  000013acBUGCHECK_STR:  APPLICATION_FAULT_NULL_CLASS_PTR_DEREFERENCE_INVALID_POINTER_WRITE_WRONG_SYMBOLSPRIMARY_PROBLEM_CLASS:  NULL_CLASS_PTR_DEREFERENCEDEFAULT_BUCKET_ID:  NULL_CLASS_PTR_DEREFERENCELAST_CONTROL_TRANSFER:  from 00df102f to 00df1006STACK_TEXT:
0028fbfc 00df102f 00000000 00000000 0028fc50 TEST11!ErrorFun+0x6 [d:\huawei\projects\test11\test11\test11.cpp @ 15]
0028fc0c 00df1232 00000001 003b2888 003b3a40 TEST11!wmain+0x1f [d:\huawei\projects\test11\test11\test11.cpp @ 22]
0028fc50 746b336a 7efde000 0028fc9c 77139902 TEST11!__tmainCRTStartup+0x122 [f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c @ 552]
WARNING: Stack unwind information not available. Following frames may be wrong.
0028fc5c 77139902 7efde000 77413872 00000000 kernel32!BaseThreadInitThunk+0x12
0028fc9c 771398d5 00df1353 7efde000 00000000 ntdll!RtlInitializeExceptionChain+0x63
0028fcb4 00000000 00df1353 7efde000 00000000 ntdll!RtlInitializeExceptionChain+0x36STACK_COMMAND:  ~0s; .ecxr ; kbFAULTING_SOURCE_CODE:  11: static long  __stdcall CrashInfocallback(_EXCEPTION_POINTERS *pexcp);12: 13: void ErrorFun(int *p)14: {
>   15:  p[2] = 10;  //?a¨¤?¡À¨¤¨¤¡ê16: }17: 18: int _tmain(int argc, _TCHAR* argv[])19: {20:   ::SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)CrashInfocallback);SYMBOL_STACK_INDEX:  0SYMBOL_NAME:  test11!ErrorFun+6FOLLOWUP_NAME:  MachineOwnerIMAGE_NAME:  TEST11.exeBUCKET_ID:  WRONG_SYMBOLSFAILURE_BUCKET_ID:  NULL_CLASS_PTR_DEREFERENCE_c0000005_TEST11.exe!ErrorFunWATSON_STAGEONE_URL:  http://watson.microsoft.com/StageOne/TEST11_exe/0_0_0_0/5a58a4b0/TEST11_exe/0_0_0_0/5a58a4b0/c0000005/00001006.htm?Retriage=1Followup: MachineOwner

拓展:VS2010关闭代码优化的方法:
项目 -> 工程名 + 属性
弹出如下图所示的框:

对“优化”选择“已禁用”,默认为“使速度最大化”,确定之后,重新编译程序即可。

四、总结

  1. 禁用程序优化功能。
  2. exe、pdb和dmp文件保持一致。
    解释:exe文件和pdb文件同时生成,dmp文件是由当前exe生成的。

五、源码

http://download.csdn.net/download/itworld123/10203098

VS2010下使用dmp文件和pdb文件定位程序异常代码行号的注意事项相关推荐

  1. 使用MAP文件快速定位程序崩溃代码行

    作为程序员,平时最担心见到的事情就是程序发生了崩溃,无论是指针越界还是非法操作,都将给我们的应用系统 造成巨大的损失.但在一个大型系统的测试过程中,初期出现程序崩溃似乎成了不可避免的事.其实测试中出现 ...

  2. 使用MAP文件快速定位程序崩溃代码行(转)

    作为程序员,平时最担心见到的事情就是程序发生了崩溃,无论是指针越界还是非法操作,都将给我们的应用系统造成巨大的损失.但在一个大型系统的测试过程中,初期出现程序崩溃似乎成了不可避免的事.其实测试中出现程 ...

  3. VS2010下使用dmp文件和pdb文件定位到dll中崩溃位置的方法

    2018-01-15 创建人:Ruo_Xiao 邮箱:xclsoftware@163.com 一.基础链接 http://blog.csdn.net/itworld123/article/detail ...

  4. vs2010下使用dmp文件和pdb文件调试时dump、exe和pdb三个文件要保持版本一致的原因

    一.pdb文件简介 英文:Program Data Base,即程序的基本数据,是 VS 编译链接时生成的文件. pdb文件主要存储了如下调试信息: (1)public,private 和 stati ...

  5. php找出函数定义位置,WordPress如何快速定位PHP函数所在文件位置及代码行号?

    有时候我们需要修改别人源码里的代码,却找不到对应的函数放在了哪儿,就可以用使用本文介绍的办法,帮你快速定位函数位置.特别是某些写法不规范的WordPress主题,各种模块,函数到处放,找半天的那种.那 ...

  6. C#编程入门第一课 Visual studio 2019使用,cs文件构成,打开项目文件,两句最简单语句,运行前,运行程序,显示行号,设置字体

    C#编程入门第一课 文章目录 C#编程入门第一课 1 2 3 Visual Studio 2019 4. cs文件构成 5. 打开项目文件 6. 两句最简单语句 7. 运行前 8.运行程序 9.显示行 ...

  7. vs2010 利用DMP文件、pdb文件查找release下的异常行号的方法

    2018-01-12 创建人:Ruo_Xiao 开发环境:Windows7,VS2010,WinDbg 6.12. 一.源码 #include "stdafx.h" #includ ...

  8. vs2010调试c语言找不到exe文件夹,VS2010,在bin下面的debug文件中没有exe文件,只有dll文件和pdb文件。...

    你是链接的时候出错的,在菜单栏-项目-属性-配置属性-清单工具-输入输出-嵌入清单里面修改一下就好了. s2012运行c语言出现:无法查找或打开 PDB 文件. "ConsoleApplic ...

  9. php怎么找代码所在位置,WordPress快速定位PHP函数所在文件位置及代码行号

    搜索热词 下面是编程之家 jb51.cc 通过网络收集整理的代码片段.编程之家小编现在分享给大家,也给大家做个参考. 出现这个问题一般都是在看别人的源码,当然我也是在看别人源码时出现的这个问题.有时候 ...

最新文章

  1. Spring MVC环境中的文件上传功能实现
  2. python3下的paramiko 安装
  3. 前端学习(635):字符串拼接
  4. VSS 请求程序和 SharePoint 2013
  5. asp.net core系列 48 Identity 身份模型自定义
  6. 算法复习第四章动态规划
  7. LaTeX tikz初探——利用emoji画GPS卫星2D分布图(2)
  8. python处理HTML的函数库,【整理】关于Python中的html处理库函数BeautifulSoup使用注意事项...
  9. php修改另一个文件内容,php如何修改文件内容
  10. Windows 技术篇-通过注册表查找vc运行库所在位置实战演示,通过ProductCode查看vc++运行库安装位置
  11. 轮式联合收割机液压系统设计
  12. 空洞骑士 Mac版 支持M1
  13. iOS 微信8.0.11更新,新功能,新变化
  14. 前端JS获取图片文件的真实格式
  15. warning: TCG doesn‘t support requested feature: CPUID.01H:ECX.vmx [bit 5]Could not initialize SDL
  16. lua认识(lua)中的变量
  17. Not in a hypervisor partition (HVP=0) (VERR_NEM_NOT_AVAILABLE). AMD-V is dis
  18. mathtype7.0最新版安装下载及使用教程
  19. 如何快速备考通过系统集成项目管理工程师考试
  20. 小白教小白装苹果双系统( XPS13 9360 WIN7 + MAC 10.13.5)

热门文章

  1. 部分博客中的代码已放到了GitHub上,欢迎大家下载阅读!
  2. 任意编程语言访问PostgreSQL:C++接口
  3. 【Anaconda】conda :未找到命令
  4. Apache Common常用jar包
  5. linux diff diffstat组合使用示例
  6. HDFS HA模式下支持只连接其中Active的NameNode
  7. wsl centos7: Failed to get D-Bus connection: Operation not permitted
  8. 阻止 WSL 自动生成/etc/hosts 文件
  9. golang设置运行CPU数量及sync.Mutex全局互斥锁的使用示例
  10. Scala方法定义及调用