Блог GunSmoker-а
. when altering one’s mind becomes as easy as programming a computer, what does it mean to be human.
8 марта 2020 г.
Как узнать, почему программа внезапно закрывается?
Иногда бывают ситуации, когда ваше приложение просто молча закрывается, и вы понятия не имеете почему. Как можно диагностировать подобные ситуации?
Когда программа может закрыться?
- Штатно: приложение закрывается его собственный кодом, либо приложение закрывается внешним процессом;
- Не штатно: код приложения вызывает фатальную ошибку, приложение закрывает система.
- Приложение само явно вызвало TerminateProcess или ExitProcess (прямо или опосредованно — например, через Halt ).
- Приложение явно завершило все свои потоки (вышло из процедур потоков или же явно вызвало TerminateThread или ExitThread ). Это не бывает в Delphi, поскольку компилятор Delphi вставляет неявный вызов Halt в конец главного потока (т.е. всегда вызывает ExitProcess в конце работы главного потока), но это может случиться, если внешний процесс уничтожит главный поток в вашей программе.
- Какой-то внешний процесс закрыл или уничтожил или ваш процесс или все потоки в нём.
- В вашей программе произошло необработанное (фатальное) исключение, но в Доктор Ватсон / WER отключен диалог об ошибках.
- В вашей программе произошло необработанное (фатальное) исключение, в системе зарегистрирован сторонний посмертный отладчик с автоматическим запуском, который не показал сообщения об ошибке.
- В вашей программе произошло необработанное (фатальное) исключение, которое настолько серьёзно, что система даже не смогла показать сообщение, а посмертный отладчик не зарегистрирован.
Как диагностировать выход из приложения?
- Плюсы: можно отдать программу клиенту, он её запустит как обычно, программа сделает диагностику. Т.е. клиенту не нужно ничего дополнительно делать. Иными словами, клиент может не сотрудничать с вами для диагностики;
- Минусы: не любой выход можно диагностировать внутри самого процесса. Иногда всё настолько плохо, что система закроет процесс, у кода процесса не будет шансов на выполнение.
- Плюсы: получится диагностировать любые выходы из приложения;
- Минусы: программу нужно запускать под внешним процессом (отладчиком), клиента придётся проинструктировать, он должен сотрудничать с вами.
Диагностика внутри процесса
- Установите EurekaLog;
- Включите EurekaLog для своего проекта;
- В настройках EurekaLog перейдите на вкладку Features / Restart&Recovery и включите опцию Log application’s exits;
- Запустите приложение и позвольте ему закрыться;
- Откройте папку с отчётами (из Windows: Пуск / Программы / EurekaLog / EurekaLog Bug Reports; или откройте папку %APPDATA%\Neos Eureka S.r.l\EurekaLog\Bug Reports\ ). Если вы меняли путь для папки с отчётами — открывайте его;
- В папке найдите отчёт от вашего приложения. Например: Bug Reports\Project1.exe\Project1_ExitLog.el .
- Вы можете добавить проверку существования этого файла при запуске приложения и автоматически отправлять его вам;
- Или же вы можете добавить имя этого файла к опции Additional files, чтобы он автоматически был добавлен в следующий отчёт об ошибке.
- Эта функция не будет создавать отчёт о выходе через Halt (штатный выход);
- Функция работает только для приложений, не для DLL;
- Функция не сможет перехватить выход, инициированный внешним процессом;
- Отчёты о выходе могут быть ложно-положительными. Например, если приложение выходит через TerminateProcess , но логически это — штатно. Например, при перезапуске по исключению. Поэтому будьте осторожны, если вы хотите показывать какой-то диалог при старте приложения при обнаружении отчёта о выходе;
- Технически функция сделана как обёртка для RtlReportSilentProcessExit (только Vista+), либо (Windows XP и ранее) хуками на TerminateProcess и TerminateThread ;
- Когда вы включаете EurekaLog для своего проекта, EurekaLog будет вызываться автоматически при фатальных исключениях. Поэтому вместо обычного тихого выхода вы можете получить отчёт об ошибке от EurekaLog.
- ExceptionLog7.ProcessExitHandler 2244[17]
- EInject.RtlReportSilentProcessExitHook 1166[12]
- kernel32.TerminateProcess
- Unit175.TForm1.Button1Click 43[1]
- Controls.TControl.Click
- .
Диагностика внешним отладчиком
Вместе с EurekaLog, а также с EurekaLog Tools Pack устанавливается утилита Threads Snapshot, которая предназначена для захвата стеков всех потоков приложения в определённый момент времени.
- Откройте консоль в папке C:\Program Files (x86)\Neos Eureka S.r.l\EurekaLog 7\Bin\ (или Bin64, если у вас — 64-разрядное приложение) под учётной записью администратора;
- Запустите:
threadssnapshot.exe "/watch=Project1.exe"
threadssnapshot.exe "/unwatch=Project1.exe"
- ntdll.NtWaitForSingleObject
- kernel32.TerminateProcess
- Unit175.TForm1.Button1Click 43[1]
- Controls.TControl.Click
- .
Что ещё можно сделать?
Вот список того, что вы можете попробовать сделать для дополнительной диагностики.
- Попробуйте запустить приложение под отладчиком. Убедитесь, что в отладчике не отключены уведомления об исключениях. Если приложение под отладчиком не вылетает или подключить отладчик нет возможности — см. шаги ниже.
- Первым делом удалите регистрацию посмертного отладчика в ключе реестра AeDebug , либо хотя бы сбросьте параметр Auto в 0.
- [Vista+] Убедитесь, что «Служба регистрации ошибок Windows» («Windows Error Reporting Service», WerSvc ) не отключена (не находится в состоянии Disabled; по-умолчанию у неё тип запуска — Manual, но для надёжности вы можете её запустить вручную).
- Запустите Доктор Ватсон в Windows 2000, настройки отчётов в Windows XP, настройки WER в Windows Vista и позднее — и включите визуальные оповещения (Windows 2000), отчёты об ошибках (Windows XP), запрос согласия, т.е. не включайте автоматическую отправку (Windows Vista и выше).
- [Vista+] Проверьте настройки групповых политик WER. Убедитесь, что UI не отключен, логгинг не отключен, согласие (consent) не установлено в автоматическую отправку без запросов ( DefaultConcent = 1). Не забудьте проверить как политики машины, так и пользователя.
- [Vista+] Убедитесь, что ключа реестра Windows Error Reporting\DebugApplications\* нет или он установлен в 1.
- [Vista+] Убедитесь, что ключа реестра Windows Error Reporting\DontShowUI нет или он установлен в 0.
- [Vista+] Убедитесь, что ключа реестра Windows Error Reporting\LoggingDisabled нет или он установлен в 0.
- [Vista+] Очистите все отчёты в журнале стабильности системы.
- Убедитесь, что вы не вызываете SetErrorMode с одним из следующих флагов: SEM_FAILCRITICALERRORS , SEM_NOGPFAULTERRORBOX , SEM_NOOPENFILEERRORBOX . Для надёжности сделайте вызов SetErrorMode(0); первым действием при запуске своего приложения.
- [Win7+] Убедитесь, что вы не вызываете SetThreadErrorMode с одним из следующих флагов: SEM_FAILCRITICALERRORS , SEM_NOGPFAULTERRORBOX , SEM_NOOPENFILEERRORBOX для ваших потоков. Для надёжности сделайте вызов SetThreadErrorMode(0); первым действием ваших потоков.
- [Vista+] Убедитесь, что ваш код не делает вызов WerSetFlags(WER_FAULT_REPORTING_NO_UI); .
- [Vista+] Сделайте вызов WerSetFlags(WER_FAULT_REPORTING_ALWAYS_SHOW_UI); первым действием при запуске своего приложения.
- Убедитесь, что глобальная переменная System.JITEnable равна 0. Для надёжности присвойте её 0 первым действием при старте приложения.
- Запустите ваше приложение и дайте ему вылететь. Если никакого диалога так и не появилось, то выполните нижеследующие шаги.
- Проверьте, есть ли записи о вылете приложения в системном логе «Приложения».
- Проверьте, нет ли свежих записей в «журнале стабильности системы» или логов в %APPDATA%\Microsoft\Windows\WER\ReportArchive\ / %APPDATA%\CrashDumps\ .
- Попробуйте назначить свой глобальный обработчик необработанных исключений через системную функцию SetUnhandledExceptionFilter .
- Установите точки останова или хуки (в рамках вашего процесса) на TerminateProcess , ExitProcess , а если это не помогло — то и на TerminateThread и ExitThread .
- Установите точки останова или хуки на системную функцию kernel32.KiUserExceptionDispatcher — если эта функция будет вызвана непосредственно перед вылетом, то 99% за то, что у вас произошло крайне серьёзное необработанное исключение, при котором система даже не смогла показать сообщение.
- Наконец, попробуйте установить глобальный хук (все процессы) на TerminateProcess , TerminateThread , чтобы узнать, не завершает ли ваш процесс кто-то ещё.
- Также попробуйте пересобрать приложение под x86-64 или использовать другую версию Delphi (как более новую, так и более старую).
Приложения закрываются сами по себе, Windows 10?
Недавно начали закрываться приложения которые я использую. Например: сижу в хроме и хром постоянно закрывается, сижу в какой-то игре и она просто закрывается. И причем, именно закрывается, а не крашается. Но это непонятное действие происходит рандомно, а не на постоянном случае. То есть могу сидеть, скажем, часов 6 и все будет в порядке, и потом резко начнется вот это.
- Вопрос задан более двух лет назад
- 27208 просмотров
5 комментариев
Средний 5 комментариев
у вас ноутбук?
Lokfio @Lokfio Автор вопроса
Yan @Slayer_nn Куратор тега Windows
Lokfio, А где написано железо?
Версия OS
Lokfio @Lokfio Автор вопроса
Yan,
Ольга Йсмен @ElenaIcemen
отключи движение мыши на действие
Решения вопроса 0
Ответы на вопрос 4
Lokfio, попробуйте увеличить размер файла подкачки виртуальной памяти, должно помочь.
1. Правой кнопкой мыши по кнопке Пуск, заходим в Система.
2. Далее, в области справа, заходим в Дополнительные параметры системы.
3. Во вкладке Дополнительно, в разделе Быстродействие нажимаем Параметры.
4. Переходим на вкладку Дополнительно, и в области Виртуальная память нажимаем кнопку Изменить.
5. Убираем галочку с пункта «Автоматически выбирать объем файла подкачки».
6. Ниже меняем параметр «Размер по выбору системы» на параметр «Указать размер: «
7. Исходный размер, вводим 1024; Максимальный размер 4096
8. Нажимаем ниже справа кнопку Задать, далее ОК и перезагружаем систему.
На этом, в общем-то, все. Это должно решить вашу проблему.
Ответ написан более двух лет назад
Нравится 2 7 комментариев
Lokfio @Lokfio Автор вопроса
когда я нажимаю на «задать», всплывает это окно:
Разбираемся, что делать, если игры на вашем ПК «вылетают» на рабочий стол
Одна из самых неприятных проблем с играми — их вылет на рабочий стол. Причин этому может быть много и сегодня мы попробуем разобраться в этой проблеме.
3 августа 2021, вторник 18:57
Zystax [ ] для раздела Блоги
реклама
Каждый геймер сталкивался с такой проблемой, как вылет игр на рабочий стол. Это очень неприятно, ведь вы теряете не сохраненный прогресс игры, а если играли в онлайн игру, то вас выкидывает из нее, что иногда чревато поражением всей команды. Но хуже всего, когда вылеты происходят регулярно, а их причина остается неизвестной. Это может испортить все удовольствие от игрового процесса, и часто такая игра удаляется, а ее прохождение откладывается до лучших времен.
реклама
Вылет из игры может сопровождаться появлением окна с ошибкой, и это уже может дать вам какую-то базу для поиска проблемы в интернете по коду ошибки. Но довольно часто игра просто «вылетает» и вы видите перед собой рабочий стол. Давайте разберем все причины появления этой проблемы, и способы, с помощью которых «вылеты» можно побороть или хотя бы свести к минимуму.
Выясняем, много ли пользователей игры жалуются на вылеты
Есть игры, которые довольно часто вылетают и проблема в этом случае в основном на стороне игры, а не ПК игрока. Поиск проблем такой игры в интернете выдает огромное количество запросов пользователей, столкнувшихся с вылетами. Довольно яркий пример — игры серии ANNO, которые довольно стабильно работают, пока вы не отстроили огромные города и не проложили десятки маршрутов, но с определенного момента начинают мучить игрока частыми вылетами.
реклама
Проблема в движке игры, которому приходится обрабатывать огромное количество данных, растущее в геометрической прогрессии при плотной застройке островов. В ANNO 1404, к примеру, графический движок использует только два гигабайта ОЗУ и от вылетов помогает уменьшение качества графических настроек, утилита Large Address Aware и неофициальный патч версии 1.10. Но 100% гарантии от вылетов это не дает. Последняя игра серии, ANNO 1800, тоже страдает от вылетов, но 100% работающего решения проблемы для нее не существует и стоит сделать комплекс мер, которые мы попробуем дальше.
Исключаем аппаратные проблемы ПК
Первым делом стоит исключить аппаратные проблемы вашего ПК и ноутбука. Если вы будете уверены в его стабильной работе, то источник проблемы будет найти гораздо проще. Для начала стоит проверить комплектующие на перегрев и убрать разгон процессора, ОЗУ и видеокарты, если он есть. А если вы используете разгон постоянно, то стоит заново перетестировать его на стабильность.
реклама
Следом стоит сделать комплексный тест ПК с помощью стресс-тестов AIDA64. Для процессора неплохо подойдет получасовое тестирование в утилите OCCT, для видеокарты прогон теста стабильности 3DMark. А вот гонять часами тесты типа LINPACK или Furmark не стоит, они дают нетипичную нагрузку, которую ваш ПК никогда не встретит в реальной эксплуатации и скорее показывают не его стабильность, а возможности системы охлаждения.
Если ошибок нет — это отлично, но если тесты выявили сбои, то стоит заняться настройками и тестами ПК более тщательно, нормализовав его температурный режим, и проверив все контакты материнской платы. Неплохо помогает пересборка ПК с очисткой от пыли, заменой термопасты, проверкой всех разъемов и напряжений, которые выдает блок питания.
Приводим системные требования ПК к рекомендуемым игрой
реклама
Одна из частых причин вылета игры — несоответствие ПК минимальным требованиям игры. Особенно часто виновница вылетов — оперативная память, которой обычно не хватает. Если у вас менее 16 ГБ ОЗУ, то стоит довести ее объем до этого числа, сохранив двухканальный режим работы. Такой объем стоит сейчас не дорого по сравнению с ценами на остальные комплектующее, например, модули Crucial Ballistix Black (BL2K8G30C15U4B) объемом 16 ГБ и с частотой 3000 МГц обойдутся вам в Регарде в 6990 рублей.
Второй по частоте виновник проблем с играми — медленный, сбоящий или забитый «под завязку» накопитель. Если игры стоят на HDD, то его сильная фрагментация или битые сектора могут быть причиной вылетов игры. Универсальным решением может стать покупка SATA SSD накопителя, который подойдет в любую систему, например, надежного Samsung 870 EVO (MZ-77E500BW) объемом 500 ГБ.
Множество проблем со стабильностью ПК в целом решает покупка нового блока питания, особенно, если старый был бюджетный и поработал пять лет и более. Конденсаторы в бюджетных БП быстро выходят из строя, что чревато массой проблем. При выборе БП следует искать современные модели, в которых используются DC/DC-преобразователи, такие как Chieftec Proton (BDF-500S).
Исключаем проблемы с программным обеспечением
Первым делом при настройке софта стоит переустановить игру и дать ей обновиться до последней версии, новые игры обычно находятся в режиме непрерывного патчинга и исправления проблем. При переустановке главное — не потерять сохранения игры, ведь для игр типа The Elder Scrolls V: Skyrim или Ведьмак 3: Дикая охота это самая настоящая катастрофа. Сохраните их в отдельную папку.
Следующим шагом станет поиск проблем софта, которые могут влиять на стабильность игр. Первым делом стоит убедиться, что путь к вашей учетной записи не содержит символов кириллицы, некоторые игры некорректно работают с ней даже в 2021 году. Следом стоит отключить антивирус, а если его отключение простыми способами невозможно, как в случае с Microsoft Defender, то надо добавить папку игры в его исключения.
В поисках проблем может помочь просмотр событий в Windows, попасть в который можно нажав на клавиатуре сочетание клавиш Win+R и в открывшемся окошке ввести eventvwr.msc. Далее стоит проверить, включен ли файл подкачки, его отсутствие или малый размер часто вызывает проблемы в играх. Для некоторых игр помогает его ручное увеличение до 20 ГБ и более.
Далее стоит запустить игру с минимум параллельно запущенного софта, особенно стоит уделить внимание утилитам MSI Afterburner и прочим, постоянно висящим в трее и работающих с «железом» ПК. Если проблема не решается, стоит переустановить драйвера видеокарты и пакеты софта, нужного для игр — Microsoft .NET Framework, DirectX, Microsoft Visual C++.
А если все меры, описанные выше, не помогают, то стоит решиться на переустановку Windows. Переустановка обычно решает множество проблем и если на вашем ПК «железо» работает исправно, Windows только что корректно переустановлена и игра продолжает вылетать, то проблема на 90% в игре и вряд ли получится улучшить ситуацию.
Итоги
Надеюсь меры из этого блога помогут вам с вылетами в играх, ведь нет ничего хуже для геймера, чем вылетающие игры, особенно на мощном железе. Пишите в комментарии, удавалось ли вам победить вылеты в играх? И с помощью каких средств?
При подготовке материала использовались источники:
https://www.gunsmoker.ru/2020/03/diagnose-application-exit.html
https://qna.habr.com/q/982479
https://overclockers.ru/blog/Zystax/show/54464/razbiraemsya-chto-delat-esli-igry-na-vashem-pk-vyletajut-na-rabochij-stol