Бестолковый .dmp
От: Kingofastellarwar Украина  
Дата: 10.11.09 13:05
Оценка: :)
Генерирую в релизе у юзеров в случае ошибки минидам через MiniDumpWriteDump и отправляю его себе для анализа

Но от полученых дампов толку мало, как минимум потому что стек не показывается по человечески.

Какие условия нужны чтобы таки его нормально посмтореть кроме того что нужно хранить у себя pdb`шники?
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Re: Бестолковый .dmp
От: alexei_s  
Дата: 10.11.09 19:01
Оценка:
Исходники, соответствующие тем pdb.
Удобно настроить для этих целей поддержку символьного сервера (на базе svn например)
Re[2]: Бестолковый .dmp
От: Kingofastellarwar Украина  
Дата: 10.11.09 19:53
Оценка:
Здравствуйте, alexei_s, Вы писали:

_>Исходники, соответствующие тем pdb.

_>Удобно настроить для этих целей поддержку символьного сервера (на базе svn например)


Дык есть же ж, и по тому же пути, я заметил что тот хлам который в IntDir складывается как-то помогает правильно разруливать дмп.

А как символьный сервер делается? я просто с каждым релизом пдб сохранияю в свн и всё.
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Re: Бестолковый .dmp
От: zaufi Земля  
Дата: 10.11.09 20:02
Оценка: -5
Здравствуйте, Kingofastellarwar, Вы писали:

K>Генерирую в релизе у юзеров в случае ошибки минидам через MiniDumpWriteDump и отправляю его себе для анализа

минидамы эта пять! -- может в проге еще и миниблэкджек гдета есть?
Re[3]: Бестолковый .dmp
От: alexei_s  
Дата: 11.11.09 04:00
Оценка:
K>А как символьный сервер делается? я просто с каждым релизом пдб сохранияю в свн и всё.

http://support.microsoft.com/kb/311503
Re: Бестолковый .dmp
От: x905  
Дата: 11.11.09 05:39
Оценка:
Здравствуйте, Kingofastellarwar, Вы писали:

K>Генерирую в релизе у юзеров в случае ошибки минидам через MiniDumpWriteDump и отправляю его себе для анализа


а почему бы не вести лог работы в файл — сразу ясно где упало
Re: Бестолковый .dmp
От: Feonyf  
Дата: 11.11.09 20:40
Оценка:
Здравствуйте, Kingofastellarwar, Вы писали:

K>Какие условия нужны чтобы таки его нормально посмтореть кроме того что нужно хранить у себя pdb`шники?


Прежде всего нужно чтобы pdb собирались правильно во время компиляции/линковки. Для этого у VisualStudio 2008 нужно указать следующие ключи:
для компилятора: /Zi (Debug information format: Program Database)
для линковщика: /DEBUG (generate debug info: YES)
Моя строка построения буста:
.\bjam link=static threading=multi runtime-link=static -j %NUMBER_OF_PROCESSORS% --with-filesystem --with-thread --with-date_time address-model=64
Re: Бестолковый .dmp
От: ononim  
Дата: 11.11.09 20:45
Оценка:
K>Генерирую в релизе у юзеров в случае ошибки минидам через MiniDumpWriteDump и отправляю его себе для анализа
K>Но от полученых дампов толку мало, как минимум потому что стек не показывается по человечески.
K>Какие условия нужны чтобы таки его нормально посмтореть кроме того что нужно хранить у себя pdb`шники?
Во первых — чтобы сразу увидеть стек нужно в MiniDumpWriteDump передать exception context (параметр ExceptionParam)
Если вы крэш ловите в unhandled exception filter — вся нужная для этого информация к вам приходит в ExceptionInfo
ну и + thread id — GetCurrentThreadId. Если корректно снимете дамп с exception information то для того чтобы переключиться на exception context в windbg достаточно набрать команду ".ecxr"
Но на самом деле проявив немного смекалки можно вытащить exception context, даже если он не был сохранен с дампом, но дамп должен быть не mini в таком случае потому я подробно рассказывать как это сделать не стану ибо долго кнопочки жать придется.
Как много веселых ребят, и все делают велосипед...
Re[2]: Бестолковый .dmp
От: Kingofastellarwar Украина  
Дата: 11.11.09 21:13
Оценка:
Здравствуйте, Feonyf, Вы писали:

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


K>>Какие условия нужны чтобы таки его нормально посмтореть кроме того что нужно хранить у себя pdb`шники?


