Debug CSRSS.EXE Errore / Arresto dell'applicazione


0

Per un po 'di tempo, ho avuto un arresto intermittente SVCHOST.EXEall'avvio in Windows XP. Poiché è intermittente, non riesco a riprodurlo in modo affidabile, né posso restringere quando è stato avviato e, poiché lo è SVCHOST, non riesco a determinare quale servizio è quello che si arresta in modo anomalo perché la finestra di dialogo è stata creata CSRSS.EXE, non una delle istanze di SVCHOST.EXE.

Una cosa che so per certo è che se chiudo la finestra di dialogo sottostante che viene visualizzata quando si verifica, l'intero sistema si blocca completamente, ma se lascio la finestra di dialogo da sola, posso continuare a lavorare e utilizzare il sistema operativo normalmente, tuttavia su chiudendo (a quel punto la finestra di dialogo viene inevitabilmente chiusa), il sistema si blocca, con conseguente ripristino necessario.

Ho usato il suggerimento di Anonymous Coward di impostare ciascun servizio in modo da utilizzare la propria istanza SVCHOSTanziché una condivisa e ho scoperto con mia sorpresa che il processo di arresto anomalo non era una delle SVCHOSTistanze. Lo è stato CSRSS.EXE.

Ora sono rimasto a cercare di capire perché a CSRSSvolte gli arresti anomali (la stragrande maggioranza delle ricerche che includono nomi di file restituiscono solo quelle pagine di analisi di base senza valore), ma non sono sicuro di come eseguire il debug di una parte così integrale del sistema a corto di un disordine debugger del kernel. (Sottolineerò che il sistema non utilizza BSOD, quindi non viene generato alcun dump.)

Una cosa di no è che gli indirizzi sembrano essere sempre gli stessi. È successo circa una dozzina di volte e l'istruzione offensiva è sempre 0x76dea383quella che cerca di leggere la memoria 0x00000000. Ovviamente l'indirizzo di memoria di destinazione è inutile, ma sono sicuro che ci deve essere un modo per utilizzare l'indirizzo di origine in qualche modo.

Quello che ho provato in questo caso è chiudere ogni processo e interrompere ogni servizio possibile. Sfortunatamente, ciò non aiuta a restringere la causa perché la finestra di dialogo rimane visualizzata perché è stata creata dalla csrssquale non può essere arrestata senza rimuovere completamente l'intero sistema operativo.


Informazioni obsolete:

Ho provato a capire quale servizio è responsabile senza successo. Ad esempio, l'ultima volta che è successo, ho fermato ogni singolo servizio che era possibile (e alcuni che non sono normalmente possibili), ho chiuso ogni singola app, ho ucciso Explorer e praticamente ridotto il sistema al minimo indispensabile (c'erano forse sono rimasti 10 processi, usando ~ 111 MB di RAM e CPU allo 0%), ma è rimasto bloccato una volta chiusa la finestra di dialogo. Questo mi fa sospettare che si tratti di uno dei servizi di sistema critici, anche se in tal caso, perché il sistema dovrebbe continuare a funzionare nel frattempo?

Qualcuno può debug questo? Ad esempio, qualcuno può pensare a un modo per determinare l'istanza SVCHOSTassociata all'errore? Ho controllato il registro eventi e Process Explorer ma non sono riuscito a trovare nulla per aiutarlo a individuarlo. C'è qualcosa che posso fare con l'indirizzo di memoria?

(Sì, ho cercato su Google e ho trovato numerose menzioni del servizio Windows Update, ma non è perché WUAUSVCe BITSsono disabilitate per impostazione predefinita. E no, non posso fare il servizio di disabilitazione di tutti i servizi e abilita uno -un metodo di test perché se si tratta di uno dei servizi di sistema critici, Windows non funzionerà affatto.)

inserisci qui la descrizione dell'immagine

Risposte:


3

Sembra un problema difficile da risolvere. Stai praticamente elencando tutto ciò che avrei suggerito (arresto dei servizi, registro eventi, Process Explorer ...). Le uniche soluzioni aggiuntive che mi vengono in mente sarebbero quelle pesanti come la reinstallazione di Windows.

Tuttavia, esiste una risposta a una domanda simile che si collega a un Microsoft KB sul debug degli SVCHOSTarresti anomali utilizzando "Strumenti di debug per Windows" , forse questo potrebbe essere utile.


