Re: Разбор креш-дампа
От: Abyx Россия  
Дата: 02.11.11 21:55
Оценка: 15 (2)
Здравствуйте, 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
In Zen We Trust
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.