Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [MVS2008] Отловить падение программы, Как обнаружить модуль и место 
V
    Опции темы
MuForum
Дата 10.8.2010, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: нет
Всего: 4



Доброго времени суток.
Работаю на "Microsoft Visual Studio 2008", язык программирования "C++".

Есть программа которая использует MFC.

# Задача: Отловить падение/crash программы и определить имя или индекс модуля и если возможно имя функции.



P.S. -> Прошу помочь с проблемой, готов заплатить деньги за помощь.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
SenkraD
Дата 10.8.2010, 13:35 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 4
Всего: 23



MuForum,  глянь это, если не ещё не смотрел.
И ещё может это поможет


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
MuForum
Дата 10.8.2010, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: нет
Всего: 4



1. Программа запускается не под отладчиком, а на другом компьютере.
2. Программа написана на VC++, а не на .NET VC++.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
SenkraD
Дата 10.8.2010, 14:01 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 4
Всего: 23



Цитата(MuForum @  10.8.2010,  13:54 Найти цитируемый пост)
1. Программа запускается не под отладчиком, а на другом компьютере.
тогда может crash dump с последующей отладкой (к примеру, вот)

Цитата(MuForum @  10.8.2010,  13:54 Найти цитируемый пост)
2. Программа написана на VC++, а не на .NET VC++.
StackWalker без .NET пашет


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
jonie
Дата 10.8.2010, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



а я бы использовал просто ntsd.exe и просил бы дамп высылать....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
MuForum
Дата 10.8.2010, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: нет
Всего: 4



Благодарю за помощь принявших участие.

Я решил следующим образом.
1. В самой программе при падение делаю дамп.
Код


typedef BOOL (*MINIDUMPWRITEDUMP)
(
    IN HANDLE hProcess,
    IN DWORD ProcessId,
    IN HANDLE hFile,
    IN MINIDUMP_TYPE DumpType,
    IN CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, OPTIONAL
    IN CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, OPTIONAL
    IN CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam OPTIONAL
);
//---------------------------------------------------------------------------

void SetExceptionHook();
LONG TopLevelFilter(struct _EXCEPTION_POINTERS * pExceptionInfo);
//---------------------------------------------------------------------------

void SetExceptionHook()
{
    ::SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)TopLevelFilter);
}
//---------------------------------------------------------------------------

