首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DbgHelp.dll :从C#调用SymGetModuleInfo64

DbgHelp.dll :从C#调用SymGetModuleInfo64
EN

Stack Overflow用户
提问于 2011-01-16 12:22:42
回答 1查看 1.8K关注 0票数 2

我有非常奇怪的行为从SymGetModuleInfo64代码调用ERROR_INVALID_PARAMETER (87)和Marshal.GetLastWin32Error().I已经阅读了很多关于IMAGEHLP_MODULE64结构频繁更新的问题的文章,我刚刚下载了最新的IMAGEHLP_MODULE64调试工具(x86),从那个位置加载了dbghelp.dll,而且我很确定它会work.Nevertheless

IMAGEHLP_MODULE64结构在我的代码中定义如下:

代码语言:javascript
复制
[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的代码如下所示:

代码语言:javascript
复制
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是以前由以下内容填充的值:

代码语言:javascript
复制
modBase64 = DbgHelp.SymLoadModule64(_handle, IntPtr.Zero, fileName, null, baseAddress, size);

其中_handle是正在调试的进程的进程句柄,fileName是当前加载模块的路径,baseAddress是当前加载模块的地址基,大小当然是当前加载模块的大小。编辑:

对不起,我忘了提到SymGetModuleInfo64签名是这样的:

代码语言:javascript
复制
[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),如下代码片段所示:

代码语言:javascript
复制
//
// 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函数中得到的,就像我前面说的那样。

希望有人知道这是怎么回事。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-17 15:09:21

尝试将最后一个参数(imgHelpModule)从out更改为ref。对于out参数,CLR不会将任何数据编组到函数中,因此API将不会看到您将其放入SizeOfStruct中的值。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4705299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档