Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Access Violation, Перехват 
:(
    Опции темы
CPlusPlusFAN
Дата 26.2.2008, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 1.11.2005
Где: Воронеж

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



Запускаю стороннее приложение через CreateProcess. Это приложение может вызвать Access Violation. Нужно перехватить эту ситуацию во избежание вывода окна "Отправлять/неотправлять отчёт" и вывести сообщение об ошибке.
Можно привести пример? smile 

ЗЫ У меня программа запускает сотни других программ и закрывать за ними окна вполне геморройно.

Это сообщение отредактировал(а) CPlusPlusFAN - 26.2.2008, 15:37
PM MAIL ICQ Jabber   Вверх
BorisVorontsov
Дата 26.2.2008, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

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



Инжект библиотеки с установкой фильтра исключений -- SetUnhandledExceptionFilter


--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
CPlusPlusFAN
Дата 26.2.2008, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 1.11.2005
Где: Воронеж

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



А можно немного поподробней, а то я в первый раз с этим сталкиваюсь.
PM MAIL ICQ Jabber   Вверх
dumb
Дата 27.2.2008, 04:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



для таких случаев удобно использовать отладку(флаг DEBUG_PROCESS).
обработка исключения при подключенном отладчике(отладчиком в данном случае является наша запускающая программа) происходит в несколько этапов: 
  •  в отладчик посылается "First chance"-уведомление об исключении
  •  отладчик выполняет какие-либо действия и продолжает выполнение программы
  •  если в программе предусмотрен обработчик исключения, то он отрабатывает.
      если же его(обработчика) нет(необрабатываемое исключение), то отладчику шлется "Last chance"-уведомление.
  •  если отладчик продолжит выполнение программы после "Last chance", то она "упадет".

пример запуска с отладкой("рыба" - в комментариях написано, что по идее должно быть сделано отладчиком):
Код

  int Stop = 0;
  STARTUPINFO si = {0};
  PROCESS_INFORMATION pi;
  DEBUG_EVENT evDebug;
  DWORD dwContinueStatus = DBG_CONTINUE;

  if (CreateProcess("C:\\windows\\system32\\notepad.exe", "", 0, 0, FALSE, DEBUG_PROCESS, 0, 0, &si, &pi))
  {
    while (!Stop)
    {
      WaitForDebugEvent(&evDebug, INFINITE);
      switch (DebugEv.dwDebugEventCode)
      {
        case EXCEPTION_DEBUG_EVENT:
            switch(DebugEv.u.Exception.ExceptionRecord.ExceptionCode)
            {
                case EXCEPTION_ACCESS_VIOLATION:
                // First chance: Pass this on to the system.
                // Last chance: Display an appropriate error.
                    break;

                case EXCEPTION_BREAKPOINT:
                // First chance: Display the current
                // instruction and register values.
                    break;

                case EXCEPTION_DATATYPE_MISALIGNMENT:
                // First chance: Pass this on to the system.
                // Last chance: Display an appropriate error.
                    break;

                case EXCEPTION_SINGLE_STEP:
                // First chance: Update the display of the
                // current instruction and register values.
                    break;

                case DBG_CONTROL_C:
                // First chance: Pass this on to the system.
                // Last chance: Display an appropriate error.
                    break;

                default:
                // Handle other exceptions.
                    break;
            }
        case CREATE_THREAD_DEBUG_EVENT:
        // As needed, examine or change the thread's registers
        // with the GetThreadContext and SetThreadContext functions;
        // and suspend and resume thread execution with the
        // SuspendThread and ResumeThread functions.
            break;
        case CREATE_PROCESS_DEBUG_EVENT:
        // As needed, examine or change the registers of the
        // process's initial thread with the GetThreadContext and
        // SetThreadContext functions; read from and write to the
        // process's virtual memory with the ReadProcessMemory and
        // WriteProcessMemory functions; and suspend and resume
        // thread execution with the SuspendThread and ResumeThread
        // functions. Be sure to close the handle to the process image
        // file with CloseHandle.
            break;

        case EXIT_THREAD_DEBUG_EVENT:
        // Display the thread's exit code.
            break;

        case EXIT_PROCESS_DEBUG_EVENT:
        // Display the process's exit code.
            Stop = 1;
            break;

        case LOAD_DLL_DEBUG_EVENT:
        // Read the debugging information included in the newly
        // loaded DLL. Be sure to close the handle to the loaded DLL
        // with CloseHandle.
            break;

        case UNLOAD_DLL_DEBUG_EVENT:
        // Display a message that the DLL has been unloaded.
            break;

        case OUTPUT_DEBUG_STRING_EVENT:
        // Display the output debugging string.
            break;

      }
      // Resume executing the thread that reported the debugging event.
      ContinueDebugEvent(evDebug.dwProcessId, evDebug.dwThreadId, dwContinueStatus);
    } // !Stop
    CloseHandle( pi.hThread );
    CloseHandle( pi.hProcess );
  }

PM MAIL   Вверх
CPlusPlusFAN
Дата 28.2.2008, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 1.11.2005
Где: Воронеж

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



Столкнулся с такой проблемой: созданный поток, выполнение которого описано выше, отказывается работать.

Вот как прога должна работать:

1) Берём исходник, запускаем процесс компиляции без DEBUG'а.
2) Проверяем существование исполняемого файла. Если его нет, то пишем "Compilation error", иначе далее по списку.
3) Замеряем время.
4) Запускаем поток полученного исполняемого файла в режиме отладки. Если произошла ошибка времени выполнения в запущенной проге, выдаём "Access Violation" (возможно более подробное описание ошибки, например DIV BY 0), присваиваем crash=true, вырубаем запущенный процесс.
5) Замеряем время, выдаём разницу.

Всё работает без DEBUG'а, пока прога ведёт себя прилично.

Так вот, я попробовал приведённый код для компиляции и запуска. Исходник (он обрабатывается первым), содержащий выход за границы массива, компилится нормально и выполняется, и выдаёт AV. Остальные исходники просто отказываются компилиться (все исходники у меня без ошибок компиляции). Можете объяснить в чём дело? И, если не сложно, описать работу цикла запуска программы (шаг 4) для моей задачи.
PM MAIL ICQ Jabber   Вверх
CPlusPlusFAN
Дата 1.3.2008, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 1.11.2005
Где: Воронеж

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



У меня всё получилось. Я сам догадался, как нужно сделать. Тему можно закрывать.
PM MAIL ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




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


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

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