Сбой C#, не обнаруженный отладчиком

У меня есть довольно большой проект, который совсем недавно начал падать при выходе. Я не самый лучший кодер на С#, но в целом все работает так, как задумано. Однако в этом случае, когда я закрываю свое консольное приложение, оно аварийно завершает работу, но не перехватывается отладчиком MSVC.

1) Когда я создаю его в Release и запускаю, он обычно всегда вылетает при выходе.

2) Когда я создаю его в Debug и запускаю, кажется, что он падает только при выходе каждый 1 из 3-5 раз.

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

The program '[11108] MCDaemon.vshost.exe: Managed (v4.0.30319)' has exited with code -1073741510 (0xc000013a).

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

ИЗМЕНИТЬ

Из приведенного ниже ответа это код, вызывающий код выхода, но я не вижу в этом ничего плохого.

public static Boolean Handler(MyWin32.CtrlTypes CtrlType)
{
    // A switch to handle the event type.
    switch (CtrlType)
    {
        case MyWin32.CtrlTypes.CTRL_C_EVENT:
            Program.TerminateProcess();
            break;
        case MyWin32.CtrlTypes.CTRL_CLOSE_EVENT:
            Program.TerminateProcess();
            break;
    }

    return true;
}

public static void TerminateProcess()
{
    // Stop the Poll Timer from Running
    PollTimer.Stop();

    log.LogMessage("Process is being Shutdown.");
    log.LogMessage("Requesting Process to Stop....");
    SendProcessCmd("stop");

    // Wait and make sure it has exited
    Thread.Sleep(5000);

    if (!myProcess.HasExited)
    {
        log.LogMessage("My Process did not stop on its own, forcing Process to quit.");
        myProcess.Kill();
    }

    log.LogMessage("My Process has been Shutdown.");
}

person Community    schedule 07.09.2011    source источник


Ответы (2)


// Wait and make sure it has exited
Thread.Sleep(5000);

Это постановка проблемы. Вы вызываете SetConsoleCtrlHandler() в своем коде, чтобы вызвать метод Handler . Windows требует, чтобы обработчик управления реагировал и не занимал слишком много времени для возврата из обратного вызова. Время ожидания для CTRL_CLOSE_EVENT составляет ровно 5 секунд, что объясняет, почему иногда это работает. Если это занимает больше времени, Windows отключает процесс.

Вам нужно будет реализовать TerminateProcess по-другому. Уничтожение процесса довольно произвольно, вам лучше просто не делать этого. Или запустите другой сторожевой процесс. Я не могу сделать этот звонок, хотя.

person Hans Passant    schedule 07.09.2011
comment
Вы были правы в деньгах, так как это, похоже, источник проблемы. Я действительно не понимаю, почему запуск его в режиме отладки не приводит к сбою при закрытии, а запуск в режиме выпуска - да. Мне удалось заставить его, наконец, дать мне ошибку сбоя. Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.WaitForThreadExit() + 0x96 байт - person ; 08.09.2011
comment
Хорошо, я понял это. Моя сборка выпуска была для x86 (из-за ошибки в одном из API, которые я использую, это необходимо), а моя сборка отладки была для ЛЮБОГО процессора. Я понятия не имею, почему первый может привести к сбою :/ - person ; 08.09.2011
comment
Хм, нет, вы не исправили это. Измените аргумент Sleep() на 6000, чтобы сделать его согласованным. Такие грубые аборты никогда не бывают проблемой. Сделайте так, чтобы ваша программа завершилась красиво, обнаружив нажатие клавиши, например Escape. - person Hans Passant; 08.09.2011
comment
Нет, я имел в виду, что вы были правы насчет 5-секундной части, но она вылетала, даже когда я изменил ее на меньшее время, поэтому у меня было 2 проблемы. Мне также удалось решить эту проблему, изменив цель сборки на ЛЮБОЙ процессор (не знаю, почему это вызывало проблемы на x86). - person ; 08.09.2011

0xC000013A: приложение завершено в результате нажатия Ctrl+C.

Это связано с тем, что вы закрыли окно консоли, а приложение этого не ожидало, поэтому Windows закрыла его за вас.

Извините, но я не знаю, как перехватить событие закрытия окна консоли в управляемом коде.

person Neil    schedule 07.09.2011
comment
А, теперь это имеет смысл. Я обновил свой первоначальный вопрос и включил код своего обработчика для события Ctrl+C, с которым я действительно не вижу никаких проблем. - person ; 08.09.2011
comment
@Brett: Вы уверены, что вызывается ваш обработчик? - person Gabe; 08.09.2011