При сбое 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;
}
Вот как я бы решил проблему для конечного пользователя со сбоем.
Загрузите и установите Инструменты отладки для Windows по адресу http://www.microsoft.com/ whdc / devtools / debugging / default.mspx
После установки инструментов (по умолчанию они попадают в C: \ Program Files \) откройте окно командной строки.
Перейдите в каталог, содержащий adplus (например, «C: \ Program Files \ Debugging Tools for Windows (x86)»).
Выполните следующую команду. Это запустит приложение и подключит adplus.
adplus -crash -o C: \ debug \ -FullOnFirst -sc C: \ path \ to \ your \ app.exe
После сбоя приложения запустите WinDbg и загрузите файл .dmp, созданный в C: \ debug. (Файл ->
.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 <<
Чтобы получить более подробную трассировку стека, отправьте пользователю файл .pdb
для этого конкретного выпуска (который следует поместить рядом с .exe
) и заставить их воспроизвести аварию.
Какую ОС (Windows XP, Windows Vista и т. Д.) Использует пользователь?
Если Windows Vista попытается отключить функцию «Отчеты о проблемах и их решения» (Панель управления -> Проблема Отчеты и решения -> Изменить настройки -> Расширенные настройки -> Отключить мои программы, отчеты о проблемах)
Или попробуйте установить
Application.SetUnhandledExceptionMode( UnhandledExceptionMode.CatchException );
Это всегда будет направлять исключения в обработчик ThreadException.
В двух словах: в приложении есть необработанное исключение.
Если у вас есть доступ к машине (через удаленный доступ и т. Д.), Попробуйте установить Visual Studio Express и запустить приложение. Вы должны увидеть диалоговое окно, предлагающее возможность отладки приложения с помощью нового экземпляра Visual Studio.
Также может быть что-то, препятствующее правильной инициализации Windows Forms. Я видел сообщения на форумах, в которых предполагалось, что причиной этого могут быть проблемы со шрифтами - убедитесь, что у пользователей установлены шрифты, необходимые вашему приложению, плюс обычные значения по умолчанию, такие как MS SansSerif, Arial, Tahoma, Times и т.п.
. это ... попробуйте пожертвовать курицей над ПК. Каждый раз действует очарование!
У нас были проблемы с исключениями в коде потока. Если вы создаете новый поток и забываете обработать исключение в методе потока, приложение просто «останавливается» - ни сообщения об ошибке, ни ничего, а только запись в журнале событий. Даже тогда UnhandledExceptionHandler
не срабатывает.
Может быть, причина в чем-то вроде этого?
Заглядывание в исходный код (магистраль) показывает, что обработка необработанных исключений кажется неполной в отношении приложений Windows Forms:
Вам необходимо обработать и не -Исключения потоков пользовательского интерфейса и исключения потоков пользовательского интерфейса:
Для первого вам необходимо реализовать обработчик необработанных исключений CLR через AppDomain.CurrentDomain.UnhandledException
, который уже существует.
Для второго вы должны необходимо реализовать обработчик необработанных исключений Windows Forms через Application.ThreadException
, который, похоже, отсутствует; это действительно может привести именно к тем проблемам, свидетелями которых вы являетесь. Пример реализации см. В документации MSDN Событие Application.ThreadException .
.. .Если вы можете связаться с этим страдающим пользователем, вот
Вместо того, чтобы делать ярлык для вашего 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 (...)
их.
stage.txt
должен быть помещен где-нибудь в% APPDATA%, а не в Program Files.
] Я нашел интересный случай на сервере 2003 и еще одно интересное обсуждение .
Вы должны обработать AppDomain.UnhandledException
в коде.
Был задан аналогичный вопрос . См. Также похожие.