F>Прежде всего нужно чтобы pdb собирались правильно во время компиляции/линковки. Для этого у VisualStudio 2008 нужно указать следующие ключи:

F>для компилятора: /Zi (Debug information format: Program Database)
F>для линковщика: /DEBUG (generate debug info: YES)

Всё это есть и было.
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Re[2]: Бестолковый .dmp
От: Kingofastellarwar Украина  
Дата: 11.11.09 21:14
Оценка:
Здравствуйте, ononim, Вы писали:

K>>Генерирую в релизе у юзеров в случае ошибки минидам через MiniDumpWriteDump и отправляю его себе для анализа

K>>Но от полученых дампов толку мало, как минимум потому что стек не показывается по человечески.
K>>Какие условия нужны чтобы таки его нормально посмтореть кроме того что нужно хранить у себя pdb`шники?
O>Во первых — чтобы сразу увидеть стек нужно в MiniDumpWriteDump передать exception context (параметр ExceptionParam)
O>Если вы крэш ловите в unhandled exception filter — вся нужная для этого информация к вам приходит в ExceptionInfo
O> ну и + thread id — GetCurrentThreadId. Если корректно снимете дамп с exception information то для того чтобы переключиться на exception context в windbg достаточно набрать команду ".ecxr"
O>Но на самом деле проявив немного смекалки можно вытащить exception context, даже если он не был сохранен с дампом, но дамп должен быть не mini в таком случае потому я подробно рассказывать как это сделать не стану ибо долго кнопочки жать придется.

ну хоть ссылку дайте где почитать про генерацию полных дампов или как их
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Re[3]: Бестолковый .dmp
От: ononim  
Дата: 11.11.09 21:33
Оценка:
K>ну хоть ссылку дайте где почитать про генерацию полных дампов или как их
сделайте exeption information
full memory dump это из другой оперы и контролируется флагами в MiniDumpWriteDump
Как много веселых ребят, и все делают велосипед...
Re[4]: Бестолковый .dmp
От: Kingofastellarwar Украина  
Дата: 11.11.09 21:44
Оценка:
Здравствуйте, ononim, Вы писали:

K>>ну хоть ссылку дайте где почитать про генерацию полных дампов или как их

O>сделайте exeption information
O>full memory dump это из другой оперы и контролируется флагами в MiniDumpWriteDump

А если я делаю дамп не в результате отлова необработаного исключения? у меня есть и то и другое
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Re[4]: Бестолковый .dmp
От: Kingofastellarwar Украина  
Дата: 11.11.09 21:56
Оценка:
Здравствуйте, ononim, Вы писали:

K>>ну хоть ссылку дайте где почитать про генерацию полных дампов или как их

O>сделайте exeption information
O>full memory dump это из другой оперы и контролируется флагами в MiniDumpWriteDump

А, как контекст получить я понял.

Но дело в том что моя ловушка необработаных исключений получает валидный PEXCEPTION_POINTERS, но всё равно стек не показывает по-нормалному
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Re[5]: Бестолковый .dmp
От: ononim  
Дата: 11.11.09 22:02
Оценка:
K>>>ну хоть ссылку дайте где почитать про генерацию полных дампов или как их
O>>сделайте exeption information
O>>full memory dump это из другой оперы и контролируется флагами в MiniDumpWriteDump
K>А, как контекст получить я понял.
K>Но дело в том что моя ловушка необработаных исключений получает валидный PEXCEPTION_POINTERS, но всё равно стек не показывает по-нормалному
А она у вас _передает_ его правильно в MiniDumpWriteDump? код в студию
Как много веселых ребят, и все делают велосипед...
Re[5]: Бестолковый .dmp
От: ononim  
Дата: 11.11.09 22:02
Оценка:
K>>>ну хоть ссылку дайте где почитать про генерацию полных дампов или как их
O>>сделайте exeption information
O>>full memory dump это из другой оперы и контролируется флагами в MiniDumpWriteDump
K>А если я делаю дамп не в результате отлова необработаного исключения? у меня есть и то и другое
ну если у вас дамп "просто так" то и стеки у вас будут "просто так"
~*kv и любуйтесь
Как много веселых ребят, и все делают велосипед...
Re[6]: Бестолковый .dmp
От: Kingofastellarwar Украина  
Дата: 11.11.09 22:30
Оценка:
Здравствуйте, ononim, Вы писали:

K>>>>ну хоть ссылку дайте где почитать про генерацию полных дампов или как их

O>>>сделайте exeption information
O>>>full memory dump это из другой оперы и контролируется флагами в MiniDumpWriteDump
K>>А, как контекст получить я понял.
K>>Но дело в том что моя ловушка необработаных исключений получает валидный PEXCEPTION_POINTERS, но всё равно стек не показывает по-нормалному
O>А она у вас _передает_ его правильно в MiniDumpWriteDump? код в студию



void main()
{
    __try
    {
        //...
    }
    __except(RecordExceptionInfo(GetExceptionInformation(), L"WinMain"))
    {

    }
}

int RecordExceptionInfo(PEXCEPTION_POINTERS pExceptPtrs, LPCTSTR lpszMessage)
{
    static bool bFirstTime = true;
        
    #ifdef _DEBUG
        return EXCEPTION_CONTINUE_SEARCH;
    #endif
    
    if(IsDebuggerPresent())
    {
        return EXCEPTION_CONTINUE_SEARCH;
    }
    else
    {    
        if (!bFirstTime)    // Going recursive! That must mean this routine crashed!
            return EXCEPTION_CONTINUE_SEARCH;
        
        bFirstTime = false;
        //...
        CreateMiniDump(/*хендл на dmp файл*/, pExceptPtrs)
        //..
    }
}

void CreateMiniDump(HANDLE hFile, PEXCEPTION_POINTERS excpInfo)
{
    if (excpInfo == null) 
    {
        // Generate exception to get proper context in dump
        __try 
        {
            RaiseException(EXCEPTION_BREAKPOINT, 0, 0, null);
        } 
        __except(CreateMiniDump(hFile, GetExceptionInformation()), EXCEPTION_CONTINUE_EXECUTION) 
        {
        }
    } 
    else
    {
        MINIDUMP_EXCEPTION_INFORMATION eInfo;
        eInfo.ThreadId        = GetCurrentThreadId();
        eInfo.ExceptionPointers = excpInfo;
        eInfo.ClientPointers    = FALSE;
    
        MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, excpInfo ? &eInfo : null, null, null);
    }
}
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Re: Бестолковый .dmp
От: Alexander G Украина  
Дата: 11.11.09 23:06
Оценка:
Здравствуйте, Kingofastellarwar, Вы писали:

K>Генерирую в релизе у юзеров в случае ошибки минидам через MiniDumpWriteDump и отправляю его себе для анализа


K>Но от полученых дампов толку мало, как минимум потому что стек не показывается по человечески.


K>Какие условия нужны чтобы таки его нормально посмтореть кроме того что нужно хранить у себя pdb`шники?


