Здравствуйте, PanychY, Вы писали:
PY>В идеале хотелось бы утилитку которой скормили .pdb файл и RVA падения, а она вернула искомую точку.
PY>Если кто знает API которым можно воспользоваться для решения задачи, за пример, ссылочку на пример/документацию буду очень признателен.
для этого есть MS DIA SDK
недавно писал такое:
#pragma once
#include <stdexcept>
#include <string>
#include <atlbase.h>
#include <dia2.h>
#include <cvconst.h>
#pragma comment(lib, "diaguids.lib")
class auto_BSTR
{
BSTR bstr;
public:
auto_BSTR() : bstr(NULL) {}
~auto_BSTR() { SysFreeString(bstr); }
BSTR *operator &() { return &bstr; }
operator BSTR() const { return bstr; }
private:
auto_BSTR(const auto_BSTR&); // noncopyable, don't implement
void operator=(const auto_BSTR&); // noncopyable, don't implement
};
/** \pre CoInitialize was called
*/
class pdb_reader
{
typedef pdb_reader this_t;
public:
pdb_reader(const wchar_t* filePath)
{
HRESULT hr;
hr = data_source.CoCreateInstance(CLSID_DiaSource);
check(hr, "CoCreate IDiaDataSource");
hr = data_source->loadDataFromPdb(filePath);
check(hr, "IDiaDataSource::loadDataFromPdb");
hr = data_source->openSession(&session);
check(hr, "IDiaDataSource::openSession");
}
/// Finds symbol name by its RVA
/** \return true if symbol was found, false otherwise
*/
bool rva2name(DWORD rva, std::wstring& name)
{
name.clear();
CComPtr<IDiaSymbol> symbol;
HRESULT hr = session->findSymbolByRVA(rva, SymTagFunction, &symbol);
check(hr, "IDiaSession::findSymbolByRVA");
if (hr == S_FALSE)
return false;
auto_BSTR nameStr;
hr = symbol->get_name(&nameStr);
name = nameStr;
return true;
}
private:
void check(HRESULT hr, const char* what)
{
if (SUCCEEDED(hr))
return;
char buf[1024];
wsprintfA(buf, "%s failed, hr=0x%08x", what, hr);
throw std::runtime_error(buf);
}
private:
pdb_reader(const this_t&); // noncopyable, don't implement
void operator=(const this_t&); // noncopyable, don't implement
CComPtr<IDiaDataSource> data_source;
CComPtr<IDiaSession> session;
};
в MSDN есть какой-то пример, но вообще примеров полно —
http://www.koders.com/default.aspx?s=IDiaSession