LONG TopLevelFilter(struct _EXCEPTION_POINTERS * pExceptionInfo)
{
    // По умолчанию завершим процесс стандартным образом;
    LONG retval        = EXCEPTION_CONTINUE_SEARCH;
    // ---- 
    // Сначала попробуем загрузить библиотеку рядом с EXE, т.к.
    // В System32 может быть старая версия.
    HMODULE hDll            = NULL;
    // ----
    TCHAR szDbgHelpPath[_MAX_PATH];
    memset(szDbgHelpPath, 0, _MAX_PATH);
    // ----
    if ( GetModuleFileName(NULL, szDbgHelpPath, _MAX_PATH) != 0 )
    {
        TCHAR * pSlash        = _tcsrchr(szDbgHelpPath, '\\');
        // ----
        if ( pSlash != 0 )
        {
            _tcscpy(pSlash + 1, _T("DBGHELP.DLL"));
            // ----
            hDll            = ::LoadLibrary(szDbgHelpPath);
        }
    }
    // ----
    if ( hDll == NULL )
    {
        // Если загрузка не удалась,
        // Пробуем загрузить любую доступную версию;
        hDll            = ::LoadLibrary( _T("DBGHELP.DLL"));
    }
    // ----
    LPCTSTR szResult    = NULL;
    // ----
    if ( hDll == NULL )
    {
        szResult        = _T("DBGHELP.DLL не найдена");
        // ----
        MessageBox(NULL, szResult, _T("eGameServer"), MB_OK);
        // ----
        return retval;
    }
    // ----
    // Если библиотека загружена - получаем адрес MiniDumpWriteDump();
    MINIDUMPWRITEDUMP pDump    = (MINIDUMPWRITEDUMP)GetProcAddress(hDll, "MiniDumpWriteDump");
    // ----
    if ( pDump == NULL )
    {
        szResult = _T("DBGHELP.DLL старая");
        // ----
        MessageBox(NULL, szResult, _T("eGameServer"), MB_OK);
        // ----
        return retval;
    }
    // ----
    TCHAR        szDumpPath[_MAX_PATH];
    memset(szDumpPath, 0, _MAX_PATH);
    // ----
    TCHAR        szScratch[_MAX_PATH];
    memset(szScratch, 0, _MAX_PATH);
    // ----
    // Будем записывать файл во временную папку;
    // ----
    SYSTEMTIME SysTime;
    GetLocalTime( & SysTime);
    // ----
    char lpCurDir[_MAX_PATH];
    memset(lpCurDir, 0, _MAX_PATH);
    // ----
    GetCurrentDirectory(_MAX_PATH - 1, lpCurDir);
    // ----
    sprintf(szDumpPath, "%s\\GameServer_Dump_%02d-%02d-%02d_%02d.%02d.%04d.dmp\0",
        lpCurDir,
        SysTime.wHour, SysTime.wMinute, SysTime.wSecond,
        SysTime.wDay, SysTime.wMonth, SysTime.wYear);
    // ----
    // Сообщаем пользователю, что процесс на грани смерти и
    // предлагаем сохранить дамп;
    // ----
    // Создаём файл;
    HANDLE hFile = ::CreateFile(szDumpPath, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, 
                                CREATE_ALWAYS,
                                FILE_ATTRIBUTE_NORMAL, NULL);
    // ----
    if ( hFile == INVALID_HANDLE_VALUE )
    {
        _stprintf(szScratch,
            _T("Ошибка создания диагностического файла '%s' (код %d)"),
            szDumpPath, GetLastError() );
        // ----
        szResult    = szScratch;
        // ----
        return retval;
    }
    // ----
    _MINIDUMP_EXCEPTION_INFORMATION ExInfo;
    // ----
    ExInfo.ThreadId                = ::GetCurrentThreadId();
    ExInfo.ExceptionPointers    = pExceptionInfo;
    ExInfo.ClientPointers        = NULL;
    // ----
    // И записать в него дамп;
    BOOL bOK        = pDump(GetCurrentProcess(), GetCurrentProcessId(),
                            hFile, MiniDumpNormal, & ExInfo, NULL, NULL);
    // ----
    if ( bOK != 0 )
    {
        _stprintf(szScratch, _T("Файл сохранен в: '%s'"), szDumpPath);
        // ----
        szResult        = szScratch;
        // ----
        retval            = EXCEPTION_EXECUTE_HANDLER;
    }
    else
    {
        _stprintf(szScratch,
            _T("Ошибка сохранения '%s' (код %d)"),
            szDumpPath, GetLastError());
        // ----
        szResult        = szScratch;
    }
    // ----
    ::CloseHandle(hFile);
    // ----
    return retval;
}
//---------------------------------------------------------------------------

// # Write in function;
SetExceptionHook();
//---------------------------------------------------------------------------



Затем при помощи WinDbg (WDK Windows Driver Kit), окрываем Crash log и смотрим что не так.


P.S. -> Необходимо установить |symbols path".


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
Abyx
Дата 10.8.2010, 23:28 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: нет
Всего: 10



MuForum, вам наверное за строчки кода платят...
PM MAIL   Вверх
Rad87
Дата 11.8.2010, 09:24 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 26.7.2010

Репутация: нет
Всего: нет



Серьезно smile
Какой практический смысл имеет отделение строчек этим "// ----"?
PM MAIL   Вверх
MuForum
Дата 11.8.2010, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: нет
Всего: 4



Цитата(Rad87 @ 11.8.2010,  09:24)
Серьезно smile
Какой практический смысл имеет отделение строчек этим "// ----"?

Практического смысла нет, но мне так работать удобнее.
- Код лично для меня, намного читабельнее.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.1105 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.