Silent Process Exit: процесс '?' был завершен процессом 'C: \ Windows \ System32 \ svchost.exe' с кодом завершения 1067
668
nietras
У нас есть серьезная проблема с тихим завершением приложения C # в случайные и редкие моменты времени при установке 32-разрядной версии Windows 10. Например, это может быть месяц между событиями. Или иногда просто день.
Основные технические характеристики системы:
Microsoft Windows 10 Enterprise 2016 LTSB Version 10.0.14393 Build 14393 32-bit
The process 'APPLICATIONPATH\APPLICATIONNAME.exe' was terminated by the process 'C:\Windows\System32\svchost.exe' with termination code 1067. The creation time for the exiting process was 0x01d43bd8689073eb.
Рассматривая дампы для этого, который был настроен для мониторинга, мы получили идентификатор процесса для svchost. Эта служба все еще работала в системе, и она показывает следующий список служб:
Который, кажется, список "netsvcs" для Windows. При открытии дампа из svchost.exeи просмотре этого был найден единственный поток с интересным стеком вызовов:
UBPM - это унифицированный диспетчер фоновых процессов. Но как это может прекратить наше приложение? И почему? А что 1067говорит нам код завершения ?
Ниже приведена запись в журнале от Silent Process Monitoring:
Log Name: Application Source: Microsoft-Windows-ProcessExitMonitor Date: 2018-08-31 15:26:09 Event ID: 3001 Task Category: None Level: Information Keywords: Classic User: SYSTEM Computer: PC Description: The process 'APPLICATIONPATH\APPLICATIONNAME.exe' was terminated by the process 'C:\Windows\System32\svchost.exe' with termination code 1067. The creation time for the exiting process was 0x01d43ed2aee892ab. Event Xml: <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"> <System> <Provider Name="Microsoft-Windows-ProcessExitMonitor" Guid="" EventSourceName="Process Exit Monitor" /> <EventID Qualifiers="16384">3001</EventID> <Version>0</Version> <Level>4</Level> <Task>0</Task> <Opcode>0</Opcode> <Keywords>0x80000000000000</Keywords> <TimeCreated SystemTime="2018-08-31T13:26:09.988216500Z" /> <EventRecordID>4853</EventRecordID> <Correlation /> <Execution ProcessID="0" ThreadID="0" /> <Channel>Application</Channel> <Computer>PC</Computer> <Security UserID="S-1-5-18" /> </System> <EventData Name="EVENT_PROCESSTERMINATION_CROSSPROCESS"> <Data Name="param1">APPLICATIONPATH\APPLICATIONNAME.exe</Data> <Data Name="param2">C:\Windows\System32\svchost.exe</Data> <Data Name="param3">1067</Data> <Data Name="param4">01d43ed2aee892ab</Data> </EventData> </Event>
ЗАМЕЧАНИЯ: ПК не выключается в момент завершения работы приложения, и в журналах событий отсутствуют какие-либо другие указания относительно того, почему процесс был остановлен.
ОБНОВЛЕНИЕ 1: Здесь несколько дополнительных деталей (пытаясь ответить столько же, сколько в комментариях):
Процесс (иногда) запускается через TaskScheduler, когда Windows запускается да. В другое время пользователем. Не совсем уверен, что проблема возникает только при запуске через TaskScheduler. Но интересный момент? Может ли Windows по какой-то причине убить задачу? Обратите внимание, что время между выходом из процесса может составлять до месяца.
У нас есть исходный код для основной программы, но могут возникнуть проблемы с его запуском в отладчике, так как он выполняется на клиенте, но, возможно,. Мы не можем запустить его скомпилировано для отладки. Вовсе нет, из-за производительности. Это живое производство.
Приложение - это обычное приложение WPF без каких-либо дочерних процессов или какого-либо другого межпроцессного взаимодействия. Он использует несколько сторонних устройств, например, библиотеки и драйверы.
У нас есть настроенная обработка событий исключений приложений, доменов приложений и т. Д. Ничего из этого не происходит. Процесс завершается без каких-либо признаков возникновения исключения. Это сложный процесс выхода.
Мы подозревали, что источником может быть сторонний драйвер, но как? И как мы могли определить, было ли это так?
ОБНОВЛЕНИЕ 2: Мы используем пакет nuget TaskSchedulerдля настройки задачи с помощью кода. Обратите внимание, что мы не устанавливаем ExecutionTimeLimit, который, следовательно, должен быть Nothing и, следовательно, бесконечным.
using (TaskService m_service = new TaskService()) { var task = m_service.NewTask(); task.Principal.UserId = userId; task.Principal.LogonType = TaskLogonType.InteractiveToken; task.Principal.RunLevel = TaskRunLevel.Highest; task.Settings.Enabled = true; task.Settings.MultipleInstances = TaskInstancesPolicy.IgnoreNew; task.Settings.Hidden = false; // NOTICE: A subset of the following 4 settings will cause app to hang on Win10 //task.Settings.AllowHardTerminate = true; //task.Settings.DisallowStartOnRemoteAppSession = false; //task.Settings.RunOnlyIfLoggedOn = true; var trigger = (LogonTrigger)task.Triggers.Add(new LogonTrigger()); trigger.Enabled = true; trigger.UserId = userId; task.Actions.Add(new ExecAction(executableFilePath, arguments: null, workingDirectory: m_installDirectoryPath)); if (!IsAdministrator()) { var message = "Cannot register task with your current identity's permissions level."; m_logger.Error(message); } m_service.RootFolder.RegisterTaskDefinition(taskName, task, TaskCreation.Create, userId, password: null, logonType: TaskLogonType.InteractiveToken); }
ОБНОВЛЕНИЕ 3: Возможно вышеупомянутое утверждение было неправильно, по умолчанию в TaskSchedulerбиблиотеке, кажется, 3 дня или 72 часа.
// // Summary: // Gets or sets the amount of time that is allowed to complete the task. By default, // a task will be stopped 72 hours after it starts to run. // // Remarks: // If a task is started on demand, the ExecutionTimeLimit setting is bypassed. Therefore, // a task that is started on demand will not be terminated if it exceeds the ExecutionTimeLimit. [DefaultValue(typeof(TimeSpan), "3")] public TimeSpan ExecutionTimeLimit { get; set; }
ОБНОВЛЕНИЕ 4: Единственное, что мы наблюдаем, это тихий выход из процесса после того, как процесс запущен гораздо дольше, чем 3 дня, например, 30 дней, поэтому не уверен, что это так.
ОБНОВЛЕНИЕ 5: Более 3 дней не было правильно соблюдено, поэтому после всего, что теперь стало ясно, это было связано с неправильными настройками для задачи планировщика задач. Неправильные настройки показаны ниже:
Правильные настройки:
в stackoverflow существует аналогичная проблема, но это больше похоже на проблему с окнами https://stackoverflow.com/questions/16992011/why-is-svchost-exe-terminating-my-c-sharp-application
nietras 6 лет назад
0
Примечание. Код завершения 1067 [означает] (https://docs.microsoft.com/en-us/windows/desktop/debug/system-error-codes--1000-1299-) «ERROR_PROCESS_ABORTED - процесс неожиданно завершился». Не очень полезно и ничего не говорит.
harrymc 6 лет назад
0
Примечание 2: Может быть полезно разделить связанные службы на svchost, как описано [здесь] (https://superuser.com/a/1192108/8672).
harrymc 6 лет назад
0
@harrymc замечание 2: Да, мы уже сделали это, ожидая следующего события, но хорошее предложение.
nietras 6 лет назад
0
@harrymc замечание: да, это все, что мы могли найти и на 1067. Хотелось бы, чтобы это могло что-то указывать ...
nietras 6 лет назад
0
Примечание 3: Вы можете увидеть всех поставщиков событий UBPM, используя Performance Monitor> Наборы сборщиков данных> Сеансы трассировки событий, дважды щелкните UBPM, перейдите на вкладку Trace Providers. Изучение списка может дать вам представление о событии, от которого зависит ваша программа, или о возможном конфликте. Я подозреваю, что трассировка стека, которую вы получили, является просто обработкой события завершения вашей программы, поэтому не имеет особого значения или информации.
harrymc 6 лет назад
0
Вопрос: У вас есть исходники программы и вы можете запустить ее в отладчике?
harrymc 6 лет назад
0
Этот процесс запущен запланированной задачей?
apocalysque 6 лет назад
0
Попытка добавить дополнительную информацию к вопросу выше при обновлении 1. И да, это запускается при запуске Windows с задачей. Идеи? @apocalysque
nietras 6 лет назад
0
Можете ли вы опубликовать скриншоты запланированного задания?
apocalysque 6 лет назад
0
@apocalysque Я приложил код, показывающий, как мы настраиваем планировщик задач, ExecutionTimeLimit должен быть Nothing и, следовательно, бесконечным.
nietras 6 лет назад
0
@apocalysque на самом деле это может быть неправильно, учитывая, что пакет nuget, по-видимому, имеет значение по умолчанию 72 часа! Так что на самом деле мы можем быть к чему-то!
nietras 6 лет назад
0
увидеть обновления в вопросе.
nietras 6 лет назад
0
Можете ли вы протестировать запуск приложения без участия диспетчера задач, чтобы выяснить, будет ли оно по-прежнему зависать?
apocalysque 6 лет назад
0
2 ответа на вопрос
0
harrymc
Я думаю, что информация, которую вы предоставляете в своем посте, основана на фактах.
Например, код завершения 1067 означает «ERROR_PROCESS_ABORTED - процесс неожиданно завершен».
С другой стороны, трассировка стека, которую вы дали, по моему мнению, является просто обработкой события завершения вашей программы, то есть потока, который сделал автоматическое создание отчетов, поэтому не имеет никакой информации для добавления.
Я думаю, что мы узнаем больше, если проблема повторится после разделения связанных служб на svchost, как описано здесь . Но, опять же, проектирование svchost как причины может вводить в заблуждение.
По моему опыту, самый простой и надежный способ найти проблему, требующий полного контроля над источниками продукта, - это скомпилировать продукт для отладки и запустить его в отладчике, установив точки останова на всех процедурах завершения работы системы. Для C это _exitи есть _abort, но могут быть и другие.
Если программа останавливается в отладчике, вы сможете понять, почему, изучив стек вызовов и глобальные / локальные переменные.
Если вы не можете использовать отладчик, нам потребуется гораздо больше данных о программе, чтобы иметь возможность высказать свое мнение.
РЕДАКТИРОВАТЬ
Даже компилируя для производства, вы по крайней мере можете создать файл символов, который может помочь в отладке и анализе.
Вы должны изучить Event Viewer - если программа дает сбой, то там может быть некоторая информация, а также в файлах дампа пользовательского режима .
Для лучшего анализа сбоев вы можете настроить параметры пользовательских дампов в Панели управления> Система> Дополнительные параметры системы> вкладка «Дополнительно»> «Запуск и восстановление»> «Настройки»> «Запись отладочной информации», установите для нее «Полный дамп памяти» и нажмите «ОК».
Вы можете использовать эти дампы вместе с файлом символов в отладчике. Вы можете сделать это на другом компьютере, обычно там, где вы скомпилировали исполняемый файл, но есть некоторые ошибки, если вы используете Visual Studio:
Файл дампа и символов должен быть сгенерирован одной и той же исполняемой версией
Дамп должен быть расположен при анализе в той же папке, что и при создании ( C:\some-path\и т. Д.)
см. обновленный вопрос для получения дополнительной информации, дайте мне знать, если есть еще вопросы.
nietras 6 лет назад
0
Добавлена дополнительная информация. И на каком языке написан этот исполняемый файл?
harrymc 6 лет назад
0
Мы наблюдали за просмотром событий, возможными журналами и т. Д. Исключений нет, я также упоминал об этом в другом месте. Процесс завершается без каких-либо исключений или причин.
nietras 6 лет назад
0
C # не то, что имеет значение, я думаю. .NET 4.6.
nietras 6 лет назад
0
Просто чтобы узнать, используете ли вы Visual Studio, но я все равно добавил эту часть.
harrymc 6 лет назад
0
0
apocalysque
Это просто теория, но, может быть, поскольку она запущена с запланированной задачей, то каким-то образом планировщик задач все еще имеет «родительский» контроль над процессом после его запуска? Мне может показаться, что может быть какое-то условие, которое достигнуто или проблема, когда планировщик задач Windows останавливает задачу. Возможно, вам следует попробовать запустить его с помощью команды запуска, чтобы приложение запускалось, но «запланированное задание» было разрешено завершить, и поэтому управление приложением освобождается из планировщика задач Windows.
EG C: \ Windows \ System32 \ cmd.exe / c запускает «заголовок» C: \ Windows \ System32 \ notepad.exe
(или любая другая программа, которую вы запускаете)
Вы должны запустить cmd.exe, потому что команда запуска является встроенной. Кроме того, если вы прочитаете документацию для команды запуска, вы заметите, что аргумент title является обязательным. Вы можете оставить его как «Заголовок» или установить на то, что вы хотите.
Not sure why the down vote. That's how the task scheduler works. Try creating a task with no triggers that runs notepad.exe and start it manually. As long as the notepad.exe process is open the task will be seen as "running". By default, the task scheduler is configured to automatically close tasks that run longer than 3 days. Even if it's not that setting there may be some other condition that's met or a problem with the task scheduler that's closing the app. Once you end that notepad.exe process the task will revert to ready status.
apocalysque 6 лет назад
0
The intention is that answers be definitive solutions. It's great to have a theory. After you test it out and verify that it works, that would be the appropriate time to post it as an answer. [From review](https://superuser.com/review/low-quality-posts/789523).
fixer1234 6 лет назад
0
It's only a theory because I don't have enough information to be able to tell what application this guy is running, let alone what that error would mean for the application. Obviously the guy doesn't want to say so I didn't ask. This is as good as it gets with the limited information provided. But since his logs specifically state that it's being terminated by the same process that's running the task scheduler I'd say that's a pretty strong correlation. The only way I can give this guy a definitive answer would be to sit at the box and debug it myself. I have tested the theory BTW.
apocalysque 6 лет назад
0
@apocalysque Я снова создам награду, когда мы выясним точную причину проблемы, однако это может занять некоторое время, но если это произошло из-за планировщика задач, я, конечно, дам тебе награду.
nietras 6 лет назад
0
@apocalysque, к сожалению, у меня недостаточно очков, чтобы снова создать награду, хотя эти очки вернутся назад. В любом случае, вы были правы, это было неправильно. Настройки планировщика заданий см. В обновлении вопроса.
nietras 6 лет назад
0