Depuração do erro / falha do aplicativo CSRSS.EXE

0

Por um tempo, tenho recebido uma falha intermitente de SVCHOST.EXE na inicialização do Windows XP. Por ser intermitente, não posso reproduzi-lo de maneira confiável, nem posso diminuir quando foi iniciado e, como é SVCHOST , não consigo determinar qual serviço é o único que falha porque o diálogo é criado por CSRSS.EXE , não as instâncias de SVCHOST.EXE .

Uma coisa que eu sei com certeza é que se eu dispensar a caixa de diálogo abaixo que aparece quando isso acontece, todo o sistema trava completamente, mas se eu deixar o diálogo sozinho, posso continuar a trabalhar e usar o sistema operacional normalmente , no entanto, ao desligar (no momento em que o diálogo é inevitavelmente fechado), o sistema trava, resultando em uma reinicialização necessária.

Eu usei a sugestão do Anonymous Coward de configurar cada serviço para usar sua própria instância de SVCHOST em vez de uma compartilhada e descobri, para minha surpresa, que o processo de falha não era uma das SVCHOST instâncias. Foi CSRSS.EXE .

Agora, fico tentando descobrir por que CSRSS falha às vezes (a grande maioria das pesquisas que incluem nomes de arquivos apenas retornam essas páginas de análise básica sem valor), mas não sei como depurar uma parte tão integral de o sistema curto de um depurador de kernel confuso. (Eu vou apontar que o sistema não faz BSOD, então não há nenhum dump gerado).

Uma coisa não é que os endereços parecem sempre ser o mesmo. Isso aconteceu cerca de uma dúzia de vezes e a instrução incorreta está sempre em 0x76dea383 , que tenta ler a memória em 0x00000000 . Obviamente, o endereço de memória de destino é inútil, mas tenho certeza que deve haver uma maneira de usar o endereço de origem de alguma forma.

O que tentei quando isso acontece é fechar todos os processos e interromper todos os serviços possíveis. Infelizmente, isso não ajuda a diminuir a causa porque a caixa de diálogo permanece sendo exibida porque foi criada por csrss , o que não pode ser interrompido sem a necessidade de derrubar todo o sistema operacional.

Informação antiga:

Eu tentei descobrir qual serviço é responsável sem sucesso. Por exemplo, na última vez que isso aconteceu, parei todos os serviços possíveis (e alguns que normalmente não são possíveis), encerrei todos os aplicativos, acabei com o Explorer e basicamente reduzi o sistema ao mínimo (havia talvez restam 10 processos, usando ~ 111MB de RAM e 0% de CPU), mas ele ainda fica pendurado quando o diálogo é fechado. Isso me faz suspeitar que é um dos serviços críticos do sistema, embora, se fosse, por que o sistema continuaria funcionando nesse meio tempo?

Alguém de alguma maneira eu posso depurar isso? Por exemplo, alguém pode pensar em uma maneira de determinar a instância de SVCHOST associada ao erro? Eu verifiquei o Log de Eventos e o Process Explorer, mas não encontrei nada para ajudar a localizá-lo. Existe algo que eu possa fazer com o endereço de memória?

(Sim, pesquisei isso no Google e encontrei várias menções ao serviço do Windows Update, mas não é porque WUAUSVC e BITS estão desabilitadas por padrão. E não, não consigo desativar o -all-services-and-enable-one-by-one método de teste, porque se for um dos serviços críticos do sistema, o Windows não será executado em todos.)

    
por Synetech 19.12.2011 / 20:17

4 respostas

3

Parece um problema difícil de resolver. Você está basicamente listando tudo o que eu teria sugerido (parando serviços, log de eventos, Process Explorer ...). As únicas soluções adicionais que me vêm à mente seriam as mais pesadas, como a reinstalação do Windows.

No entanto, há esta resposta para uma pergunta semelhante que vincula a um Microsoft KB sobre depuração de SVCHOST falhas usando " Ferramentas de depuração para Windows ", talvez isso possa ser útil.

    
por 19.12.2011 / 20:48
2

Antes de responder à mensagem de erro, descubra o ID do processo (PID) no gerenciador de tarefas e, em seguida, em um prompt de comando, execute tasklist /svc para descobrir quais serviços estão sendo executados sob esse ID de processo (PID). Você pode ter vinte serviços rodando sob uma instância de svchost, mas você pode ter sorte e ter apenas um ou dois.

Observação: você pode ter que descobrir a ID do processo correta por eliminação, ou seja, executar o comando da lista de tarefas, responder a mensagem de erro e depois executar a lista de tarefas novamente para ver qual deles desapareceu.

    
por 19.12.2011 / 20:51
2

link

There are several ways to dump a particular service:

  1. Use Debug Diagnostic Tool (DebugDiag) 1.2.
  2. Use the following batch file:

    FOR /F "tokens=2 delims=," %%A IN ('tasklist /svc /FI "services eq winmgmt" /NH /FO csv') DO SET PID=%%~A
    adplus.exe -hang -p %PID% -o c:\dumps
    

