2012-04-16 9 views
7

Ho sempre lavorato sul mio software C++ & Java (costruire con Microsoft Visual Studio 2008 & Eclipse), e ho cercato per spostarlo da un sistema a 32 bit a uno a 64 bit.C++ su MS Visual Studio: "Windows ha innescato un punto di interruzione in javaw.exe"

La fase di compilazione è bene, ma durante l'esecuzione ottengo un errore che dice:.

"Windows ha innescato un punto di interruzione in javaw.exe Ciò può essere dovuto a corruzione del mucchio, che indica un errore in javaw.exe o in uno qualsiasi delle DLL caricate- Ciò potrebbe anche essere dovuto all'utente che preme F12 mentre javaw.exe è attivo. La finestra di output potrebbe contenere ulteriori informazioni diagnostiche [BREAK] [CONTINUA ] [IGNORE] "

Potete vedere un'istantanea dell'errore qui:

enter image description here

Hai idea di cosa significa questo errore? Che cosa significa "corruzione dell'heap"? Hai mai avuto esperienze con questo tipo di errore?

Grazie mille!

+0

Questa eccezione può verificarsi anche semplicemente allocando N slot di dati (di qualsiasi tipo) e utilizzando effettivamente slot M> N. Tutto viene compilato, ma genera un errore quando viene eseguito. Avner – user2715960

risposta

5

Questo purtroppo di solito significa un danneggiamento della memoria. Alcuni raddoppio della memoria, funzione che dovrebbe tornare, ma non ha o nessun altro tipo di comportamento indefinito.

La soluzione migliore per risolvere questo problema, a meno che non si abbia un indizio su dove si trova questo danneggiamento, è utilizzare uno strumento di analisi della memoria.

+1

Potrebbe anche tentare la sorte con Application Verifier –

0

In genere questo tipo di errore si verifica quando si tenta di accedere alla memoria non allocata. Controlla tutte le tue allocazioni (e liberando), in particolare il puntatore al puntatore, e il codice che può accedere alla memoria allocata dinamicamente. Nel tuo caso la dimensione dei puntatori è a 64 bit di 32 bit, che dovrebbe essere la causa principale.

+1

Penso che accedere alla memoria che non possiedi sarebbe piuttosto interrompere il runtime con un'eccezione di violazione di accesso. –

+0

Il processo può benissimo possedere la memoria come parte non allocata di un heap, credo che sia quello che intendeva. –

12

È una funzionalità molto interessante dell'heap allocator di Windows, disponibile da Vista. Ti dice che il tuo codice ha un bug puntatore. Bene, speriamo che sia il tuo codice e non la JVM che ha il bug :) Faresti meglio a pensare che sia il tuo codice.

La causa effettiva varia da lieve a moderata, come provare a liberare memoria che era già stata liberata o allocata da un altro heap (non raro quando si interop da un altro programma), a drasticamente brutta, come aver fatto saltare in aria l'heap in precedenza traboccare un buffer allocato all'heap.

La diagnostica non è abbastanza dettagliata per dirti esattamente cosa è andato storto, solo che c'è qualcosa che non va. Di solito lo insegui con un'attenta revisione del codice e disabilita artificialmente blocchi di codice finché l'errore non scompare. Queste sono le gioie della gestione esplicita della memoria. Se la versione a 32 bit è pulita (controllarla), questa può essere associata al codice a 64 bit a causa delle ipotesi sulla dimensione del puntatore. Un puntatore a 64 bit non si adatta a int o long, quindi verrà troncato. E l'utilizzo del valore del puntatore troncato sta per attivare questa affermazione. Questo è il tipo di problema felice, troverai il codice del problema nella finestra Stack chiamate.

4

Ho capito! Grazie a tutti voi, ho capito che era un problema di memoria, e forse di malloc() In realtà, ho letto here:

La benna-dimensionamento fattore deve essere un multiplo di 8 per 32-bit implementazioni e un multiplo di 16 per implementazioni a 64 bit al fine di garantire che gli indirizzi restituiti dalle funzioni del sottosistema malloc siano allineati correttamente per tutti i tipi di dati.

IBM.com:

Così, ho cambiato il dimensionamento malloc() nel punto problema. Sono andato da:

(int **) malloc (const * sizeof (int))

a:

(int **) malloc (const * sizeof (int64_t))

E ora funziona!

Grazie mille!

+7

Nessuno dei tuoi costrutti è corretto. La forma generale per invocare malloc è '(T *) malloc (count * sizeof (T))'. Nel tuo caso specifico, la forma corretta è '(int **) malloc (count * sizeof (int *))'. –