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
Re[4]: Разбор креш-дампа
От: serg_joker Украина  
Дата: 07.11.11 21:01
Оценка: 12 (1)
Вы, извините, какого рода ПО разрабытываете? Какого рода клиенты? Наши клиенты, например, могут ни за что не дадть ни одного файла, который у них на машине сгенерируется, ибо, имея на руках крешдамп (особенно с памятью), я могу узнать то, что мне знать не полагается. Пароли там разновсячиские, к примеру.
А переписать адресок с экрана во время вебекс сеанса — вполне можно. И точная строка кода вполне себе может быть хорошим подспорьем в решении проблемы.

Делая такие категоричные заявление, стоило бы подумать, что программирование и поддержка продуктов — они разные очень бывают.

Удачи!

А>Если бы вы умели, вопрос бы не встал о том, чтобы использовать какую-то MS-забытую символьную имформацию через /mapinfo:lines.


А>И чем обзывать MS, прежде взглянули бы в зеркало. Что мешает сгенерить крешдамп при падении? Что мешает передать его в вашу техподдержку? Что мешает вашим тестерам скормить его WinDbg и увидеть место падения?

А>И получите в итоге не "Приблизительно значит имя файла исходника и номер строки", а вполне себе полное представление (вместе со стеком и регистрами) о месте падения.
Re[2]: Разбор креш-дампа
От: serg_joker Украина  
Дата: 05.11.11 16:50
Оценка: 1 (1)
Чукча писатель ?
Здравствуйте, Аноним, Вы писали:
А>крешдамп скормить WinDbg?
Re[3]: Разбор креш-дампа
От: Abyx Россия  
Дата: 04.11.11 23:29
Оценка: -1
Здравствуйте, PanychY, Вы писали:

PY>Здравствуйте, Abyx, Вы писали:


A>>для этого есть MS DIA SDK

A>>недавно писал такое:

PY>Спасибо попробуем.

PY>Я так понимаю, такой можно юзать только и только на машине где это самое DIA стоит, т.е. нужна установленная студия. Хотелось что-нибудь по компактнее. Ведь как-то тот же NTSD вылавливает всё что нужно.

достаточно msdia<версия MSVS>.dll
In Zen We Trust
Re[3]: Разбор креш-дампа
От: Аноним  
Дата: 07.11.11 16:29
Оценка: +1
Здравствуйте, serg_joker, Вы писали:

_>Чукча писатель ?

_>Здравствуйте, Аноним, Вы писали:
А>>крешдамп скормить WinDbg?

Минидампы делать не предлагать, умеем, пользуемся.

Если бы вы умели, вопрос бы не встал о том, чтобы использовать какую-то MS-забытую символьную имформацию через /mapinfo:lines.

И чем обзывать MS, прежде взглянули бы в зеркало. Что мешает сгенерить крешдамп при падении? Что мешает передать его в вашу техподдержку? Что мешает вашим тестерам скормить его WinDbg и увидеть место падения?
И получите в итоге не "Приблизительно значит имя файла исходника и номер строки", а вполне себе полное представление (вместе со стеком и регистрами) о месте падения.
Разбор креш-дампа
От: PanychY  
Дата: 02.11.11 21:41
Оценка:
Здравствуйте.

Есть такая задача(WIN32).
Есть софтина, написанная на С/С++, откомпилирована в MSVC. Софтина падает. Пере падением успевает логировать точку падения.
Задача: по точке найти где приблизительно упало. Приблизительно значит имя файла исходника и номер строки.
В чем прикол? Прикол в том, что студия 2002/2003 умела опцию /MAPINFO:LINES, и потому поиск места падения было делом 30 секунд. Из остальных идиоты из МС вырезали без указания причин и с обещанием не возвращать. Встал вопрос на миграцию на новые компиляторы, и хочется что-бы возможность найти место осталась(не найдем — останемся на 2002).
Минидампы делать не предлагать, умеем, пользуемся.
В идеале хотелось бы утилитку которой скормили .pdb файл и RVA падения, а она вернула искомую точку.
Если кто знает API которым можно воспользоваться для решения задачи, за пример, ссылочку на пример/документацию буду очень признателен.
pdb debug
Re: Разбор креш-дампа
От: serg_joker Украина  
Дата: 04.11.11 22:47
Оценка:
Здравствуйте, PanychY, Вы писали:
Попробуй такой финт:
1. включи генерацию asm-листинга при компиляции
2. Натрави на итоговый бинарь dumpbin /disasm
3. По дампу найдёшь вальнувшую инструкцию, по инструкции в листинге — строку кода

Вроде, так.