Grazie, ma per prima cosa è necessario determinare quale servizio si sta arrestando in modo anomalo, che è esattamente il problema che sto cercando di risolvere.
Synetech,

2

Prima di rispondere al messaggio di errore, individuare l'ID processo (PID) nel task manager, quindi, al prompt dei comandi, eseguire tasklist /svcper scoprire quali servizi sono in esecuzione con quell'ID processo (PID). Potresti avere venti servizi in esecuzione in un'istanza svchost, ma potresti essere fortunato e avere solo uno o due.

Nota: potrebbe essere necessario individuare l'ID processo corretto mediante eliminazione, ad esempio eseguire il comando dell'elenco attività, rispondere al messaggio di errore e quindi eseguire nuovamente l'elenco attività per vedere quale è scomparso.


So già come fare tutto ciò (ecco perché ho usato ProcExp), il problema è che non c'è modo di scoprire quale PID è associato alla finestra di dialogo perché la finestra di dialogo viene lanciata CSRSS.EXE, non SVCHOST.EXE. Inoltre, come ho detto, non appena la finestra di dialogo viene chiusa, l'intero sistema si blocca completamente e in modo completo, quindi non c'è modo di ricontrollare nulla.
Synetech,

2

http://blogs.msdn.com/b/asiatech/archive/2011/08/29/a-useful-tool-to-generate-dump-file-for-a-particular-service.aspx

Esistono diversi modi per scaricare un determinato servizio:

  1. Utilizzare lo strumento diagnostico di debug (DebugDiag) 1.2.
  2. Utilizzare il seguente file batch:

    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
    

http://blogs.technet.com/b/askperf/archive/2008/01/11/getting-started-with-svchost-exe-troubleshooting.aspx

Per isolare questi servizi, esistono due approcci diversi con differenze molto sottili. Il primo metodo consiste nel creare un processo isolato che viene eseguito all'interno dello stesso gruppo SVCHOST di prima, ma non in un processo condiviso. Il secondo metodo consiste nel creare un gruppo SVCHOST completamente separato. Dato che abbiamo usato gli aggiornamenti di Windows come esempio, continuiamo con quello.

Metodo 1: creazione di un processo isolato

Ciò che fa realmente questo metodo è modificare uno dei parametri di registro per il servizio in questione da un processo condiviso a un processo isolato. La sintassi del comando è abbastanza semplice e utilizza il set di comandi sc config:

sc config <service name> type=own

Quindi, per gli aggiornamenti di Windows (wuauserv), il comando sarebbe:

sc config wuauserv type= own

Nota che c'è uno spazio tra '=' e 'proprio' - devi inserire quello spazio. Dietro le quinte, ciò che accade è che il HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\wuauserv\Type valore del registro viene modificato da 0x20(che indica un processo condiviso) in0x10(indicando che ha il suo processo). Puoi leggere ulteriori informazioni su questi valori particolari nell'articolo MSDN sulla struttura SERVICE_STATUS_PROCESS. Per completare la modifica, è necessario arrestare e riavviare il servizio. Per riportare questo servizio in un servizio condiviso, eseguire il comando seguente: sc config wuauserv type = share. Per completare questa modifica, è necessario riavviare la macchina stessa. Nessun altro parametro viene modificato rispetto a questo servizio, tuttavia quando si cambia il tipo in isolato, si riavvia il servizio e quindi si esegue il comando tasklist per ottenere l'elenco dei servizi, si noterà che esiste un processo SVCHOST.EXE che solo contiene il servizio di Windows Update.

Metodo 2: creazione di un gruppo di servizi isolato

Questo metodo è un po 'più coinvolto e comporta la modifica diretta del registro. Ricordarsi di eseguire il backup del registro prima di apportare modifiche! Il processo è di seguito:

  1. Creare un nuovo valore REG_MULTI_SZ denominato WindowsUpdates nella HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchostchiave.

  2. Aggiungi il nome del servizio (in questo caso wuauserv) al valore. È inoltre necessario rimuovere wuauserv dall'elenco nel HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost\Netsvcsvalore per evitare conflitti.

  3. Ora vai alla HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\wuauservchiave e modifica il valore di ImagePath da %systemroot%\system32\svchost.exe -k netsvcsa:%systemroot%\system32\svchost.exe -k WindowsUpdates

  4. Riavviare il servizio Aggiornamenti automatici e ora dovresti vedere una nuova istanza di SVCHOST.EXE che contiene solo il servizio Aggiornamenti automatici.

  5. Questo metodo può essere ripetuto per isolare più servizi nei propri gruppi.

  6. Per ripristinare le configurazioni originali, invertire i passaggi precedenti e riavviare la macchina. Utilizzare il backup del registro per assicurarsi di ottenere i servizi giusti nei gruppi appropriati.

