我正在尝试解决仅在生产中发生的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
答案 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中最简单的方法是右键单击模块窗口中的模块)。
根据这些问题的答案的任何组合,可以给出建议。如果您提供更多细节,可以帮助您集中精力。