link

To isolate these services, there are two different approaches with very subtle differences. The first method is to create an isolated process that runs within the same SVCHOST group as it did before, just not in a shared process. The second method is to create a completely separate SVCHOST group. Since we've been using Windows Updates as our example, let's continue on with that.

Method 1: Creating an Isolated Process

What this method really does is modify one of the registry parameters for the service in question from a shared process to an isolated process. The command syntax is fairly straightforward and uses the sc config command set:

sc config <service name> type=own

So for Windows Updates (wuauserv), the command would be:

sc config wuauserv type= own

Note that there is a space between the '=' and 'own' - you must insert that space. Behind the scenes, what happens is that the HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\wuauserv\Type registry value is changed from 0x20 (which denotes a shared process) to 0x10 (indicating it has its own process). You can read more about these particular values on the MSDN Article about SERVICE_STATUS_PROCESS Structure. In order to complete the change, you need to stop and restart the service. To change this service back to being a shared service, run the following command: sc config wuauserv type= share. For this change to complete, the machine itself needs to be rebooted. No other parameters are being modified with respect to this service, however when you change the type to isolated, restart the service and then run the tasklist command to get the list of services, you will notice that there is an SVCHOST.EXE process that only contains the Windows Update service.

Method 2: Creating an isolated Service Group

This method is a bit more involved, and involves directly editing the registry. Please remember to back up the registry before making any changes! The process is below:

  1. Create a new REG_MULTI_SZ value named WindowsUpdates in the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost key.

  2. Add the name of the service (in this case wuauserv) to the value. You also need to remove the wuauserv from the list in the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost\Netsvcs value to prevent conflicts.

  3. Now navigate to the HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\wuauserv key and change the ImagePath value from %systemroot%\system32\svchost.exe -k netsvcs to: %systemroot%\system32\svchost.exe -k WindowsUpdates

  4. Restart the Automatic Updates service and you should now see a new instance of SVCHOST.EXE that only contains the Automatic Updates service.

  5. This method can be repeated to isolate multiple services into their own groups.

  6. To revert back to the original configurations, reverse the steps above and restart the machine. Use the backup of the registry to ensure that you get the right services back into the proper groups.

An additional refinement to this method would be to create copies of SVCHOST.EXE that are appropriately named for the isolated service - for example copy %systemroot%\system32\svchost.exe to a new file named %systemroot%\system32\svchost_wuauserv.exe. Remember that you will need to make the appropriate modifications to the ImagePath value in the registry that reflect the name of the executable file. By customizing the executable, you can use tools such as the Debug Diagnostic Toolkit that we covered in an earlier post to monitor specific services for crashing. You can also quickly tell which services are misbehaving in Task Manager as well as getting the name of the failing executable logged in the Event Viewer in the event of that service crashing.

    
por 25.01.2012 / 12:26
1

Etapas de solução de problemas

Bem, reduzi o máximo possível (novamente, sem recorrer à depuração do kernel):

  1. Examinei o snap-in Serviços ( services.msc ) logo após uma inicialização limpa para compilar uma lista de todos os serviços que são executados durante uma inicialização normal (eu já o reduzi ao mínimo, de modo que certamente ajuda)
  2. Como Covarde Anônimo sugeriu , eu configurei cada um e cada serviço executado para executar em seu próprio processo
  3. Na próxima vez que aconteceu, executei o Process Explorer e exibi as imagens carregadas ( Properties->Threads ) em código%
    1. Fiz uma lista de tópicos e seus arquivos de imagem
    2. Jogou a pilha de cada
  4. Na próxima vez que aconteceu, observei o momento em que isso aconteceu e o que estava acontecendo naquele ponto, bem como as alterações na tela


Observações

Esta foi a lista de imagens em execução no processo CSRSS.exe da etapa 3.1:
winsrv.dll
csrsrv.dll
ati2mtag.sys

Na etapa 4, percebi que, assim que a caixa de diálogo de erro apareceu, alguns ícones da bandeja desapareceram, especificamente, o ícone da ATI Tray Tools indicando a temperatura da minha placa de vídeo.


Resultados

E aí está!

No momento em que a caixa de diálogo de erro aparece, o ATI Tray Tools trava e desaparece. (Como é que eu não percebi isso antes? Especialmente desde que eu costumo usar as teclas de atalho para ajustar o brilho da tela.) Isso anda de mãos dadas com o fato de que CSRSS aparece na lista de threads no processo ofensivo, bem como uma entrada de registro do sistema regular e repetida informando que ATI2MTAG


Resumo / Solução

Se mais alguém tiver um problema semelhante e encontrar o caminho até aqui , o problema é com o Driver de vídeo ATI. Se você não puder atualizar o hardware, talvez a atualização do service pack mais recente para o Windows possa corrigi-lo . (Agora, só preciso definir todos os serviços apropriados de volta ao modo de processo compartilhado - onde está o backup \SystemRoot\System32\ativvaxx.dll failed to load. file…)     
por 22.02.2012 / 03:22