В windbg и студии так же?
Студия/windbg говорят, что .pdb загрузилась?
Если стек в виндовых дллках, сервер символов майкрософт прописан?
Если свой стек, не заинлайнилось ли всё подряд?
Русский военный корабль идёт ко дну!
Re[7]: Бестолковый .dmp
От: ononim  
Дата: 11.11.09 23:41
Оценка:
ну дык все крута
вот ваш ко слегка адаптированный чтобы компилялся:
// dumptest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "windows.h"
#include "dbghelp.h"

int RecordExceptionInfo(PEXCEPTION_POINTERS pExceptPtrs, LPCTSTR lpszMessage);
void CreateMiniDump(PEXCEPTION_POINTERS excpInfo);

void main()
{
    __try
    {
        __asm int 3;
    }
    __except(RecordExceptionInfo(GetExceptionInformation(), "WinMain"))
    {
        
    }
}

int RecordExceptionInfo(PEXCEPTION_POINTERS pExceptPtrs, LPCTSTR lpszMessage)
{
    static bool bFirstTime = true;
    
#ifdef _DEBUG
    return EXCEPTION_CONTINUE_SEARCH;
#endif
    
    if(IsDebuggerPresent())
    {
        return EXCEPTION_CONTINUE_SEARCH;
    }
    else
    {    
        if (!bFirstTime)    // Going recursive! That must mean this routine crashed!
            return EXCEPTION_CONTINUE_SEARCH;
        
        bFirstTime = false;
        CreateMiniDump(pExceptPtrs);
    }
}

