我有非常奇怪的行为从SymGetModuleInfo64代码调用ERROR_INVALID_PARAMETER (87)和Marshal.GetLastWin32Error().I已经阅读了很多关于IMAGEHLP_MODULE64结构频繁更新的问题的文章,我刚刚下载了最新的IMAGEHLP_MODULE64调试工具(x86),从那个位置加载了dbghelp.dll,而且我很确定它会work.Nevertheless
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)
{
}
}我把here...always卡在了错误87上,请有人指点我到正确的方向。
顺便说一句,modBase64是以前由以下内容填充的值:
modBase64 = DbgHelp.SymLoadModule64(_handle, IntPtr.Zero, fileName, null, baseAddress, size);其中_handle是正在调试的进程的进程句柄,fileName是当前加载模块的路径,baseAddress是当前加载模块的地址基,大小当然是当前加载模块的大小。编辑:
对不起,我忘了提到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.Guid 3.在IMAGEHELP_MODULE64结构的定义中添加CharSet=CharSet.Auto。4.对后两个领域进行了评论。5.使用Marshal.SizeOf(instance_of_the_struct)检查了结构的大小,为3264字节(Unicode)和1672字节(Ansi)。
dbghelp.dll是从%windir%\system 32文件夹加载的,我使用的是Windowsserver2008Enterprise,但success.Im仍然没有得到相同的错误- 87。
在第二次尝试中,我取消了最后两个字段的注释,并使用了调试工具For Windows (x86)目录中的x86,因为我几天前下载了最新版本;在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函数中得到的,就像我前面说的那样。
希望有人知道这是怎么回事。
发布于 2011-01-17 15:09:21
尝试将最后一个参数(imgHelpModule)从out更改为ref。对于out参数,CLR不会将任何数据编组到函数中,因此API将不会看到您将其放入SizeOfStruct中的值。
https://stackoverflow.com/questions/4705299
复制相似问题