2015-05-23 8 views
7

Utilizzo Windows 8.1 a 64 bit con Visual Studio 2013 Ultimate. Sto facendo il porting di un programma da Linux a Windows che usa C++, OpenGL e SDL. Ho le librerie appropriate personalizzate compilate tramite cmake su 64-bit su Windows. Quando eseguo il programma da Visual Studio, l'IDE dice che c'è una corruzione alla testa. Questa non è una sorpresa dal momento che sto usando i puntatori per istanziare gli oggetti, e sto usando dei puntatori grezzi che ho intenzione di modificare in puntatori intelligenti per il gusto dell'argomento. Farò la magia boost più tardi.Come diagnosticare gli errori di danneggiamento dell'heap su Windows?

Nel frattempo, ho usato il mio computer Linux per diagnosticare eventuali perdite di memoria attraverso Valgrind e non c'era nulla di grave segnalato da Valgrind. Ho quindi proceduto all'utilizzo di CppCheck, ma non c'era nulla di serio neanche lì. Forse sono troppo indulgente qui e Windows potrebbe effettivamente prendere le cose meno serie più seria di Linux, il che è una sorpresa dal momento che MSVC tende ad essere più indulgente di GCC.

Quindi, il programma funziona su Linux e non su Windows. (Semplicemente fantastico!) E Visual Studio non sta aiutando lanciando eccezioni ovunque, il che mi fa odiare ancora di più Windows. Ho iniziato a cercare su Google una soluzione e mi sono imbattuto in questa cosa chiamata gflags o page helper, quindi ho installato gli strumenti di debug e ho provato a lanciare gflags ma non ho idea di come usarlo! In seguito ho scoperto che dovevi usare qualche altro strumento chiamato adp e quindi collegare gflags ad esso, così quando ho lanciato adp si blocca. Così ora non ho idea di cosa fare e sono sul punto di abortire la porta (che è divertente dato che molte persone si lamentano di quanto sia difficile portare i programmi da Windows a Linux mentre è vero il contrario).

Quindi, ora mi appello a questa community per assistenza: come faccio a eseguire il debug/diagnosticare errori di danneggiamento dell'heap che si verificano su Windows ma non su Linux? Dovrei davvero usare gflags o dovrei semplicemente usare il mio coraggio su questo?

+1

VS ha un rilevatore di perdite di memoria intrinseca: https://msdn.microsoft.com/en-us/library/x98tx3cf(v=vs.120).aspx –

+0

Hai utilizzato un debugger? Potresti anche provare i clang sanatizers su linux. Forse trovano qualcosa che valgrind e cpp check non hanno fatto. – MikeMB

+0

Scusa se non ho risposto da un po '. Ho ancora questo problema, ma sembra provenire da un file .dll esterno. Non sono sicuro che sia un problema da parte mia o meno, basti dire che gli errori 0xFF della violazione di accesso sono fastidiosi! – Poriferous

risposta

6

Utilizzare l'heap di debug e richiamarlo all'inizio in main().

_CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF);

sarà rallentare il programma molto ma dovrebbe rompere non appena si verifica la corruzione.

riferimento a questo articolo per i dettagli: soluzione https://msdn.microsoft.com/en-us/library/974tc9t1.aspx#BKMK_Check_for_heap_integrity_and_memory_leaks

+0

Grazie per la risposta. Non mi sono mai imbattuto in questa funzione di debug, quindi sarà interessante. Grandi cose! – Poriferous

1

L'@ di Carlos è perfetto per i problemi più piccoli. Ma per problemi enormi, il rallentamento che ne deriva è a volte qualcosa che non puoi sopportare.

In questo caso, si può mettere

ASSERT(_CrtCheckMemory()); 

qualche parte nel codice, in cui si sospetta il problema già essere presente. Questo comando controlla l'heap in (e solo in) il punto in cui è inserito e non dopo ogni chiamata new o delete come nel caso di _CRTDBG_CHECK_ALWAYS_DF. Ciò mantiene il tempo di esecuzione ragionevole, rispetto all'opzione _CRTDBG_CHECK_ALWAYS_DF.

Si può trovare la linea di codice problematica abbastanza rapidamente utilizzando un tipo di approccio di ricerca binaria per posizionare gli asseriti.