我希望我的应用程序创建一个小型转储,以帮助调试无法处理的异常.
我可能不知道在创建转储之前我想要什么类型的迷你转储,那么我应该使用哪种MINIDUMP_TYPE标志组合来为我提供最完整的转储?
我如何得到EXCEPTION_POINTERS,即:
PEXCEPTION_RECORD 和 PCONTEXTEExternal异常期间的数据?
当Windows抛出异常时,它会传递一个PEXCEPTION_POINTERS; 指向异常信息的指针:
typedef struct _EXCEPTION_POINTERS {
PEXCEPTION_RECORD ExceptionRecord;
PCONTEXT ContextRecord;
} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
Run Code Online (Sandbox Code Playgroud)
当Delphi抛出EExternal异常时,它只包含一半的信息,PEXCEPTION_RECORD唯一的:
EExternal = class(Exception)
public
ExceptionRecord: PExceptionRecord;
end;
Run Code Online (Sandbox Code Playgroud)
在EExternal例外情况下,如何同时获得两者?
我正在尝试使用MiniDumpWriteDumpDelphi中的函数编写Minidump .
该函数有一些可选参数:
function MiniDumpWriteDump(
hProcess: THandle; //A handle to the process for which the information is to be generated.
ProcessID: DWORD; //The identifier of the process for which the information is to be generated.
hFile: …Run Code Online (Sandbox Code Playgroud) 当在安装时在.NET托管应用程序上执行ngen,并从应用程序的Windows错误报告中检索崩溃转储时,如何使用它来查看堆栈跟踪,变量等?
以下是与该问题相关的一些背景知识:我们有一个.NET应用程序,可以在安装时使用.当由于未处理的.NET异常而崩溃时,崩溃将在Windows错误报告中进行存储,从中我可以从winqual.microsoft.com下载minidump.mdmp文件.
我将minidump.mdmp放在一个包含.dbg文件的文件夹中,用于构建崩溃的应用程序,然后双击minidump.mdmp在VS2008 SP1的新实例中打开它.我的堆栈跟踪如下所示:
kernel32.dll!RaiseException()+ 0x3d bytes
mscorwks.dll!RaiseTheExceptionInternalOnly()+ 0x295 bytes
mscorwks.dll!JIT_Throw()+ 0x130 bytes
MyApp.ni.exe!000007feee74c84c()
[下面的框架可能不正确和/或缺失,没有为MyApp.ni.exe加载的符号]
0000000070000d5e()
MyApp.ni.exe!000007feee611000()
000000000300bf78()
000000000300bf60()
模块窗口指示为OS和.NET DLL加载符号,但对于应用程序模块,我得到:
MyApp.exe - >符号文件中没有本机符号.
MyApp.ni.exe - >找不到匹配的二进制文件.
MyAppsLibrary.ni.dll - >找不到匹配的二进制文件.
我有一大堆minidump,它们是在应用程序运行期间通过MiniDumpWriteDump记录的.minidump是在具有与我的开发机器不同的操作系统版本的机器上创建的.
现在我正在尝试编写一个程序,使用dbghelp.dll从minidump中提取堆栈跟踪.我正在走MINIDUMP_MODULE_LIST并调用SymLoadModule64,但是无法从公共符号服务器下载pdbs(kernel32等).如果我在符号路径中添加"C:\ Windows\System32",它会找到dll并下载符号,但当然它们与minidump中的dll不匹配,因此结果没用.
那么如何告诉dbghelp.dll下载并使用正确的pdbs?
[编辑]
我忘了声明SymLoadModule64只接受文件名而没有版本/校验和信息,所以很明显只有SymLoadModule64,dbghelp无法找出要下载的pdb.
这些信息实际上在MINIDUMP_MODULE_LIST中可用,但我不知道如何将其传递回dbghelp API.
有一个SymLoadModuleEx,它需要额外的参数,但我不知道这是我需要的,或者我应该传递给其他参数.
[编辑]
到目前为止没有运气,但我注意到在调试SDK中还有dbgng.dll与dbghelp.dll一起分发.MSDN看起来很好,并说它与windbg使用的引擎相同.也许我可以使用它来提取堆栈跟踪.
如果有人能指出我使用dbgeng.dll处理可能有用的minidumps的一些介绍,因为MSDN只记录单个组件,但不记录它们如何一起工作.
目前我们MiniDumpWriteDump用MiniDumpNormal | MiniDumpWithIndirectlyReferencedMemory旗帜打电话.这适用于Debug配置中的内部构建,但是没有提供我们在Release配置中所需的尽可能多的信息.
在Release中,minidump数据包含足够的堆栈信息,以便调试器计算出代码中发生故障的位置,但没有其他数据.我不仅仅意味着由于优化而缺少局部变量,正如您在Release版本中所期望的那样 - 我的意思是除了调用堆栈和当前代码行之外没有任何其他用处.没有寄存器,没有本地,没有全局,没有当地人指向的对象 - 什么都没有.我们甚至没有得到'this',这将允许我们查看当前对象.这是使用点MiniDumpWithIndirectlyReferencedMemory- 它应该包含本地和堆栈变量引用的内存,但似乎不是.
我们应该使用什么标志呢?我们不想使用MiniDumpWithFullMemory并开始生成600MB +转储,但如果它意味着获得更多有用的数据,我们很乐意将转储扩展到我们目前获得的90KB之外.也许我们应该使用MiniDumpWithDataSegments(全局)或......?
我有一个客户正在获得100%可重现的崩溃,我无法在我在Visual Studio 2005中编译的程序中复制.我向他们发送了我的程序的调试版本,并保留了所有PDB和DLL文件.他们发给我minidump文件,但当我打开它时,我得到:
"MiniDump.dmp中0x00000000处的未处理异常:0xC0000005:访问冲突读取位置0x00000000."
然后调用堆栈只显示"0x00000000()",反汇编显示内存转储为0x0.我已经设置了符号服务器,加载了我的PDB符号等.但是我看不出有什么方法可以知道哪些DLL实际上导致跳转为null.这是一个包含许多依赖项的大型项目,其中一些是我没有源代码或PDB的二进制文件,因为我使用API作为第三方.
那么这个minidump究竟有用吗?如何查看导致崩溃的DLL?我以前从来没有真正使用minidump进行调试,但我读过的所有教程似乎至少都显示了一个函数名或其他能给你一个调用堆栈线索的东西.我只得到一行指向null.
我也尝试使用"Depends"来查看是否存在一些未解析的DLL依赖项; 但是在我使用各种Windows操作系统的三台测试机器上,我似乎得到了三套不同的OS DLL依赖项(但却无法复制崩溃); 因此,对于诊断问题,这似乎不是一种特别可靠的方法.
有哪些其他方法可用于确定此问题的原因?有没有办法退回一条指令,看看哪个DLL跳转到null?
我正在使用WinDbg调试Windows的内核模式设备驱动程序.是否有可能按需创建一个小型转储?
我的意思是,我的一个断点被击中,系统停止了.我想创建一个minidump(让我们说只有堆栈).这有WinDbg关键字吗?
提前致谢
我一直在尝试安装'调试工具',以便尝试分析转储文件服务器崩溃(Windows Server 2008 R2).
我过去常常这样做,但我找不到如何安装/找到Windows 7的调试工具.
我已经阅读了这篇知识库文章:http://support.microsoft.com/kb/315263.
然后,我尝试从以下文章(http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx)下载"Windows调试工具" .我选择"将Windows调试工具安装为独立组件",下载文件并进行安装.
它安装成功,但我仍然找不到文件.这对我来说似乎是一个愚蠢的问题,但我无法以任何方式找到调试工具!我甚至试图下载上面提到的Windows 7调试工具(http://www.microsoft.com/en-us/download/details.aspx?id=8279),但再次无法找到它们!
任何帮助将非常感激
我将minidump文件加载到Visual Studio 2010中,从我的程序文件夹和Microsoft Symbol Server加载所有符号,然后我选择"仅调试本机",程序运行到崩溃的地方,显示的错误与显示的相同. exe崩溃时远程计算机.
现在出现错误"找不到program.exe",并且在minidump中找不到"program.exe.您需要加载二进制文件才能找到当前堆栈帧的源代码"
当我点击"浏览并找到program.exe"时,我选择它但VS不会打开它?