Più che altro ho postato il link dove c'è scritto quanto ho riportato.
Più che altro ho postato il link dove c'è scritto quanto ho riportato.
e per far si che qualsiasi tipo di eccezione venga gestita come posso fare?
grazie
try {
//provoca eccezioni varie;
} catch(std::exception& e) {
//eccezioni C++ standard;
} catch(unsigned long u) {
//eccezioni Win32;
}
Grazie.
Il mio problema è che vorrei intercettare anche quando si va a scrivere tramite un puntatore ad es su un area di memoria che non deve essere toccata e il programma va in crash.
E possibile in questo modo avere un indicazione di dove nel mio codice è avvenuto questo errore?
Grazie.
quando vai a scrivere su una zona di memoria protetta provochi una EXCEPTION_ACCESS_VIOLATION (codice 5)
come tutte le eccezioni, questa risale la stack fino a che trova un blocco di codice che la cattura (Structured Exception Handler oppure C++ Handler che cattura unsigned long)
se usi SEH (quindi __try { } __except() {} ) puoi recuperare indicazioni sull'indirizzo di memoria non valido tra le informazioni accessiorie dell'eccezione
GetExceptionInformation()->ExceptionRecord->ExceptionInformation è un array con due dati, uno è il puntatore e l'altro una flag che rappresenta l'accesso desiderato alla memoria (read e write + execute in alcuni processori)
se usi le eccezioni C++ l'unico dato che ti viene presentato è che è avvenuta un'eccezione di accesso violato, ma non sai né dove né come
in ogni caso l'unico modo per scoprire il punto del codice che provoca l'eccezione è usare un debugger
Se richiami la API GetExceptionInformation ravanando nella struttura che ti viene restituita puoi ottenere l'EIP (il registro che contiene l'instruction pointer), ma te ne fai poco e soprattutto ricorda che le eccezioni hardware non andrebbero mai intercettate (tranne eventualmente quelle di divisione per zero e poche altre); per ulteriori informazioni leggi qui e qui. Se proprio hai bisogno di "catturare" una divisione per zero e poche altre eccezioni SEH ti conviene usare una funzione-traduttore che le trasforma in eccezioni C++ (leggi qui).
Se invece ti serve catturare tutte le eccezioni per avere un crash report, dai un'occhiata qui.
Amaro C++, il gusto pieno dell'undefined behavior.