Un ulteriore perfezionamento di questo metodo sarebbe la creazione di copie di SVCHOST.EXE che sono denominate in modo appropriato per il servizio isolato, ad esempio copia %systemroot%\system32\svchost.exein un nuovo file denominato %systemroot%\system32\svchost_wuauserv.exe. Ricordare che sarà necessario apportare le modifiche appropriate al valore di ImagePath nel registro che riflettono il nome del file eseguibile. Personalizzando l'eseguibile, è possibile utilizzare strumenti come Debug Diagnostic Toolkit che abbiamo trattato in un post precedente per monitorare servizi specifici per crash. È inoltre possibile sapere rapidamente quali servizi si comportano in modo errato in Task Manager e ottenere il nome dell'eseguibile in errore registrato nel Visualizzatore eventi in caso di arresto del servizio.


In realtà, avevo considerato entrambi questi metodi. Sono certamente utili, ma il problema è che ci sono una dozzina di servizi che usano SVCHOSTe il problema è intermittente. D'altra parte, suppongo che se imposto ogni servizio sulla propria istanza, quindi eventualmente se / quando accade, sarebbe facile determinare quale sia il colpevole. Probabilmente significherebbe eseguire ciascuno in un'istanza separata per innumerevoli stivali, ma potrebbe essere il più semplice. +1 per ora e accettato ogni volta che funziona.
Synetech,

Bene, questo ha sicuramente aiutato un po '. Mi ha aiutato a restringere il problema al processo che sta causando il problema. Sfortunatamente, non è uno dei SVCHOSTcasi, lo è CSRSS. :-|
Synetech,

1

Passaggi di Troublshooting

Bene, l'ho ridotto il più possibile (di nuovo, senza ricorrere al debug del kernel):

  1. Ho esaminato lo snap-in Servizi ( services.msc) subito dopo un avvio pulito per compilare un elenco di tutti i servizi eseguiti durante un avvio normale (l'ho già ridotto al minimo, quindi sicuramente aiuta)
  2. Come ha suggerito Anonymous Coward , ho configurato ogni singolo servizio che viene eseguito per l' esecuzione nel proprio processo
  3. La prossima volta che è successo, ho eseguito Process Explorer e ho visualizzato le immagini caricate ( Properties->Threads) inCSRSS.exe
    1. Crea un elenco di thread e i loro file di immagine
    2. Dump della pila di ciascuno
  4. La prossima volta che è successo, ho osservato il momento in cui si verificava e ciò che stava funzionando in quel punto, nonché i cambiamenti sullo schermo


osservazioni

Questo era l'elenco delle immagini in esecuzione nel CSRSSprocesso dal passaggio 3.1:

winsrv.dll
csrsrv.dll
ati2mtag.sys

Nel passaggio 4, ho notato che proprio quando è stata visualizzata la finestra di dialogo di errore, alcune icone della barra sono scomparse, in particolare l'icona di ATI Tray Tools che indica la temperatura della mia scheda video.


risultati

Ed eccolo qui!

Nel momento in cui viene visualizzata la finestra di dialogo di errore, ATI Tray Tools si arresta in modo anomalo e scompare. (Come ho fatto a non notato prima? Soprattutto perché io uso spesso i tasti di scelta rapida per regolare la luminosità dello schermo). Questo va di pari passo con il fatto che ATI2MTAGappare nella lista di thread nel processo di offendere, nonché un regolare e ripetendo la voce del registro di sistema che lo indica\SystemRoot\System32\ativvaxx.dll failed to load.


Sintesi / Soluzione

Se qualcun altro ha un problema simile e trova la sua strada qui , il problema è con il driver video ATI. Se non è possibile aggiornare l'hardware, forse l' aggiornamento all'ultimo service pack per Windows può risolverlo. (Ora, devo solo riportare tutti i servizi appropriati in modalità di processo condivisa, dov'è quel .REGfile di backup ...)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.