Генерирую в релизе у юзеров в случае ошибки минидам через MiniDumpWriteDump и отправляю его себе для анализа
Но от полученых дампов толку мало, как минимум потому что стек не показывается по человечески.
Какие условия нужны чтобы таки его нормально посмтореть кроме того что нужно хранить у себя pdb`шники?
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Здравствуйте, alexei_s, Вы писали:
_>Исходники, соответствующие тем pdb. _>Удобно настроить для этих целей поддержку символьного сервера (на базе svn например)
Дык есть же ж, и по тому же пути, я заметил что тот хлам который в IntDir складывается как-то помогает правильно разруливать дмп.
А как символьный сервер делается? я просто с каждым релизом пдб сохранияю в свн и всё.
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Здравствуйте, Kingofastellarwar, Вы писали:
K>Генерирую в релизе у юзеров в случае ошибки минидам через MiniDumpWriteDump и отправляю его себе для анализа
минидамы эта пять! -- может в проге еще и миниблэкджек гдета есть?
Здравствуйте, Kingofastellarwar, Вы писали:
K>Генерирую в релизе у юзеров в случае ошибки минидам через MiniDumpWriteDump и отправляю его себе для анализа
а почему бы не вести лог работы в файл — сразу ясно где упало
Здравствуйте, Kingofastellarwar, Вы писали:
K>Какие условия нужны чтобы таки его нормально посмтореть кроме того что нужно хранить у себя pdb`шники?
Прежде всего нужно чтобы pdb собирались правильно во время компиляции/линковки. Для этого у VisualStudio 2008 нужно указать следующие ключи:
для компилятора: /Zi (Debug information format: Program Database)
для линковщика: /DEBUG (generate debug info: YES)
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 в таком случае потому я подробно рассказывать как это сделать не стану ибо долго кнопочки жать придется.
Как много веселых ребят, и все делают велосипед...
Здравствуйте, Feonyf, Вы писали:
F>Здравствуйте, Kingofastellarwar, Вы писали:
K>>Какие условия нужны чтобы таки его нормально посмтореть кроме того что нужно хранить у себя pdb`шники?
F>Прежде всего нужно чтобы pdb собирались правильно во время компиляции/линковки. Для этого у VisualStudio 2008 нужно указать следующие ключи: F>для компилятора: /Zi (Debug information format: Program Database) F>для линковщика: /DEBUG (generate debug info: YES)
Всё это есть и было.
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Здравствуйте, 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 г.
K>ну хоть ссылку дайте где почитать про генерацию полных дампов или как их
сделайте exeption information
full memory dump это из другой оперы и контролируется флагами в MiniDumpWriteDump
Как много веселых ребят, и все делают велосипед...
Здравствуйте, ononim, Вы писали:
K>>ну хоть ссылку дайте где почитать про генерацию полных дампов или как их O>сделайте exeption information O>full memory dump это из другой оперы и контролируется флагами в MiniDumpWriteDump
А если я делаю дамп не в результате отлова необработаного исключения? у меня есть и то и другое
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Здравствуйте, ononim, Вы писали:
K>>ну хоть ссылку дайте где почитать про генерацию полных дампов или как их O>сделайте exeption information O>full memory dump это из другой оперы и контролируется флагами в MiniDumpWriteDump
А, как контекст получить я понял.
Но дело в том что моя ловушка необработаных исключений получает валидный PEXCEPTION_POINTERS, но всё равно стек не показывает по-нормалному
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
K>>>ну хоть ссылку дайте где почитать про генерацию полных дампов или как их O>>сделайте exeption information O>>full memory dump это из другой оперы и контролируется флагами в MiniDumpWriteDump K>А, как контекст получить я понял. K>Но дело в том что моя ловушка необработаных исключений получает валидный PEXCEPTION_POINTERS, но всё равно стек не показывает по-нормалному
А она у вас _передает_ его правильно в MiniDumpWriteDump? код в студию
Как много веселых ребят, и все делают велосипед...
K>>>ну хоть ссылку дайте где почитать про генерацию полных дампов или как их O>>сделайте exeption information O>>full memory dump это из другой оперы и контролируется флагами в MiniDumpWriteDump K>А если я делаю дамп не в результате отлова необработаного исключения? у меня есть и то и другое
ну если у вас дамп "просто так" то и стеки у вас будут "просто так"
~*kv и любуйтесь
Как много веселых ребят, и все делают велосипед...
Здравствуйте, ononim, Вы писали:
K>>>>ну хоть ссылку дайте где почитать про генерацию полных дампов или как их O>>>сделайте exeption information O>>>full memory dump это из другой оперы и контролируется флагами в MiniDumpWriteDump K>>А, как контекст получить я понял. K>>Но дело в том что моя ловушка необработаных исключений получает валидный PEXCEPTION_POINTERS, но всё равно стек не показывает по-нормалному O>А она у вас _передает_ его правильно в MiniDumpWriteDump? код в студию
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Здравствуйте, Kingofastellarwar, Вы писали:
K>Генерирую в релизе у юзеров в случае ошибки минидам через MiniDumpWriteDump и отправляю его себе для анализа
K>Но от полученых дампов толку мало, как минимум потому что стек не показывается по человечески.
K>Какие условия нужны чтобы таки его нормально посмтореть кроме того что нужно хранить у себя pdb`шники?
В windbg и студии так же?
Студия/windbg говорят, что .pdb загрузилась?
Если стек в виндовых дллках, сервер символов майкрософт прописан?
Если свой стек, не заинлайнилось ли всё подряд?
ну дык все крута
вот ваш ко слегка адаптированный чтобы компилялся:
// 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])
Как много веселых ребят, и все делают велосипед...
Здравствуйте, ononim, Вы писали:
O>ну дык все крута
Так дело в том что дампы созданые на моей тачке (XP x64 sp2) смотрятся отлично, а вот те которые приходят от юзерей — нет.
Может причина в том что они запускали прогу на 32битной системе?
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
O>>ну дык все крута K>Так дело в том что дампы созданые на моей тачке (XP x64 sp2) смотрятся отлично, а вот те которые приходят от юзерей — нет. K>Может причина в том что они запускали прогу на 32битной системе?
что значит 'нет'?
покажите лог windbg
Как много веселых ребят, и все делают велосипед...