分析.dmp文件

时间:2010-06-23 20:03:26

标签: c++ windbg

我正在尝试解决仅在生产中发生的c ++ exe运行时错误问题。我是C ++和windbg的新手,但我在这里粘贴了分析。如果有人可以指出这个错误是如何以及在什么条件下发生的,更重要的是我如何找出导致它的代码行,我将不胜感激。我阅读了很多论坛但是如果我在VS 2008中打开dmp文件,我在本地有一个pdb文件和本地的exe,但是我永远无法启用Go To Source代码菜单选项。如何分析此.dmp文件以及如何理解它的快速回复将非常感谢..谢谢!


  • *
  • 例外分析*
  • *

GetPageUrlData失败,服务器返回HTTP状态404 请求的网址:http://watson.microsoft.com/StageOne/MYServer_exe/0_0_0_0/MyServer_exe/0_0_0_0/000194ab.htm?Retriage=1

FAULTING_IP: MYSERVER + 194ab 004194ab c6040100 mov byte ptr [ecx + eax],0

EXCEPTION_RECORD:ffffffff - (.exr 0xffffffffffffffff) 异常地址:004194ab(Myserver + 0x000194ab)    ExceptionCode:c0000005(访问冲突)   ExceptionFlags:00000000 NumberParameters:2    参数[0]:00000001    参数[1]:00000000 尝试写入地址00000000

DEFAULT_BUCKET_ID:NULL_POINTER_WRITE

PROCESS_NAME:Myserver.exe

ERROR_CODE:(NTSTATUS)0xc0000005 - 0x%08lx处的指令引用0x%08lx处的内存。内存不能是%s。

EXCEPTION_CODE:(NTSTATUS)0xc0000005 - 0x%08lx处的指令引用0x%08lx处的内存。内存不能是%s。

EXCEPTION_PARAMETER1:00000001

EXCEPTION_PARAMETER2:00000000

WRITE_ADDRESS:00000000

FOLLOWUP_IP: MYSERVER + 194ab 004194ab c6040100 mov byte ptr [ecx + eax],0

MOD_LIST:

NTGLOBALFLAG:0

APPLICATION_VERIFIER_FLAGS:0

FAULTING_THREAD:000004e0

PRIMARY_PROBLEM_CLASS:NULL_POINTER_WRITE

BUGCHECK_STR:APPLICATION_FAULT_NULL_POINTER_WRITE

LAST_CONTROL_TRANSFER:从00418a4e到004194ab

STACK_TEXT: 警告:堆栈展开信息不可用。以下框架可能是错误的。 087ffa74 00418a4e 0a73b070 087ffc6c 087ffd8c Myserver + 0x194ab 087ffb64 00410767 0a73b070 087ffd74 087ffd8c Myserver + 0x18a4e 087ffc6c 0041089b 0a73b0f8 0a727a78 0a73b108 Myserver + 0x10767 087ffd74 00433913 0a73b0f8 0a727a78 0a73b108 Myserver + 0x1089b 087ffe58 0042fbf3 0a73b0f8 0a727a78 00000044 Myserver + 0x33913 087fffb8 7d4dfe37 000006a0 00000000 00000000 Myserver + 0x2fbf3 087fffec 00000000 0042fae0 000006a0 00000000 kernel32!BaseThreadStart + 0x34

SYMBOL_STACK_INDEX:0

SYMBOL_NAME:Myserver + 194ab

FOLLOWUP_NAME:MachineOwner

MODULE_NAME:Myserver

IMAGE_NAME:Myserver.exe

DEBUG_FLR_IMAGE_TIMESTAMP:4c2123df

STACK_COMMAND:~86s; .ecxr; KB

FAILURE_BUCKET_ID:NULL_POINTER_WRITE_c0000005_Myserver.exe!未知

BUCKET_ID:APPLICATION_FAULT_NULL_POINTER_WRITE_Myserver + 194ab

跟进:MachineOwner

3 个答案:

答案 0 :(得分:1)

k将为您提供线程中停止的当前堆栈跟踪 ~*kb将为您提供所有线程的堆栈跟踪

符号

您可能希望将符号搜索路径设置为包含MS符号,这样可以获得更好的堆栈跟踪。

每次使用.sympath srv*C:\Symbols*http://msdl.microsoft.com/download/symbols或更多永久设置_NT_SYMBOL_PATH环境var(比如作为系统变量)到srv*C:\Symbols*http://msdl.microsoft.com/download/symbols

时,您都可以执行此操作

您可能需要使用以下内容重新加载符号。

.symfix+ c:\symbols
.reload /f

崩溃线

  

EXCEPTION_RECORD:ffffffff - (.exr 0xffffffffffffffff)异常地址:004194ab   FAULTING_IP:Myserver + 194ab 004194ab c6040100 mov byte ptr [ecx + eax],0

如果你想要的只是崩溃线,那么有一个应用程序'CrashFinder'将加载你的应用程序和pdb,并允许你输入这个004194ab来报告崩溃的行。

答案 1 :(得分:0)

您还可以使用顶部菜单设置符号路径,您拥有应用程序PDB的位置以及源路径(我认为它设置了符号路径和设置源路径)。

对于崩溃转储,一旦设置了符号和源路径并加载了转储文件,您将发现命令有用:!analyze -v

从您粘贴的报告中,检查以下行:STACK_COMMAND: ~86s; .ecxr ; kb此行告诉您导致错误的线程(86)。刚刚通过该行进入命令窗口以获取该线程的堆栈:~86s; .ecxr ; kb

答案 2 :(得分:0)

如果你对VS更加满意,不要放弃它。你看到反汇编和堆栈,只缺少符号?您是否单击您的模块的堆栈框架仍然看不到代码?你甚至可以看到模块中的堆栈框架吗?您是否已建立对MS公共符号的访问权限? (无论如何,你可能应该使用WinDbg)。 WinDbg报告堆栈符号吗? (它们未列在您粘贴在此处的代码段中)。如果不是,它很可能成为一个符号问题。有几种方法可以在WinDbg和VS上诊断它们。您是否检查了要调试的模块的“符号加载信息”? (VS中最简单的方法是右键单击模块窗口中的模块)。

根据这些问题的答案的任何组合,可以给出建议。如果您提供更多细节,可以帮助您集中精力。