2010-05-20 61 views
2

我想讀取一個PDB文件到一個C#應用程序。當我用我知道存在的文件調用loadDataFromPdbloadAndValidateDataFromPdb時,我得到一個0x806D0005的HRESULT。不幸的是,我不知道這意味着什麼。我有可能的結果清單[這裏](http://msdn.microsoft.com/en-us/library/2008hf0e(v=VS.80).aspx),但恐怕我不能確定問題。)來自微軟的Dia2Lib 0x806D0005 HRESULT

有沒有人知道我在做什麼錯?或者至少有一種檢查對應的方法到

例外:System.Runtime.InteropServices.COMException(0x806D0005):在Dia2Lib.DiaSourceClass.loadDataFromPdb(字符串PDBPATH)

代碼示例0x806D0005 :

從HRESULT異常
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)); 
} 

在此先感謝,夥計們。這個問題一整天都在殺我。

回答

3

正在搜索E_PDB_NOT_FOUND const,在google代碼dia2.h上找到源代碼,它確認0x806D0005是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) , 

請注意,您使用的功能的簽名需要LPCOLESTR,這是一個unicode字符串。確保您正確編組的串在你的接口聲明,即:

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

msdn documentation也意味着,如果該文件存在,該錯誤會如果「確定文件格式無效」返回。我懷疑這是實際的問題,但如果你以非標準的方式生成該pdb文件,問題可能是pdb文件本身。

搜索hresult和E_PDB_NOT_FOUND發現有人遇到了same problem。似乎他們的問題是由於資源消耗,即太多的pdbs被加載或沒有正確釋放。對於該hresult和該錯誤名稱的其他搜索結果似乎支持其他故障加載pdb時出現此錯誤的可能性,例如pdbs太大。

希望這會有所幫助。 :)

相關問題