Ho aggiunto una funzione di mini-core-dump (tramite __try/__ except e MiniDumpWriteDump()) alla build di Windows della mia applicazione Qt, in modo che se/quando la mia applicazione si arresta mai, verrà scritto un file .dmp su disco per me per guardare e fare il debug con in seguito.Qual è il modo migliore per bloccare intenzionalmente la mia applicazione Windows?
Questo funziona abbastanza bene, ma per i test mi piacerebbe avere un metodo affidabile per rendere il mio programma in crash. Ad esempio, potrebbe esserci un pulsante "crash now" nella GUI e quando l'utente fa clic, causerà l'arresto intenzionale dell'applicazione.
Un modo per farlo, naturalmente, è come questo:
int * badPointer = NULL;
*badPointer = 666;
E che funziona per me, ma non mi piace questo approccio perché si basa su un comportamento indefinito - in particolare, la Lo standard C++ non richiede il codice sopra riportato per causare un arresto anomalo, quindi è possibile (da un punto di vista del giurista) che alcune versioni future del compilatore non si blocchino quando viene eseguito il codice precedente.
Come un approccio più "ufficiale", ho provato questo:
abort();
... che non termina il programma, ma non causa l'eccezione strutturata di Windows che fa scattare il gestore MiniCrashDump, in modo che nessun il file .dmp viene scritto.
La mia domanda è, esiste un "modo giusto ufficiale" per bloccare il programma? Vedo che l'API di Windows ha una funzione RaiseException() che potrei chiamare, ma non sono sicuro di quali dovrebbero essere gli argomenti appropriati. È questa la strada da percorrere, o c'è qualche chiamata più specifica che sarebbe meglio usare?
Martello attraverso lo schermo. –
Stai utilizzando parole chiave e comportamenti molto specifici per l'implementazione e sei preoccupato che cosa potrebbe dire una specifica C++ un giorno? Certo, RaiseException() è la via ufficiale. –
@HansPassant Non è la specifica C++ che mi preoccupa tanto quanto l'ottimizzatore MSVC, che potrebbe iniziare a fare trucchi mentali in stile gcc come dire "poiché so che malePointer è NULL, e dal momento che il dereferenziamento di un puntatore NULL è un comportamento indefinito, posso ottimizza quello che scrivi "... e poi improvvisamente il mio pulsante di arresto non si arresta più. :) –