- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我从 C# 代码调用 SymGetModuleInfo64 的行为非常奇怪。我总是使用 Marshal.GetLastWin32Error() 得到 ERROR_INVALID_PARAMETER (87)。我已经阅读了很多关于 IMAGEHLP_MODULE64 结构频繁更新问题的文章,我刚刚下载了最新的调试Tools For Windows (x86) ,从该位置加载了 dbghelp.dll,我非常确定它会起作用。尽管如此,我还是遇到了同样的错误。有人能指出我这里出了什么问题吗?
IMAGEHLP_MODULE64 结构在我的代码中定义如下:
[StructLayout(LayoutKind.Sequential)]
public struct IMAGEHELP_MODULE64
{
//************************************************
public int SizeOfStruct;
public long BaseOfImage;
public int ImageSize;
public int TimeDateStamp;
public int CheckSum;
public int NumSyms;
public SymType SymType;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string ModuleName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string ImageName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string LoadedImageName;
//************************************************
//new elements v2
//*************************************************
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string LoadedPdbName;
public int CVSig;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 780)]
public string CVData;
public int PdbSig;
public GUID PdbSig70;
public int PdbAge;
public bool PdbUnmatched;
public bool DbgUnmatched;
public bool LineNumbers;
public bool GlobalSymbols;
public bool TypeInfo;
//************************************************
//new elements v3
//************************************************
public bool SourceIndexed;
public bool Publics;
//************************************************
//new elements v4
//************************************************
public int MachineType;
public int Reserved;
//************************************************
}
实际调用SymGetModuleInfo64的代码如下:
public void GetSymbolInfo(IntPtr hProcess,long modBase64,out bool success)
{
success = false;
DbgHelp.IMAGEHELP_MODULE64 moduleInfo = new DbgHelp.IMAGEHELP_MODULE64();
moduleInfo.SizeOfStruct = Marshal.SizeOf(moduleInfo);
try
{
success = DbgHelp.SymGetModuleInfo64(hProcess, modBase64, out moduleInfo);
if (success)
{
//Do the stuff here
}
}
catch (Exception exc)
{
}
}
我被困在这里...总是出现错误 87。请有人指出我正确的方向。
顺便说一下,modBase64 是之前填充的值:
modBase64 = DbgHelp.SymLoadModule64(_handle, IntPtr.Zero, fileName, null, baseAddress, size);
其中 _handle 是正在调试的进程的进程句柄,fileName 是当前加载模块的路径,baseAddress 是当前加载模块的地址基址,size 当然是当前加载模块的大小。当我得到 LOAD_DLL_DEBUG_EVENT 时,我调用此代码。编辑:
抱歉,我忘了提及 SymGetModuleInfo64 签名是这样的:
[DllImport("dbghelp.dll", SetLastError = true)]
public static extern bool SymGetModuleInfo64(IntPtr hProcess, long ModuleBase64, out IMAGEHELP_MODULE64 imgHelpModule);
首先感谢您的回答。
1.检查SymType,它的底层类型确实是int。2.将GUID结构更改为System.Guid3.在IMAGEHELP_MODULE64结构体的定义中添加CharSet=CharSet.Auto。4.评论最后两个字段。5.使用Marshal.SizeOf(instance_of_the_struct)检查结构体的大小,为3264字节(Unicode)和1672字节(Ansi)。
dbghelp.dll 是从 %windir%\system 32 文件夹加载的,我使用的是 Windows Server 2008 enterprise,但仍然没有成功。我仍然收到相同的错误 - 87。
在第二次尝试中,我取消了最后两个字段的注释,并使用了 Windows 调试工具 (x86) 目录中的 dbghelp.dll,因为我几天前下载了最新版本,并且在 SDK\inc 中有 dbghelp.h 文件,其中表示结构使用最后两个字段 (v4),如以下代码片段所示:
//
// module data structure
//
typedef struct _IMAGEHLP_MODULE64 {
DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_MODULE64)
DWORD64 BaseOfImage; // base load address of module
DWORD ImageSize; // virtual size of the loaded module
DWORD TimeDateStamp; // date/time stamp from pe header
DWORD CheckSum; // checksum from the pe header
DWORD NumSyms; // number of symbols in the symbol table
SYM_TYPE SymType; // type of symbols loaded
CHAR ModuleName[32]; // module name
CHAR ImageName[256]; // image name
CHAR LoadedImageName[256]; // symbol file name
// new elements: 07-Jun-2002
CHAR LoadedPdbName[256]; // pdb file name
DWORD CVSig; // Signature of the CV record in the debug directories
CHAR CVData[MAX_PATH * 3]; // Contents of the CV record
DWORD PdbSig; // Signature of PDB
GUID PdbSig70; // Signature of PDB (VC 7 and up)
DWORD PdbAge; // DBI age of pdb
BOOL PdbUnmatched; // loaded an unmatched pdb
BOOL DbgUnmatched; // loaded an unmatched dbg
BOOL LineNumbers; // we have line number information
BOOL GlobalSymbols; // we have internal symbol information
BOOL TypeInfo; // we have type information
// new elements: 17-Dec-2003
BOOL SourceIndexed; // pdb supports source server
BOOL Publics; // contains public symbols
// new element: 15-Jul-2009
DWORD MachineType; // IMAGE_FILE_MACHINE_XXX from ntimage.h and winnt.h
DWORD Reserved; // Padding - don't remove.
} IMAGEHLP_MODULE64, *PIMAGEHLP_MODULE64;
我没有成功使用这两个版本的结构,并且我没有更多的想法。至于我传递的地址,我很确定它没问题,因为我从 SymLoadModule64 函数获取它,正如我之前所说。
希望有人知道这里发生了什么。
最佳答案
尝试将最后一个参数 (imgHelpModule) 从 out 更改为 ref。对于 out 参数,CLR 不会将任何数据编码到函数中,因此 API 将看不到您放入 SizeOfStruct 中的值。
关于c# - DbgHelp.dll : calling SymGetModuleInfo64 from C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4705299/
我最近实现了一个实用程序来使用 MiniDumpWriteDump 编写用户模式转储( Debug Help Library 的一部分)。实现被分成它自己的进程。目标进程可以启动此实用程序并与其通信以
我正在构建一个 Symbols 服务,我希望能够打印结构变量及其偏移量。我正在加载所需的 pdb,并试图找到适合给定掩码的结构。例如,我想获取有关结构 _RTL_CRITICAL_SECTION 的详
我的应用程序依赖于 DBGHELP.DLL 函数,尤其是有关目标进程加载的 DLL 的信息。然而,很多时候它在低于 Vista 的 Windows 版本上失败(你知道 XP 仍然存在!)。环顾四周,发
如何通过 DbgHelp 获取局部变量的值?我尝试使用以下代码 #include #include #include #include #include #include #pragma
如果您包括 #include 例如,在控制台 C++ 应用程序中,它不会从头文件中获取任何定义,并且或多或少会出现类似的编译器错误,就好像根本不包含此头文件一样。 编译器错误如下: 1>------
我想打印函数名(导入的、导出的、普通/本地函数)而不是变量名等等。 SymEnumSymbolsEx枚举所有符号,但我只想要函数。里面也找不到怎么区分函数和变量callback功能。 有没有办法只枚举
我正在使用 SymEnumSymbols获取给定掩码的所有匹配符号,并使用 CALLBACK 函数将它们推送到 vector 中。问题是,符号名称(在 PSYMBOL_INFO 结构中)只是函数的名称
我从 C# 代码调用 SymGetModuleInfo64 的行为非常奇怪。我总是使用 Marshal.GetLastWin32Error() 得到 ERROR_INVALID_PARAMETER (
我的应用程序使用 VC6 sp6 编译,使用 DBGHelp.lib 获取堆栈信息。代码在调试和发布编译中是相似的。问题在于,在执行调试版本时,DBGHelp.dll 会加载 msvcrt.dll(发
简洁明了: DIA(调试接口(interface)访问)和 DBGHELP 库之间的实际区别是什么?我知道 DIA 是基于 COM 的并且似乎非常强大(并且能够与托管和非托管进程一起使用),而 DBG
一年多以前,我已经使用 WinDbg 和 DebugDiag 来查找我们在 Java 中使用的 JNI native DLL 中的内存泄漏。现在我正在寻找线程句柄泄漏。我使用 Process Expl
我正在努力通过 Minidump (DbgHelp.h) 获取句柄信息。 我正在从映射文件流中获取 MINIDUMP_HANDLE_DESCRIPTOR_2 列表。然后,我通过使用 ObjectInf
如何在不使用 dbghelp.dll 的情况下在 Windows 上获取地址堆栈跟踪? 我不需要知道与地址关联的符号或函数名是什么,我只需要地址列表 -- 类似于 backtrace of *nix
我使用 Jochen Kalmbach's StackWalker class from CodeProject , 在我的 DLL 中发生异常时生成堆栈跟踪。 依赖于DbgHelp.dll DbgH
所有,我尝试在我的 MFC 项目中使用 Visual Leak Detector,当我尝试调试程序时,我得到了这个错误,这是什么? 干杯 岱岳 最佳答案 这是一个 DLL Hell 问题。此函数仅存在
我正在尝试使用 StackWalk64 在 x64 进程上遍历包含托管帧和 native 帧的调用堆栈。在第一个或第二个托管框架之前一切正常,之后 StackWalk64 无法找出框架的返回地址并失败
当我从 "Playing for Data" 论文构建 renderdoc 项目时,出现以下错误(作者对 VS13 没有问题,所以我想知道它是否可能是 VS15 问题): 1>------ Build
我是一名优秀的程序员,十分优秀!