void CreateMiniDump(PEXCEPTION_POINTERS excpInfo)
{
    if (excpInfo == 0) 
    {
        // Generate exception to get proper context in dump
        __try 
        {
            RaiseException(EXCEPTION_BREAKPOINT, 0, 0, 0);
        } 
        __except(CreateMiniDump(GetExceptionInformation()), EXCEPTION_CONTINUE_EXECUTION) 
        {
        }
    } 
    else
    {
        MINIDUMP_EXCEPTION_INFORMATION eInfo;
        eInfo.ThreadId        = GetCurrentThreadId();
        eInfo.ExceptionPointers = excpInfo;
        eInfo.ClientPointers    = FALSE;
        
        HANDLE hFile = ::CreateFile("c:\\dump.dmp", GENERIC_ALL, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
        MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, excpInfo ? &eInfo : 0, 0, 0);
        ::CloseHandle(hFile);
    }
}



а вот лог сессии windbg:

Loading Dump File [C:\dump.dmp]
User Mini Dump File: Only registers, stack and portions of memory are available

Symbol search path is: srv*
Executable search path is:
Windows Server 2003 Version 3790 (Service Pack 2) MP (2 procs) Free x86 compatible
Product: Server, suite: Enterprise TerminalServer SingleUserTS
Machine Name:
Debug session time: Thu Nov 12 01:37:43.000 2009 (GMT+2)
System Uptime: not available
Process Uptime: not available
..........
This dump file has a breakpoint exception stored in it.
The stored exception information can be accessed via .ecxr.
eax=00350000 ebx=001453d8 ecx=00000205 edx=7c82860c esi=001453b0 edi=00145408
eip=7c82860c esp=0012f2ac ebp=0012f2bc iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
ntdll!KiFastSystemCallRet:
7c82860c c3 ret
0:000> .ecxr
eax=0012ffb0 ebx=7ffdb000 ecx=00340758 edx=00340000 esi=00000000 edi=00000000
eip=0040102d esp=0012ff5c ebp=0012ff80 iopl=0 nv up ei pl nz ac po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000212
*** WARNING: Unable to verify checksum for dumptest.exe
dumptest!main+0x2d:
0040102d cc int 3
0:000> kv
*** Stack trace for last set context — .thread/.cxr resets it
ChildEBP RetAddr Args to Child
0012ff80 00401434 00000001 00340f40 00340fa8 dumptest!main+0x2d (CONV: cdecl) [E:\Program Files\Microsoft Visual Studio\VC98\MyProjects\dumptest\dumptest.cpp @ 15]
0012ffc0 77e6f23b 00000000 00000000 7ffdb000 dumptest!mainCRTStartup+0xb4
0012fff0 00000000 00401380 00000000 00000000 kernel32!BaseProcessStart+0x23 (FPO: [SEH])

Как много веселых ребят, и все делают велосипед...
Re[8]: Бестолковый .dmp
От: Kingofastellarwar Украина  
Дата: 12.11.09 09:39
Оценка:
Здравствуйте, ononim, Вы писали:

O>ну дык все крута


Так дело в том что дампы созданые на моей тачке (XP x64 sp2) смотрятся отлично, а вот те которые приходят от юзерей — нет.
Может причина в том что они запускали прогу на 32битной системе?
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Re[9]: Бестолковый .dmp
От: ononim  
Дата: 12.11.09 09:51
Оценка:
O>>ну дык все крута
K>Так дело в том что дампы созданые на моей тачке (XP x64 sp2) смотрятся отлично, а вот те которые приходят от юзерей — нет.
K>Может причина в том что они запускали прогу на 32битной системе?
что значит 'нет'?
покажите лог windbg
Как много веселых ребят, и все делают велосипед...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.