Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Перехват падения программы

318
27 сентября 2008 года
nof
193 / / 03.04.2006
Ребят, интересует такой вопрос.
Программа периодически падает и я не могу отследить в каком месте и при каких обстоятельствах.
Как можно сделать так, чтобы при падении программы, например, запускался какой-то поток и сохранял значения определённых переменных в файл?

пишу под msvc 2005 mfc
3.7K
27 сентября 2008 года
0nni
326 / / 24.06.2008
Сам этим вопросом мучался, вот что мне посоветовали.
318
30 сентября 2008 года
nof
193 / / 03.04.2006
Цитата: 0nni
Сам этим вопросом мучался, вот что мне посоветовали.


ну так на чём ты всё-таки остановился? :) как решил проблему?

7.9K
30 сентября 2008 года
***Zebr@XXL***
47 / / 18.08.2005
Глянь это: http://www.dtf.ru/articles/read.php?id=37058

Может поможет
3.7K
30 сентября 2008 года
0nni
326 / / 24.06.2008
Ну я много рыл, поидее то что я сейчас покажу делается через
SetUnhandledExceptionFilter(), однако у меня не получилось.

Код:
program Project1;

uses Windows;

type
  P_EXCEPTION_POINTERS = ^ EXCEPTION_POINTERS;

//Это мой обработчик
function MySEH(EP: P_EXCEPTION_POINTERS): integer; stdcall;
begin
  Result := 1;
  MessageBox(0, 'Буага!', 0, MB_ICONERROR or MB_SYSTEMMODAL);
  ExitProcess(0);
end;

begin
  asm
    //Следующие 3 строчки устанавливаю MySEH
    push offset MySEH;
    push -1;
    mov fs:[eax], esp;
    //Эти 2 - вызывают исключение
    xor eax, eax;
    mov [eax], 0;
  end;
end.

В результате вызывается окно с надписью "Бугага!".
EP - указатель на структуру EXCEPTION_POINTERS в которой можно найти много интерестного, в том числе код ошибки и состояние регистров.
318
02 октября 2008 года
nof
193 / / 03.04.2006
Цитата: ***Zebr@XXL***
Глянь это: http://www.dtf.ru/articles/read.php?id=37058

Может поможет


ага, спасибо! действительно помогло!

Цитата: 0nni
Ну я много рыл, поидее то что я сейчас покажу делается через
SetUnhandledExceptionFilter(), однако у меня не получилось.


рекомендую посмотреть линк, написанный выше
мне он помог, реализовал перехват и логирование эксепшенов, происходящих в любой точке программы

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог