我正在尝试将PDB文件读入C#应用程序。当我使用已知存在的文件调用loadDataFromPdb
或loadAndValidateDataFromPdb
时,会得到0x806D0005的HRESULT。不幸的是,我不知道那是什么意思。我已经列出了可能的结果(这里)(http://msdn.microsoft.com/en-us/library/2008hf0e(v=VS.80%29.aspx%29),但恐怕我无法确定问题的答案。
有人知道我做错了什么吗?或者至少有一种方法来检查它对应的是什么?
Exception :System.Runtime.InteropServices.COMException ( 0x806D0005 ):来自HRESULT的异常:0x806D0005 at Dia2Lib.DiaSourceClass.loadDataFromPdb(字符串pdbPath)
代码示例:
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));
}
伙计们,提前谢谢。这个问题已经折磨了我一整天。
发布于 2010-05-20 01:59:18
搜索E_PDB_NOT_FOUND const发现了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文档还意味着,如果文件存在,如果它“确定该文件具有无效的格式”,该错误将被返回。我怀疑这是不是实际的问题,但是如果您正在以某种非标准的方式生成pdb文件,那么问题可能是pdb文件本身。
搜索结果,E_PDB_NOT_FOUND找到了一个遇到同一问题的人。他们的问题似乎是由于资源消耗(太多的pdbs被加载或没有被正确释放)。其他对该结果和错误名称的搜索结果似乎支持在加载pdb的其他失败(例如pdb太大)时抛出此错误的可能性。
希望这能帮点忙。:)
https://stackoverflow.com/questions/2870460
复制相似问题