2010-05-20 9 views
2

J'essaie de lire un fichier PDB dans une application C#. Lorsque j'appelle loadDataFromPdb ou loadAndValidateDataFromPdb avec un fichier que je connais existe, j'obtiens un HRESULT de 0x806D0005. Malheureusement, je n'ai aucune idée de ce que cela signifie. J'ai la liste des résultats possibles [ici] (http://msdn.microsoft.com/en-us/library/2008hf0e(v=VS.80).aspx) mais je crains que je ne puisse pas déterminer le problème de manière concluante.)HRESULT de 0x806D0005 de Dia2Lib de Microsoft

Est-ce que quelqu'un sait ce que je fais mal? Ou au moins une méthode pour vérifier ce qui correspond à

Exception: System.Runtime.InteropServices.COMException (0x806D0005): Exception de HRESULT: 0x806D0005 à Dia2Lib.DiaSourceClass.loadDataFromPdb (String pdbPath)

Exemple de code:

public static void LoadSymbolsForModule(uint baseAddress, uint size, uint timeStamp, DM_PDB_SIGNATURE signature) 
{ 
    IDiaDataSource m_source = new DiaSourceClass(); 
    //m_source.loadAndValidateDataFromPdb(signature.path, ref signature.guid, 0, signature.age); 
    m_source.loadDataFromPdb(signature.path); 
    IDiaSession m_session; 
    m_source.openSession(out m_session); 
    m_session.loadAddress = baseAddress; 
    modules.Add(new Module(baseAddress, size, m_session)); 
} 

Merci d'avance, les gars. Ce problème m'a tué toute la journée.

Répondre

3

Recherche de la const E_PDB_NOT_FOUND tournée le code source sur le code de google dia2.h, qui a confirmé que 0x806D0005 est E_PDB_NOT_FOUND.

E_PDB_OK   = (HRESULT )(((((unsigned long )1 << 31) | ((unsigned long )(LONG )0x6d << 16) ) | (unsigned long )1)), 
E_PDB_USAGE   = (E_PDB_OK + 1) , 
E_PDB_OUT_OF_MEMORY = (E_PDB_USAGE + 1) , 
E_PDB_FILE_SYSTEM = (E_PDB_OUT_OF_MEMORY + 1) , 
E_PDB_NOT_FOUND  = (E_PDB_FILE_SYSTEM + 1) , 

Notez que la signature de la fonction que vous utilisez prend LPCOLESTR, qui est une chaîne de caractères Unicode. Assurez-vous marshaling correctement votre chaîne dans votre déclaration d'interface, à savoir:

Int32 loadDataFromPdb ([MarshalAs(UnmanagedType.LPWStr)] string pdbPath); 

Le msdn documentation implique également que si le fichier existe, cette erreur sera retournée si elle « déterminé que le fichier a un format non valide » . Je doute que ce soit le problème réel, mais si vous générez ce fichier pdb d'une manière non standard, le problème pourrait être le fichier pdb lui-même.

En recherchant le hresult et E_PDB_NOT_FOUND trouvé quelqu'un qui a rencontré le same problem. Il semblait que leur problème était dû à la consommation de ressources, c'est-à-dire que trop de pdbs étaient chargés ou n'étaient pas libérés correctement. D'autres résultats de recherche pour ce hresult et ce nom d'erreur semblent prendre en charge la possibilité que cette erreur soit lancée pour d'autres échecs pour charger le pdb, tels que pdbs étant trop grand.

J'espère que cela aide un peu. :)