windbg - 创建在 64 位操作系统中运行的 32 位进程的小型转储

标签 windbg crash-dumps sos wow64 minidump

我有一个 .net 应用程序,它被设计为在 32 位环境中运行,它在 wow64 环境中在 64 位操作系统中运行。

现在我正在创建一个实用程序(32 位)来为应用程序创建转储。

我使用以下代码创建转储。

[DllImport("dbghelp.dll", EntryPoint = "MiniDumpWriteDump", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = true)]
static extern bool MiniDumpWriteDump(IntPtr hProcess, uint processId, SafeHandle hFile, uint dumpType, ref MiniDumpExceptionInformation expParam, IntPtr userStreamParam, IntPtr callbackParam);

此 API 调用在 32 位操作系统中执行良好,但在 64 位操作系统中失败。

任何人都在 64 位操作系统中为 32 位应用程序创建了转储?请帮助。

最佳答案

确保 MiniDumpExceptionInformation 结构的结构定义上有 Pack=4。

这是我在 32 位和 64 位 C# 应用程序中使用的:

[StructLayout(LayoutKind.Sequential, Pack=4)]
public struct MINIDUMP_EXCEPTION_INFORMATION
{
    public uint ThreadId;
    /// PEXCEPTION_POINTERS->_EXCEPTION_POINTERS*
    public IntPtr ExceptionPointers;
    [MarshalAs(UnmanagedType.Bool)]
    public bool ClientPointers;
}

但是我们总是使用匹配的架构(用于在 32 位进程上创建故障转储的 32 位应用程序等)

关于windbg - 创建在 64 位操作系统中运行的 32 位进程的小型转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13017364/

相关文章:

Linux:glibc 中 LEA 指令中间带有 RIP 的非法指令

iOS 应用因 EXC_BREAKPOINT (SIGTRAP) 而崩溃

.net - 使用 sos.dll 调试 .net 应用程序时,为什么局部变量和参数在堆栈帧上不显示任何数据?

WinDbg:dd <地址> L <长度> 的范围限制

debugging - ntdll.dll映射到新进程时如何闯入WinDBG

c - 如何获取SSDT地址

.net - .loadby sos clr - 找不到指定的模块

debugging - F# 调试。 CLR

c# - 当程序崩溃而不显示错误时如何识别问题?

windbg - 比较两个转储文件以报告增长最快的对象