2011-01-16 7 views
2

Ich habe ziemlich seltsames Verhalten Aufruf von SymGetModuleInfo64 von C# code.Ich bekomme immer ERROR_INVALID_PARAMETER (87) mit Marshal.GetLastWin32Error(). Ich habe bereits viele Beiträge zu Problemen mit häufigen Updates gelesen IMAGEHLP_MODULE64 struct und ich habe gerade die neuesten Debugging-Tools für Windows (x86) geladen, dbghelp.dll von diesem Ort geladen und ich war mir ziemlich sicher, dass es funktionieren würde. Trotzdem bekomme ich den gleichen Fehler.Kann mir jemand zeigen, was ist hier falsch?DbgHelp.dll: Aufruf von SymGetModuleInfo64 von C#

IMAGEHLP_MODULE64 Struktur ist in meinem Code wie folgt definiert:

[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; 
    //************************************************ 
    } 

das Stück Code, das SymGetModuleInfo64 tatsächlich nennt, ist wie folgt:

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) 
    { 
    } 
    } 

Im hier stecken ... immer mit Fehler 87 .Bitte zeigt mir jemand in die richtige Richtung.

Durch die Art und Weise modBase64 wird Wert zuvor bevölkert von:

modBase64 = DbgHelp.SymLoadModule64(_handle, IntPtr.Zero, fileName, null, baseAddress, size); 

wo _HANDLE ist Prozesspunkt von Prozess debuggt werden, Dateiname ist Weg des Stroms geladenen Moduls ist baseaddress Adressbasis der aktuell geladenen Moduls und Größe ist natürlich die Größe des aktuell geladenen Moduls. Ich rufe diesen Code auf, wenn ich LOAD_DLL_DEBUG_EVENT bekomme. Edit:

Sorry, ich vergaß zu erwähnen, dass SymGetModuleInfo64 Unterschrift ist wie folgt:

[DllImport("dbghelp.dll", SetLastError = true)] 
    public static extern bool SymGetModuleInfo64(IntPtr hProcess, long ModuleBase64, out IMAGEHELP_MODULE64 imgHelpModule); 

Zunächst einmal Dank für Ihre Antwort danken.

1.Checked SymType und es zugrunde liegenden Typ ist wirklich Int. 2.Changed GUID-Struktur zu System.Guid 3.Added CharSet = CharSet.Auto in der Definition von IMAGEHELP_MODULE64 struct. 4.Commented letzten zwei Felder. 5.Checked die Größe der Struktur und es ist 3264 Bytes (Unicode) und 1672 Bytes (Ansi) mit Marshal.SizeOf (instance_of_the_struct).

dbghelp.dll aus% windir% \ System 32 Ordner, Im mit Windows Server 2008 Enterprise geladen und nach wie vor noch nicht success.Im die gleichen Fehler - 87.

Im zweiten Versuch unkommentiert ich zwei Felder letztes und verwendete dbghelp.dll aus dem Debugging Tool für Windows (x86) Verzeichnis seit ich die neueste Version vor ein paar Tagen heruntergeladen habe und in SDK \ inc gibt es die Datei dbghelp.h, die besagt, dass die Struktur die letzten beiden Felder (v4) als like verwendet in diesem Codefragment:

// 
// 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; 

didnt ich habe keinen Erfolg beiden Versionen von struct verwendet, und ich habe nicht mehr ide wie. Wie für die Adresse, die ich passiere, bin ich mir ziemlich sicher, dass es in Ordnung ist, da ich es von SymLoadModule64 Funktion, wie ich vorher sagte.

Hoffe jemand wird eine Idee haben, was hier vor sich geht.

Antwort

6

Versuchen Sie, den letzten Parameter (imgHelpModule) von out zu ref zu ändern. Für einen out-Parameter wird die CLR keine Daten in die Funktion marshallen, sodass die API den Wert, den Sie in SizeOfStruct eingeben, nicht sehen kann.