Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: bonmario - Agosto 27, 2026, 07:38:32 am

Titolo: Errore di segmentazione (core dump creato)
Inserito da: bonmario - Agosto 27, 2026, 07:38:32 am
Ciao a tutti,
ho un programma che funzionava senza problemi con GTK2.
Ricompilato con GTK3 succede questo:
- lanciato dall'IDE, anche in debug, il programma si chiude da solo senza dare nessun errore
- se lo lancio da terminale, mi da questo errore: "Errore di segmentazione (core dump creato)"

C'è qualche modo "furbo" per capire cosa provoca quell'errore, oppure devo trovarlo in debug a colpi di F7/F8?

Grazie !!!
Titolo: Re:Errore di segmentazione (core dump creato)
Inserito da: DragoRosso - Agosto 27, 2026, 08:30:13 am
L'unico modo furbo che conosco è riuscire a capire quale è la differenza tra la versione funzionante e quella che non funziona ... ma dato che è cambiato completamente l'ambiente grafico (GTK2 -> GTK3) non penso sia possibile ciò.

Hai provato ad attivare tutti gli switch di configurazione per il debugging ? (come "genera il codice per valgrind", controllo di stack, I/O, range check, overflow, etc ....)

Li trovi nella pagina "debugging" nella pagina di progetto. E ricordati di disattivare completamente l'ottimizzazione.

Poi, per capire almeno se il problema è il runtime o il tuo prgramma, nella prima linea di codice eseguita del tuo applicativo inserisci una "writeln" seguito con uno sleep(5000) (in modo che si fermi tutto almeno per osservare e non si chiuda l'applicativo).

Lancia l'applicativo da riga di comando affinchè "writeln" funzioni.

Se l'applicativo crasha prima del wrtieln allora il problema è nel codice di inizializzazione di FPC / Lazarus e li l'unica cosa che puoi fare è compilare Lazarus / FPC in versione "debug" se vuoi andare più a fondo.

Se invece crasha dopo il writeln, allora puoi inserire queste due righe in vari punti (seguendo il "filo" di esecuzione del programma) per capire dove c'è l'intoppo.

Per Delphi ci sono dei tool specifici che aiutano in ciò ma non sono compatibili FPC.

Facci sapere come è andata, l'esperienza aiuta tutti.
Titolo: Re:Errore di segmentazione (core dump creato)
Inserito da: bonmario - Agosto 27, 2026, 08:43:54 am
Grazie !
Ci sono arrivato a colpi di debug ...
Nel programma in questione, ho 9 TMemo.
Per ognuna di esse lancio una funzione che contiene questa istruzione:

Codice: [Seleziona]
WrkMemo.VertScrollBar.Position:=Riga;

Con "Riga" che corrisponde alla penultima riga della memo e che è sempre > di zero. Ho verificato in debug che il valore di Riga è corretto.
L'intera funzioncina che contiene quell'istruzione è dentro una try/except, proprio per evitare che dia errori.

Quando la lancio, solo per una di queste TMemo, nel momento in cui esegue quell'istruzione probabilmente va storto qualcosa, ma invece di andare nella "except", chiude il programma

Credo che sia un bug, ma non saprei nemmeno come segnalarlo, visto che il comportamento è comunque "strano"

Ciao !
Titolo: Re:Errore di segmentazione (core dump creato)
Inserito da: DragoRosso - Agosto 27, 2026, 10:29:04 am
Ahhh, io non uso le scrollbar ... in Delphi non è pubblicata quella proprietà (magari sono rimasto indietro io).

Per posizionarmi su una specifica riga io uso (funziona in Windows):

Codice: [Seleziona]
procedure GoToLine(Memo: TMemo; NumeroRiga: Integer);
begin
  // Riga esistente ?
  if (NumeroRiga >= 0) and (NumeroRiga < Memo.Lines.Count) then
    begin
      // Restituisce l'indice del carattere iniziale della riga
      Memo.SelStart := Memo.Perform(EM_LINEINDEX, NumeroRiga, 0);
      // Azzero la selezione
      Memo.SelLength := 0;
    end;
end;

//Uso:
    GoToLine(Memo1, 35);
Titolo: Re:Errore di segmentazione (core dump creato)
Inserito da: bonmario - Agosto 27, 2026, 03:47:27 pm
Ho provato per curiosità, ma EM_LINEINDEX sembra valida solo per Windows !