А вот то, что уродцы эти убрали генерацию map подробного — это печаль.
PY>Здравствуйте.

PY>Есть такая задача(WIN32).

PY>Есть софтина, написанная на С/С++, откомпилирована в MSVC. Софтина падает. Пере падением успевает логировать точку падения.
PY>Задача: по точке найти где приблизительно упало. Приблизительно значит имя файла исходника и номер строки.
PY>В чем прикол? Прикол в том, что студия 2002/2003 умела опцию /MAPINFO:LINES, и потому поиск места падения было делом 30 секунд. Из остальных идиоты из МС вырезали без указания причин и с обещанием не возвращать. Встал вопрос на миграцию на новые компиляторы, и хочется что-бы возможность найти место осталась(не найдем — останемся на 2002).
PY>Минидампы делать не предлагать, умеем, пользуемся.
PY>В идеале хотелось бы утилитку которой скормили .pdb файл и RVA падения, а она вернула искомую точку.
PY>Если кто знает API которым можно воспользоваться для решения задачи, за пример, ссылочку на пример/документацию буду очень признателен.
Re[2]: Разбор креш-дампа
От: PanychY  
Дата: 04.11.11 23:00
Оценка:
Здравствуйте, Abyx, Вы писали:

A>для этого есть MS DIA SDK

A>недавно писал такое:

Спасибо попробуем.
Я так понимаю, такой можно юзать только и только на машине где это самое DIA стоит, т.е. нужна установленная студия. Хотелось что-нибудь по компактнее. Ведь как-то тот же NTSD вылавливает всё что нужно.
Re: Разбор креш-дампа
От: Аноним  
Дата: 05.11.11 13:27
Оценка:
Здравствуйте, PanychY, Вы писали:

PY>В идеале хотелось бы утилитку которой скормили .pdb файл и RVA падения, а она вернула искомую точку.

PY>Если кто знает API которым можно воспользоваться для решения задачи, за пример, ссылочку на пример/документацию буду очень признателен.
крешдамп скормить WinDbg?
Re[3]: Разбор креш-дампа
От: Stanislav V. Zudin Россия  
Дата: 05.11.11 18:28
Оценка:
Здравствуйте, serg_joker, Вы писали:

_>Чукча писатель ?

_>Здравствуйте, Аноним, Вы писали:
А>>крешдамп скормить WinDbg?

А почему бы не воспользоваться штатным Dr.Watson'ом на клиентской машине?
_____________________
С уважением,
Stanislav V. Zudin
Re[4]: Разбор креш-дампа
От: PanychY  
Дата: 06.11.11 23:33
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>А почему бы не воспользоваться штатным Dr.Watson'ом на клиентской машине?

Для чего? Точку падения имеем без него(SetUnhandledExceptionFilter нам помог). Что он ещё полезного даст, если на клиентскую машину никто не будет давать .pdb файлы? Нет, я согласен, если вдруг случилась порча памяти(вирусня нагадила, или умник дебажить полез) то можно буде сравнить "наши ли инструкции упали или чужие", но это уже другой разговор.
Re[4]: Разбор креш-дампа
От: PanychY  
Дата: 06.11.11 23:37
Оценка:
Здравствуйте, Abyx, Вы писали:

A>достаточно msdia<версия MSVS>.dll

А как у него лицензия распространения?
Re[5]: Разбор креш-дампа
От: Abyx Россия  
Дата: 06.11.11 23:56
Оценка:
Здравствуйте, PanychY, Вы писали:

PY>Здравствуйте, Abyx, Вы писали:


A>>достаточно msdia<версия MSVS>.dll

PY>А как у него лицензия распространения?

посмотрите в msdn.
In Zen We Trust
Re: Разбор креш-дампа
От: Аноним  
Дата: 08.11.11 10:41
Оценка:
Можно попробовать заюзать питоновскую либу pykd.
Она может работать как расширение windbg или как отдельный модуль.

В данном случае можно использовать второй режим.

Проект в стадии разработки, так что некоторых полезных вещей может и не быть. Но если идея понравится — пишите, добавим фичи, на все вопросы ответим )).

Сайт проекта:
pykd.codeplex.com
Re[5]: Разбор креш-дампа
От: Аноним  
Дата: 08.11.11 17:17
Оценка:
Здравствуйте, serg_joker, Вы писали:

_>Наши клиенты, например, могут ни за что не дадть ни одного файла, который у них на машине сгенерируется, ибо, имея на руках крешдамп (особенно с памятью), я могу узнать то, что мне знать не полагается.

Ну тогда извиняюсь и беру слова обратно, не все ж тилипаты

Тогда только MS DIA SDK.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.