Как диагностировать.NET, которую в конечном счете регистрируют 2.0 сообщения Сообщения об ошибке?

При сбое scanf он не потребляет входные данные, поэтому вы будете заблокированы в бесконечном цикле.

#include <stdio.h>
#include <stdlib.h>

int main() {
    int passcode;
    int guessamount = 0;

    printf("Try to guess the magic passcode:");
    scanf("%d", &passcode);

    guessamount++;

    while (passcode != 43) {
        if (passcode >= 101) {
            printf("The passcode is too high!It cannot exceed 100\n");
            guessamount--;
        }

        printf("The passcode was wrong.Please try again:");
        if (!scanf("%d", &passcode)) {
            printf("Invalid value\n");
            while (getchar() != '\n');
        }

        guessamount++;
    }
    printf("The passcode is true!You used %d tries!", guessamount);



    return 0;
}
9
задан Community 23 May 2017 в 12:00
поделиться

8 ответов

Вот как я бы решил проблему для конечного пользователя со сбоем.

  1. Загрузите и установите Инструменты отладки для Windows по адресу http://www.microsoft.com/ whdc / devtools / debugging / default.mspx

  2. После установки инструментов (по умолчанию они попадают в C: \ Program Files \) откройте окно командной строки.

  3. Перейдите в каталог, содержащий adplus (например, «C: \ Program Files \ Debugging Tools for Windows (x86)»).

  4. Выполните следующую команду. Это запустит приложение и подключит adplus.

adplus -crash -o C: \ debug \ -FullOnFirst -sc C: \ path \ to \ your \ app.exe

После создания аварийного дампа

После сбоя приложения запустите WinDbg и загрузите файл .dmp, созданный в C: \ debug. (Файл ->

  • .NET 4.0
 .loadот sos clr

Чтобы увидеть трассировку стека

!clrstack

Чтобы увидеть более полезную трассировку стека

!clrstack –p

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

!do <address>

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

0:009> !do 017f2b7c    
Name: System.String    
MethodTable: 790fd8c4    
EEClass: 790fd824    
Size: 124(0x7c) bytes    
 (C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)    
String: \\server\path\not_here.txt
Fields:    
      MT    Field   Offset                 Type VT     Attr    Value Name    
79102290  4000096        4         System.Int32  1 instance       54 m_arrayLength    
79102290  4000097        8         System.Int32  1 instance       53 m_stringLength    
790ff328  4000098        c          System.Char  1 instance       5c m_firstChar    
790fd8c4  4000099       10        System.String  0   shared   static Empty    
    >> Domain:Value  00161df8:790d884c <<    
7912dd40  400009a       14        System.Char[]  0   shared   static WhitespaceChars    
    >> Domain:Value  00161df8:014113e8 <<
18
ответ дан 4 December 2019 в 07:15
поделиться

Чтобы получить более подробную трассировку стека, отправьте пользователю файл .pdb для этого конкретного выпуска (который следует поместить рядом с .exe ) и заставить их воспроизвести аварию.

0
ответ дан 4 December 2019 в 07:15
поделиться

Какую ОС (Windows XP, Windows Vista и т. Д.) Использует пользователь?

Если Windows Vista попытается отключить функцию «Отчеты о проблемах и их решения» (Панель управления -> Проблема Отчеты и решения -> Изменить настройки -> Расширенные настройки -> Отключить мои программы, отчеты о проблемах)

Или попробуйте установить

  Application.SetUnhandledExceptionMode( UnhandledExceptionMode.CatchException );

Это всегда будет направлять исключения в обработчик ThreadException.

3
ответ дан 4 December 2019 в 07:15
поделиться

В двух словах: в приложении есть необработанное исключение.

Если у вас есть доступ к машине (через удаленный доступ и т. Д.), Попробуйте установить Visual Studio Express и запустить приложение. Вы должны увидеть диалоговое окно, предлагающее возможность отладки приложения с помощью нового экземпляра Visual Studio.

Также может быть что-то, препятствующее правильной инициализации Windows Forms. Я видел сообщения на форумах, в которых предполагалось, что причиной этого могут быть проблемы со шрифтами - убедитесь, что у пользователей установлены шрифты, необходимые вашему приложению, плюс обычные значения по умолчанию, такие как MS SansSerif, Arial, Tahoma, Times и т.п.

. это ... попробуйте пожертвовать курицей над ПК. Каждый раз действует очарование!

2
ответ дан 4 December 2019 в 07:15
поделиться

У нас были проблемы с исключениями в коде потока. Если вы создаете новый поток и забываете обработать исключение в методе потока, приложение просто «останавливается» - ни сообщения об ошибке, ни ничего, а только запись в журнале событий. Даже тогда UnhandledExceptionHandler не срабатывает.

Может быть, причина в чем-то вроде этого?

2
ответ дан 4 December 2019 в 07:15
поделиться

Заглядывание в исходный код (магистраль) показывает, что обработка необработанных исключений кажется неполной в отношении приложений Windows Forms:

Вам необходимо обработать и не -Исключения потоков пользовательского интерфейса и исключения потоков пользовательского интерфейса:

  • Для первого вам необходимо реализовать обработчик необработанных исключений CLR через AppDomain.CurrentDomain.UnhandledException , который уже существует.

  • Для второго вы должны необходимо реализовать обработчик необработанных исключений Windows Forms через Application.ThreadException , который, похоже, отсутствует; это действительно может привести именно к тем проблемам, свидетелями которых вы являетесь. Пример реализации см. В документации MSDN Событие Application.ThreadException .

5
ответ дан 4 December 2019 в 07:15
поделиться

.. .Если вы можете связаться с этим страдающим пользователем, вот

Идея: регистрировать этапы предварительного выполнения

Вместо того, чтобы делать ярлык для вашего program.exe , сделайте ярлык на ] program.bat , который будет

echo "Pre-start" > stage.txt
start program.exe

Таким образом, первая строка Program.cs будет

File.WriteAllLines("stage.txt", "Program execution started.");

В обработчике AppDomain.UnhandledException первая строка будет

File.WriteAllLines("stage.txt", "Unhandled exception has been caught.");

Также убедитесь, что обработчик не выделяет память или ресурсы - предварительно выделите их при запуске программы. Обработчик только запускает запись в журнал.

Комментарии

Весьма вероятно, что stage.txt (отправленный пользователем) будет содержать «Pre-start». Это происходит, когда в сторонней .dll создается исключение - даже до того, как ваша программа была запущена.

В этом случае вам понадобится простая программа проверки, которая не будет ссылаться на сборки, которые вы program.exe ] есть, но будет Assembly.Load (...) их.

PS

stage.txt должен быть помещен где-нибудь в% APPDATA%, а не в Program Files.

] Я нашел интересный случай на сервере 2003 и еще одно интересное обсуждение .

1
ответ дан 4 December 2019 в 07:15
поделиться

Вы должны обработать AppDomain.UnhandledException в коде.

Был задан аналогичный вопрос . См. Также похожие.

0
ответ дан 4 December 2019 в 07:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: