Hardware Upgrade Forum

Hardware Upgrade Forum (https://www.hwupgrade.it/forum/index.php)
-   Programmazione (https://www.hwupgrade.it/forum/forumdisplay.php?f=38)
-   -   [C++] Segmentation fault con nlohmann json, problema di RAM? (https://www.hwupgrade.it/forum/showthread.php?t=2988212)


TommyB1992 21-09-2023 01:15

[C++] Segmentation fault con nlohmann json, problema di RAM?
 
Dopo essere impazzito ore, penso che il problema dipenda dalla libreria `nlohmann/json.hpp`

In questo pezzo di codice:
Codice:

void load_data(std::string fileName) {
    std::ifstream f(fileName);
    // riga 123
    json j = json::parse(f);
    // riga 987
  [...]
}

se metto il return, subito dopo json j = json::parse(f); al posto della riga 987, mi darà SEMPRE un Segmentation fault dopo X iterazioni del mio codice.
Se metto il return PRIMA di quella riga, cioè al posto di 123, il codice non crasherà mai.

È una questione di memoria? Mi sembra piuttosto strano.

misterx 21-09-2023 08:46

misteri dei compilatori. Si dovrebbe disassemblare il codice in LM e vedere le due versioni, chissà cosa aggiunge di sbagliato in uno dei due casi.
Di sicuro una locazione di memoria errata che viene corretta con un semplice CR :D

TommyB1992 21-09-2023 13:42

Quote:

Originariamente inviato da misterx (Messaggio 48304668)
misteri dei compilatori. Si dovrebbe disassemblare il codice in LM e vedere le due versioni, chissà cosa aggiunge di sbagliato in uno dei due casi.
Di sicuro una locazione di memoria errata che viene corretta con un semplice CR :D

Ma si può affermare che il problema non sia mio e/o a livello hardware ma dell'implementazione della libreria?
Giusto per capire che soluzione adottare (es. provare a cambiare libreria per gestire il .json)

misterx 21-09-2023 15:36

non conosco quelle funzioni ma googolando:

Codice:

if (json_object_get_type(f) != json_type_object) {
  ...handle error...
}

forse devi controllare cosa passi a quel parser? :confused:

jepessen 22-09-2023 21:18

Quote:

Originariamente inviato da TommyB1992 (Messaggio 48305115)
Ma si può affermare che il problema non sia mio e/o a livello hardware ma dell'implementazione della libreria?
Giusto per capire che soluzione adottare (es. provare a cambiare libreria per gestire il .json)

Penso proprio che il problema sia tuo, cosi' ad occhio... Ad esempio non fai nessuna gestione degli errori, giusto per capire cosa c'e' che non va...

Prima di dare la colpa di un errore ad altri, assicurati sempre prima che non sia tua... Quindi devi organizzare il tuo codice per gestire correttamente gli errori, oltre che utilizzare il debugger per vedere lo stack in caso di errore.

Lampo89 23-09-2023 20:41

Difficile dare una risposta certa senza ulteriori informazioni.
Per esempio:
1) stai usando la versione di libreria più recente a disposizione?
2) ambiente di esecuzione linux o windows?
Se windows, hai attivato i crash dumps?

Su linux, hai attivato i core dump? hai provato a girare il tuo programma sotto valgrind per individuare accessi alla memoria non validi oppure sotto un address sanitizer? (eg guarda il post qui https://www.iprogrammatori.it/forum-...t48631-30.html per un esempio)

In ogni caso, per avere degli stacktrace più puliti, consiglio di eseguire una compilazione a debug con simboli inclusi.

Se dovessi rispondere "di pancia", propenderei più per un problema di libreria. Però è altrettanto vero che, nell'eventualità che il codice che riproduce il problema non sia esattamente quello postato, non mi stupirei se fosse un problema "al contorno" dovuto a qualche magagna nella tua implementazione ..

TommyB1992 25-09-2023 00:44

Quote:

Originariamente inviato da Lampo89 (Messaggio 48307426)
Difficile dare una risposta certa senza ulteriori informazioni.
Per esempio:
1) stai usando la versione di libreria più recente a disposizione?
2) ambiente di esecuzione linux o windows?
Se windows, hai attivato i crash dumps?

Su linux, hai attivato i core dump? hai provato a girare il tuo programma sotto valgrind per individuare accessi alla memoria non validi oppure sotto un address sanitizer? (eg guarda il post qui https://www.iprogrammatori.it/forum-...t48631-30.html per un esempio)

In ogni caso, per avere degli stacktrace più puliti, consiglio di eseguire una compilazione a debug con simboli inclusi.

Se dovessi rispondere "di pancia", propenderei più per un problema di libreria. Però è altrettanto vero che, nell'eventualità che il codice che riproduce il problema non sia esattamente quello postato, non mi stupirei se fosse un problema "al contorno" dovuto a qualche magagna nella tua implementazione ..


Alla fine ho fatto una cosa: ho scritto una mia classe per l'IO e ho smesso di salvare i dati in .json.
"Ho risolto", ma perdendo una giornata e mezza, però almeno ho risolto.

Però ti ringrazio del topic, ora lo leggo per quando mi servirà in futuro.
Comunque: Linux e al resto delle risposte è sempre no (ho provato solo con valgrind ma mi è crashato ubuntu durante il caricamento del json da tanti GB).


Tutti gli orari sono GMT +1. Ora sono le: 23:51.

Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Hardware Upgrade S.r.l.