Отказ C # не пойман отладчиком - PullRequest
2 голосов
/ 08 сентября 2011

У меня довольно большой проект, который совсем недавно начал падать при выходе. Я не лучший 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).

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

EDIT

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

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.");
}

Ответы [ 2 ]

1 голос
/ 08 сентября 2011
// Wait and make sure it has exited
Thread.Sleep(5000);

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

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

1 голос
/ 08 сентября 2011

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

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

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

...