我试图解决仅在生产中发生的c++ exe运行时错误问题。我对C++和windbg不熟悉,但我在这里粘贴分析。如果有人能告诉我这个错误是如何发生的,在什么情况下发生,更重要的是,我应该如何找出导致错误的代码行,我会非常感激。我读了很多论坛,但是如果我在VS 2008中打开dmp文件,我有一个pdb文件在本地,而exe在本地,但我永远无法获得去源代码菜单选项启用。关于如何分析这个.dmp文件以及如何理解它的快速答复将是非常感谢的。谢谢!
GetPageUrlData失败,服务器返回HTTP 404URL请求: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 004194 ptr c6040100 mov字节ptr ecx+eax,0
EXCEPTION_RECORD: ffffffff - (.exr 0 0xffffffffffffffff) ExceptionAddress: 004194 to (Myserver+0x000194ab) ExceptionCode: c0000005 (访问违反) ExceptionFlags: 00000000 NumberParameters: 2参数: 00000001 Parameter1: 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 004194 ptr c6040100 mov字节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 087ffdd74 087ffd8c Myserver+0x18a4e 087ffc6c 0041089b 0a73b0f8 0a727a78 0a73b108 Myserver+0x10767 087ffd74 00433913 0a73b0f8 0a727a78 0a73b108 Myserver+0x1089b 087ffe58 0042fbff3 0a73b0f8 0a727a78 00000044 Myserver+0x33913 087fffb8 7d4ffb8 000000000000000 0000000 Myserver+0x2fbf3 087ffffc 000000000000 Myserver+0x2fbf3 087fff00000000000 kernel32
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
NULL_POINTER_WRITE_c0000005_Myserver.exe!Unknown :FAILURE_BUCKET_ID
APPLICATION_FAULT_NULL_POINTER_WRITE_Myserver+194ab :BUCKET_ID
后续行动: MachineOwner
发布于 2010-06-23 20:58:24
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 0 0xffffffffffffffff) ExceptionAddress: 004194 mov FAULTING_IP: Myserver+194ab 004194 mov c6040100 mov字节ptr ecx+eax,0
如果您只需要崩溃的行,那么就有一个应用程序'CrashFinder‘,它将加载您的应用程序和pdb,并允许您输入这个004194ab来报告崩溃的行。
发布于 2010-06-23 21:50:07
您还可以使用顶部菜单设置符号路径(其中有应用程序PDB)和源路径(有源路径)(我认为它是设置符号路径和设置源路径)。
对于崩溃转储,一旦设置了符号和源路径,并加载了转储文件,您会发现以下命令很有用:!analyze -v
从您粘贴的报告中,检查该行:STACK_COMMAND: ~86s; .ecxr ; kb --这一行告诉您导致错误(86)的线程。在命令窗口中通过该行获得线程的堆栈:~86s; .ecxr ; kb
发布于 2010-06-23 21:50:19
如果你对VS比较满意,不要放弃它。您确实看到了拆卸和堆栈,而只缺少符号?您是否单击作为您的模块的堆栈框架,但仍未看到代码?您甚至可以看到模块中的堆栈框架吗?您建立了使用MS公共符号的权限吗?(不管怎么说,即使使用WinDbg,你也应该这么做)。WinDbg报告堆栈符号吗?(它们不在你粘贴在这里的片段中)。如果不是,这很可能是一个符号问题。在WinDbg和VS上都有诊断这些疾病的方法。您检查了要调试的模块的“符号加载信息”吗?(在VS中最简单的方法是右键单击模块窗口中的模块)。
根据对这些问题的任何综合答案,可以提出建议。如果你提供更多的细节,它可以帮助集中建议。
https://stackoverflow.com/questions/3105086
复制相似问题