Eccezione non gestita in 0x00007FFE5AC8F459 (ntdll.dll)

di il
9 risposte

Eccezione non gestita in 0x00007FFE5AC8F459 (ntdll.dll)

Salve,

ho un progetto che sto compilando ed eseguendo su 2 pc diversi. Sul primo funziona correttamente, mentre sull'altro compila ma quando eseguo dal prompt dei comandi mi dà il seguente problema:

Eccezione non gestita in 0x00007FFE5AC8F459 (ntdll.dll) in mio_progetto.exe: 0xC0000374: Heap danneggiato (parametri: 0x00007FFE5ACF97F0).

Inutile dire che utilizzo gli stessi identici dati per entrambi i pc e che ho provato varie volte a disinstallare e reinstallare visual studio. Avete idea di cosa possa essere la causa?

9 Risposte

  • Re: Eccezione non gestita in 0x00007FFE5AC8F459 (ntdll.dll)

    Purtroppo potrebbe essere un malfunzionamento che nel primo PC - per varie ragioni - non viene rilevato.

    La corruzione della memoria (in seguito a gestione non corretta di allocazione/deallocazione memoria, gestione puntatori, passaggio non corretto di parametri …) è una brutta bestia e può essere che, in determinate situazioni venga rilevata e in altre no. Tuttavia il problema nel codice esiste.

    Altra storia potrebbe essere la presenza di virus/malware che interferisce con il funzionamento del PC in questione ma è tutto da dimostrare.

    Per cercare di avvicinarti ad una soluzione, usa un po' di file di log per capire in quale parte del codice si manifesta il problema e in quale situazione (cerca di individuare la linea specifica).

    E comunque mostra il codice in questione altrimenti non è proprio possibile dirti nulla.

  • Re: Eccezione non gestita in 0x00007FFE5AC8F459 (ntdll.dll)

    Ho trovato che alcune variabili che avevo definito ed allocato non venivano utilizzate per cui dopo averle rimosse il problema si è risolto. Strano però che nell'altro pc non segnalava errori. Grazie!

  • Re: Eccezione non gestita in 0x00007FFE5AC8F459 (ntdll.dll)

    Meglio che hai risolto ma la prossima volta posta direttamente il codice.

    Non è strano che non si manifesti in tutti i PC come ti ho detto prima, dipende dallo stato di allocazione della memoria in quel momento ed è un fattore imprevedibile 

  • Re: Eccezione non gestita in 0x00007FFE5AC8F459 (ntdll.dll)

    Salve a tutti 

    12/09/2023 - Rocco ha scritto:


    Ho trovato che alcune variabili che avevo definito ed allocato non venivano utilizzate per cui dopo averle rimosse il problema si è risolto. Strano però che nell'altro pc non segnalava errori. Grazie!

    non vorrei essere pessimista ma da questa descrizione , “spero di sbagliarmi”, non hai risolto il problema ma hai messo le cartacce delle carammelle sotto il tappeto.

    i consigli che mi vengono in mente sono:

    1  rimetti le variabili che hai tolto e inizia a toglierne una per volta, ricompila e rilancia il processo e vedi che succede (nel pc dove il processo va' in crash).

    magari cìè una situazione del tipo :

    // uno dei mille esempi di violazione di memoria
    int variaibile_inutile_1=3;
    int array[10];
    int variaibile_inutile_2=5;
    ....
    array[10] = 30  // <<-- stai sporcando la variabile_inutile_2 
    
    cout << "variaibile_inutile_2" << variaibile_inutile_2 << endl; //la variabilie_inutile_2 ha come valore 30
    .....

    se il processo che gira utilizza pochi KB di RAM (un file main.cpp con 100 righe di codice) , questo esempio va' sempre in SEGMENTATION FAULT o in CRASH come preferisci

    se il processo in questione occupa decine di MB 60MB o 100MB non sempre esce fuori.

    inizializza le variabili che non usi e controlla se queste a fine processo se hanno il valore che non ti aspetti.

    se così fosse la violazione di memoria è causata da un puntatore,o un array, che è dichiarato vicino dove alla dichiarazione delle variabili inutilizzate, come nell'esempio sopra.

    al netto che il codice e parametri di configurazione siano gli stessi, il fatto che su un pc esce fuori e sull'altro no, dipende :

    1. dalla versione del OS che stai utilizzando 
    2. probabilmente anche dall'architettura 32bit o 64bit , AMD o Intel
    3. quantità di RAM su uno c'è 16GB di RAM e un altro 32GB, etc.etc .
    4. numero di processi , sul pc che funziona di sono 30 processi attivi (c'è margine di sporcamento) e su quello che non funziona ci sono 50 processi attivi appena c'è una violazione va' in crash perchè lo spazio in RAM e minore, puo' accadere anche il contrario.

    2 cerca di capire se l'eccezione che esce è riproducibile o randomica

    randomica intendo che l'eccezione esce a caso:  dopo 3 secondi,  dopo 1ora, dopo 3 giorni,

    riproducibile intendo che il processo si inchioda sempre quando intraprende una azione specifica.

    3. lancia il processo da visual studio utilizzando il debbug

    se siamo fortunati ci dovrebbe dare una indicazione dove si rompe il processo.

    4. utilizza log

    come dice Oregon utilizza dei log per capire dove si rompe il processo, anche se questi potrebbero nasconderti il problema.

    Sotto linux c'è un tool che si chiama Valgrind (molte volte mi ha salvato la pelle)

    per le violazioni o memory leak, e altre problematiche inerenti alla gestione della memoria,

    non so' se sotto windows c'è un tool simile

    Spero di averti dato qualche dritta.

    Armati di tanta tanta tanta e tanta PAZIENZA, non sei il primo che si è imbattuto in problemi del genere, 

    io ho fatto nottate, a ridosso dei giorni di collaudo e rilascio :)

  • Re: Eccezione non gestita in 0x00007FFE5AC8F459 (ntdll.dll)

    Un paio di note:

    1. visual studio non centra una cicca. E' un problema dell'applicativo che hai compilato
    2. il problema e' al 99% un problema di puntatori, accesso ad un vettore con un indice negativo/che esce dai limiti della dimensione del vettore

    In pratica acceso alla memoria: heap corroto vuol dire che sei andato a scrivere in aree di memoria contenenti informazioni di servizio ad uso della libreria di allocazione/deallocazione della memoria (lo heap, appunto) 

    E' una brutta bestia.

    Servono tecniche abbastanza sofisticate di analisi. 

    Il debugger di VS aiuta MA NON RISOLVE. 

    Risolvere queste rogne e' parecchio rognoso. 

    Il fatto che funzioni su un PC e non nell'altro NON vuol dire che nel primo funziona. Al 120% non funziona nemmeno nel primo MA, per un qualche misterioso colpo di ‘natica’ il sistema  non se ne accorge.

    Questo per dire che ieri funzionava, magari anche oggi si, ma del domani non c'e' certezza ;-) 

  • Re: Eccezione non gestita in 0x00007FFE5AC8F459 (ntdll.dll)

    forse non sono stato chiaro

    ma non ho mai detto che nel pc dove non si verifica l'eccezione il processo funziona al 120%, 

    mi sono anche permesso di dire che :  eliminando le variabili che non usa non sta' risolvendo il problema ma lo sta nascondendo.

    non potendo accedere al progetto ho cercato di dare dei MACRO consigli .

    1. visual studio non centra una cicca. E' un problema dell'applicativo che hai compilato < - - chi ha mai detto che dipende da visual studio
    2. il problema e' al 99% un problema di puntatori, accesso ad un vettore con un indice negativo/che esce dai limiti della dimensione del vettore 
      1.  chi lo dice che è negativo l'indice, magari sta' usando un indice superiore alla dimensione del massima del vettore  
      2.  un'altra ipotesi sta' utilizzando un puntatore dopo aver fatto un delete.

    Il debugger di VS aiuta MA NON RISOLVE.  

    chi ha mai detto che risolve ho detto : se siamo FORTUNATI ci DOVREBBE dare una INDICAZIONE (suggerimento) dove si rompe il processo, se siamo FORTUNATI

    senza codice posso solo fare solo delle ipotesi e dare dei consigli generici

  • Re: Eccezione non gestita in 0x00007FFE5AC8F459 (ntdll.dll)

    @Luke, non se tu l'autore del primo post, e' @Rocco ;-)
    Stavo rispondendo a LUI, mica a te!

    Poi, se vogliamo andare nel dettaglio, hai fatto una serie di ipotesi che pero' sono altamente improbabili (niente e' impossibile, nemmeno un bit convertito da 0 a 1 dai raggi cosmici): 

    1. dalla versione del OS che stai utilizzando 
    2. probabilmente anche dall'architettura 32bit o 64bit , AMD o Intel
    3. quantità di RAM su uno c'è 16GB di RAM e un altro 32GB, etc.etc .
    4. numero di processi , sul pc che funziona di sono 30 processi attivi (c'è margine di sporcamento) e su quello che non funziona ci sono 50 processi attivi appena c'è una violazione va' in crash perchè lo spazio in RAM e minore, puo' accadere anche il contrario.

    .

    Direi:

    1. no, NON E' la versione del SO, ma al limite la versione delle librerie di allocazione della memoria usate durante la compilazione
    2. anche no, 
    3. anche no: non stiamo parlando di sistemi con 16 KB di ram, ma 16GB, un milione di volte piu' grande
    4. anche no: su un normale PC, durante un uso normale, moolto difficilmente ci si trova in situazioni del genere. Inoltre e' responsabilita' del SO assicurarsi che un processo non vada a pasticciare nello spazio di memoria di un'altro processo. Poi c'e' la storia della memoria virtuale, …

    .

    Le condizioni in cui i tuoi soggetti possono essere responsabili del problema si possono riscontrare in un numero estremamente limitato di casi e situazioni che sono mooooolto al di la delle competenze del “programmatore quadratico medio”.  E sono “fantascienza” per il “programmatore junior”.

    In pratica: il problema e' un “banale” pasticcio implementativo, di quelli che con i tuoi soggetti non hanno nente a che fare.


    Vanno bene i MACRO consigli MA DEVI ragionare con la testa dell'autore NON con la TUA testa.

    Se uno si impasticcia con una qualche banale allocazione di memoria, pensi che sappia come configurare i log in C++? Al limite si va di “printf”.
    O che sappia come usare il debugger?

    Se vuoi insegnare, DEVI SEMPRE tenere presente chi e' il tuo interlocutore e quale e' il SUO LIVELLO di conoscenza della materia.

  • Re: Eccezione non gestita in 0x00007FFE5AC8F459 (ntdll.dll)

    @migliorabile non era mia intenzione ne di fare il maestrino, ne di polemizzare.

    Leggendo il post di @Rocco mi ci sono immedesimato 

    ed è veramente frustrante e deprimente 

    quando il processo va' in crash, per una violazione di memoria ,e non sai dove sbattere la testa.

    Magari, come spesso accade in questi casi stai sotto collaudo, e devi dare una versione funzionante ti esplode tutto senza sapere il perchè.

    Ti assicuro che non è bello.

    Oltre a dare dei consigli generici era mia intenzione dare una parola di conforto a @Rocco

    dicendogli che non è il primo ad affrontare una situazione del genere .

    Il post è di Marzo magari avrà risolto oppure ha cambiato azienda o lavoro e adesso fa' il maniscalco.

    ___________________________________________________________________________________________________________________________

    In pratica: il problema e' un “banale” pasticcio implementativo, di quelli che con i tuoi soggetti non hanno nente a che fare.

    che intendi per soggetti ? vuoi dire suggerimenti ?

    Cmq alla fine @Rocco neanche risponde probabilemnte avrà risolto 

  • Re: Eccezione non gestita in 0x00007FFE5AC8F459 (ntdll.dll)

    Fare il “maestrino” va bene, scherzi!
    Ma bisogna farlo bene, e per farlo bene bisogna farlo E sbagliare ;-) 
    Se no, non si impara.

    Mi ci sono volute due settimane per trovare un errore con un puntatore che andava per “radicela” (e' un'erba che si puo' mangiare e che si trova nei campi), in un'applicazione multitreading!

    Quindi so esattamente di che si tratta.

    Mi ero anche fatto una libreria con un po' di macro che permettevano di controllare se si usava un puntatore valido e un blocco di memoria valido. Un “valgrind” dei poveri, se vuoi. Ma ha funzionato ;-)

    Per “soggetti” intendevo quelli che hai elencato nella lista: SO, CPU, ram, processi, …

Devi accedere o registrarti per scrivere nel forum
9 risposte