singlepost

Как поймать runtime error? << На главную или назад  

(Delphi)

Я из Windows-приложения запускаю программу (консольную) (с помощью CreateProcess), и при этом, если у этой программы возникнет runtime-error, то появляется окошко с сообщением об ошибке (виндуозовское) , а нужно не показывать никаких сообщений, а узнать ExitCode и завершить процесс.

Как поймать этот runtime доWindows ?

8 ответов в теме “Как поймать runtime error?”

  1. 8
    Александр Lert ответил:

    Рад помочь :)

  2. 7
    Roman Atangulov ответил:

    2 Александр Quyse Lert:Спасибо!

  3. 6
    Александр Дзюба ответил:

    Александр Quyse Lert, век живи век учись :) не знал

  4. 5
    Александр Lert ответил:

    Для этого используются Jobs (задания). См. документацию MSDN по функциям CreateJobObject, SetInformationJobObject и т.д.
    Надо создать задание, наложить ограничения на процессы в задании, создать процесс в приостановленном состоянии, добавить его в задание, разрешить его выполнение.
    Задания позволяют наложить некоторое количество ограничений, в том числе по времени, памяти, использовании UI и т.д., вплоть до процессорной привязки, а также конкретно чтобы не выводилось окно с ошибкой (флаг JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION в структуре JOBOBJECT_BASIC_LIMIT_INFORMATION, ну в общем разберетесь).
    При завершении процессов задания приходят уведомления на специально созданный completion port, в которых указывается причина (превышение времени, памяти, рантайм еррор и т.д.) – в общем, как раз то что нужно! :)

    Через дебаг не рекомендую, корректно сделать сложно. Задания здесь по-моему, лучший выбор.

  5. 4
    Олег Давыдов ответил:

    Рома, а ты задумал свою тестирующую систему написать?

  6. 3
    Roman Atangulov ответил:

    2 Санька Тортиковая_Морда Снетков: я не об этом совсем. Мне не нужно избавиться от рантайма в дочернем процессе, мне как раз нужно узнать, что он есть (если есть, конечно) и какой он.

  7. 2
    Санька Снетков ответил:

    Может у тебя обращение к несуществуещему элементу массива если такие есть?

  8. 1
    Александр Дзюба ответил:

    думается что только через DEBUG-mode, других вариантов особо не вижу

    CreateProcess с флагом DEBUG_PROCESS,

    потом в цикле
    WaitForDebugEvent(&DebugEv, INFINITE);

    ContinueDebugEvent(DebugEv.dwProcessId, DebugEv.dwThreadId, dwContinueStatus);

    пока не свалится, как свалится перезапускаешь

    другой вариант – отключить выдачу ватсона и проверять список процессов, как делает mysql :) но этот вариант хуже

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.