Ho un problema durante il quale durante la chiamata a una libreria di terze parti il mio processo termina. Non riesco assolutamente a capirlo nel mio debugger. Questo potrebbe essere correlato a questa domanda: How can I debug a win32 process that unexpectedly terminates silently?.Come è possibile determinare il motivo per cui il mio processo termina
Quando passo a una chiamata in questa libreria, il processo in fase di debug termina semplicemente. Se questa chiusura era dovuta a un'eccezione non gestita o violazione di accesso alla memoria, il debugger l'avrebbe catturato. Quindi la mia ipotesi migliore è che il processo in qualche modo termini normalmente.
quello che ho provato:
- Impostazione punti di interruzione su
ExitThread
eExitProcess
- Impostazione gestori per eccezioni non gestite e paramters non validi (
set_terminate
e_set_invalid_parameter_handler
) - Modifica
_set_abort_behavior
e_set_error_mode
. - Istruire il debugger per interrompere l'esecuzione su tutte le eccezioni generate.
Ma inutilmente, nessuno dei gestori viene chiamato e nessuno dei punti di interruzione viene attivato.
quello che ho osservato: Quando si blocca il processo, vedo due cose nella finestra di output di debug:
Non correlate (vedere Update sotto)
vedoEEFileLoadException
che sono gettati. Un google veloce di questa eccezione non mi dà una risposta chiara a questa eccezione.First-chance exception at 0x7656b9bc (KernelBase.dll) in Program.exe: Microsoft C++ exception: EEFileLoadException at memory location 0x0030b5ac.. First-chance exception at 0x7656b9bc (KernelBase.dll) in Program.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000.. First-chance exception at 0x7656b9bc (KernelBase.dll) in Program.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000.. First-chance exception at 0x7656b9bc (KernelBase.dll) in Program.exe: 0xE0434352: 0xe0434352.
Quando termina, tutte le discussioni restituiscono lo stesso codice di errore (STATUS_INVALID_CRUNTIME_PARAMETER). Questo codice di errore indica, per quanto posso dire, che una delle funzioni di runtime c ha ricevuto un parametro non valido e l'applicazione viene chiusa per motivi di sicurezza.
The thread 'Win32 Thread' (0x12c0) has exited with code -1073740777 (0xc0000417). The thread 'Win32 Thread' (0xe04) has exited with code -1073740777 (0xc0000417). The thread 'Win32 Thread' (0x53c) has exited with code -1073740777 (0xc0000417). The thread 'Win32 Thread' (0x116c) has exited with code -1073740777 (0xc0000417). The thread 'Win32 Thread' (0x16e0) has exited with code -1073740777 (0xc0000417). The thread 'Win32 Thread' (0x1420) has exited with code -1073740777 (0xc0000417). The thread 'Win32 Thread' (0x13c4) has exited with code -1073740777 (0xc0000417). The thread 'Win32 Thread' (0x40c) has exited with code -1073740777 (0xc0000417). The thread 'Win32 Thread' (0xc78) has exited with code -1073740777 (0xc0000417). The thread 'Win32 Thread' (0xd88) has exited with code -1073740777 (0xc0000417). The thread 'Win32 Thread' (0x16c8) has exited with code -1073740777 (0xc0000417). The thread 'Win32 Thread' (0xcb8) has exited with code -1073740777 (0xc0000417). The thread 'Win32 Thread' (0x584) has exited with code -1073740777 (0xc0000417). The thread 'Win32 Thread' (0x1164) has exited with code -1073740777 (0xc0000417). The thread 'Win32 Thread' (0x1550) has exited with code -1073740777 (0xc0000417). The thread 'Win32 Thread' (0x474) has exited with code -1073740777 (0xc0000417). The program '[5140] Program.exe: Native' has exited with code -1073740777 (0xc0000417).
Quello che voglio davvero sapere è ciò che provoca questo, e facoltativamente; come posso prendere questo nel debugger?
Aggiornamento Per quanto riguarda il EEFileLoadException
, è infatti gettato prima che il programma effettua la chiamata che induce a terminare, in modo che non è legata alla terminazione del processo.
Aggiornamento Ho appena letto che set_terminate
non funziona nel debugger in modo che è fuori questione. E come notato nel mio commento, i gestori sono gestiti su una base per thread in modo da non avere accesso al gestore in questione.
Inoltre, il programma si blocca molto probabilmente in un thread di lavoro a cui non ho accesso, quindi è difficile impostare qualsiasi punto di interruzione/gestore.
C'è un modo migliore per capire cosa va storto?
mi sono reso conto che il gestore termina a non sono chiamati in quanto sono installati su una base per-thread e non ho accesso al thread crash. –
Ho una situazione simile a questa, tranne nel mio caso, i messaggi TRACE non vengono anche consegnati alla finestra di output. Quando ho collegato con WinDebug, ho scoperto che c'era una chiamata 'DebugBreak()' che VS stava ignorando, il che ha causato il processo di 'terminate()' stesso, risultando in 'Il programma [0x2F74] 'OUTLOOK.EXE' è uscito con codice -1073740777 (0xc0000417). Sfortunatamente, non riesco a capire perché Visual Studio stia ignorando il programma che si suppone stia eseguendo il debug. –