2015-06-23 11 views
7

La mia applicazione genera alcuni strani errori se si spegne il computer mentre è in esecuzione la mia applicazione.In che modo Windows chiude un programma quando si spegne il computer?

A volte il messaggio è (indirizzo) di memoria non può essere "letta", a volte non può essere "scrivere".

L'arresto dell'applicazione normale non genera tali messaggi.

Come è possibile simulare "l'arresto di Windows" in modo che sia possibile eseguire il debug dell'applicazione? Come posso scoprire cosa sta cercando di fare l'applicazione che non può?

+1

Se l'applicazione non risponde ai segnali di arresto e di eliminazione ed eventi, il programma verrà terminato indipendentemente da ciò che sta facendo attualmente. E se il sistema sta andando giù in entrambi i casi, è davvero importante ciò che fa con la sua memoria? Non sarà comunque salvato. –

+0

Windows invia messaggi 'WM_QUIT' quando si spegne, in modo da poter verificare cosa succede quando lo si invia alla propria app. – usr2564301

risposta

5

Quando Windows vuole arrestare, invia una serie di eventi all'applicazione; come WM_ENDSESSION e WM_QUIT. È possibile elaborare questi nel gestore di messaggi che si sta utilizzando; in generale, l'applicazione dovrà rispondere in modo appropriato e rapido a questi messaggi altrimenti il ​​sistema operativo terminerà comunque l'applicazione. Non sono sicuro di quale sia l'elaborazione predefinita che wxwidgets offre in questo senso. L'aggancio in questi potrebbe aiutare a diagnosticare l'errore dell'applicazione stessa.

Ci sono alcune cose che potresti tentare di fare;

  • La sequenza arresto non sarà facile da simulare (all'occorrenza) - molto accade durante l'arresto; lo stato e la situazione esatti sono difficili da simulare nella sua interezza.
  • In termini di diagnosi dello stato dell'applicazione appena prima dello spegnimento, è possibile provare a elaborare lo WM_QUERYENDSESSION e rispondere con un FALSE per impedirne lo spegnimento (con le versioni più recenti di Windows non è più possibile impedire l'arresto, quindi potrebbe non funzionare a seconda della piattaforma in cui ci si trova).
  • Si potrebbe anche provare a testare la risposta immediata dell'applicazione al messaggio WM_ENDSESSION inviandolo allo WM_ENDSESSION (ad esempio tramite PostMessage) con i dati appropriati come descritto in MSDN.

Per applicazioni basate su terminale; È anche possibile agganciare i segnali (SIGKILL credo) se necessario. Vedi questo Microsoft reference for more detail. È anche possibile il gancio SetConsoleCtrlHandler. Ma dal momento che si utilizza un kit di strumenti, sarebbe meglio utilizzare già i messaggi inviati all'applicazione.

+2

Simulare lo spegnimento non è così facile, in particolare perché le moderne versioni di Windows uccidono l'applicazione solo se non tornano abbastanza velocemente. Il modo migliore per testare questo è eseguire la tua applicazione all'interno di una VM e davvero spegnerla. –

+0

@VZ. Sono d'accordo, non c'è modo di "simulare" completamente l'arresto, questi sono tutti solo suggerimenti su ciò che l'OP potrebbe fare per provare a diagnosticare il problema. Lo modificherò per cercare di renderlo più chiaro. – Niall

+0

@VZ, ok, ho capito. Ma i messaggi di errore provengono dalla mia app, quando tenta di fare cose inappropriate con la memoria. Quindi, non viene ucciso dal sistema operativo in questo momento.Ha appena ricevuto il segnale dal sistema operativo per arrestare – Neka

Problemi correlati