|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Aug 2004
Città: Provincia di Monza e Brianza
Messaggi: 6259
|
[C] Gestione errori
Ciao, vorrei sapere se in C esiste qualche tipo di "error handler"....mi spiego, ho sempre sottomano un mega-progamma C davvero casinoso, purtroppo il C non lo conosco a fondo come vorrei,ma mi tocca lo stesso metterci mano.
Ho una structure che ad un certo punto viene popolata con dati errati (non so perchè, ma col debugger del VisualC vedo solo "Error: expression cannot be evaluated") e ovviamente il programma termina in modo anomalo appena il programma tenta di leggerci. Ho anche fatto una prova banale , leggendo e testando un valore di un campo di questa struttura, per cercare di 'trappare' l'errore (ossia, se il campo è 0, allora la struttura è ok, visto che altrimenti ci sarebbe quel "Error") ma niente da fare, il programma termina anomalo ancora. Cosa posso fare ? Grazie
__________________
AMD Ryzen 5 7600X - Dissipatore Thermalright Assassin King 120SE - RAM Kingston Fury Beast 2x16Gb DDR5 CL30 @ 6000 - Motherboard ASROCK B650 Pro RS - NVME Kingston KC3000 2Tb - PSU FSP Hydro PRO 600w - Win 11 PRO |
![]() |
![]() |
![]() |
#2 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
debug passo passo (F10 oppure F11, che sono rispettivamente lo Step Over e lo Step Into) e vedi di preciso qual è l'istruzione che lo fa terminare, che è già un passo avanti. dopodiché cerca di capire perché quell'istruzione lo fa terminare: puntatore nullo? puntatore arbitrario? puntatore a blocco di memoria non più allocato? eccezione? altro?
|
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Aug 2004
Città: Provincia di Monza e Brianza
Messaggi: 6259
|
Quote:
A me servirebbe qualche istruzione che dica al programma "salta questa parte se i valori di struttura sono errati"
__________________
AMD Ryzen 5 7600X - Dissipatore Thermalright Assassin King 120SE - RAM Kingston Fury Beast 2x16Gb DDR5 CL30 @ 6000 - Motherboard ASROCK B650 Pro RS - NVME Kingston KC3000 2Tb - PSU FSP Hydro PRO 600w - Win 11 PRO |
|
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Infatti quel tipo di messaggi nei debugger, in genere, significa che stai, per esempio, interrogando il debugger sul contento di una variabile in un momento in cui essa non è ancora stata istanziata. Ciao ![]() |
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Aug 2004
Città: Provincia di Monza e Brianza
Messaggi: 6259
|
Quote:
__________________
AMD Ryzen 5 7600X - Dissipatore Thermalright Assassin King 120SE - RAM Kingston Fury Beast 2x16Gb DDR5 CL30 @ 6000 - Motherboard ASROCK B650 Pro RS - NVME Kingston KC3000 2Tb - PSU FSP Hydro PRO 600w - Win 11 PRO |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Ok magari la colpa è di un puntatore che va a scrivere dove non dovrebbe...
Non saprei cosa consigliarti però, così sui due piedi ![]() (non utilizzo più C da 3 anni a questa parte) Ultima modifica di banryu79 : 09-01-2008 alle 11:59. |
![]() |
![]() |
![]() |
#7 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
ok, quindi andiamo al passo successivo: scoprire la causa. se l'istruzione che causa il crash è del tipo "if (struttura->campo == 0)" allora sicuramente "struttura" è un puntatore non valido, o perché contiene NULL, o perché contiene un valore arbitrario, o perché prima puntava ad un'area di memoria che adesso non è più valida (magari è stata deallocata). quale delle tre?
|
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Aug 2004
Città: Provincia di Monza e Brianza
Messaggi: 6259
|
Quote:
In qualche modo, sta struttura viene 'corrotta' e quando faccio il mio test mi causa l'errore. Ho aggiunto un modulo Try..Catch che ho trovato su internet, ma non funziona come dovrebbe....
__________________
AMD Ryzen 5 7600X - Dissipatore Thermalright Assassin King 120SE - RAM Kingston Fury Beast 2x16Gb DDR5 CL30 @ 6000 - Motherboard ASROCK B650 Pro RS - NVME Kingston KC3000 2Tb - PSU FSP Hydro PRO 600w - Win 11 PRO |
|
![]() |
![]() |
![]() |
#9 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Aug 2004
Città: Provincia di Monza e Brianza
Messaggi: 6259
|
Rieccomi, dopo un pò di debugging....
Dunque, l'errore si presenta saltuariamente, ossia, magari il programma gira tranquillamente e passa quelle istruzioni senza problemi, io col debug magari lo vedo passarci senza problemi per due o tre volte, poi, senza un motivo, mi ritrovo quell' "Error" nel valore della struttura. Ho notato che quando gira correttamente, nella struttura ho il valore "0xFeeeFeee", significa che la struttura è stata deallocata ? ho provato a porla a "Null" prima di eseguire una sua rivalorizzazione, ma non c'è niente da fare, se contiene "Error", le istruzioni seguenti mi mandano in crash... Codice:
if ((l = (struct link_t*)GetWindowLong(hwnd, GWL_USERDATA)) != NULL) { cp = (struct control*)l->item; dg1p = (struct data_grid1*)cp->cdp; Codice:
static struct link_t *l = NULL; static struct control *cp = NULL; static struct data_grid1 *dg1p = NULL; AGGIORNAMENTO: Dunque, ho visto che l'oggetto CP, ossia la struttura che mi genera l'errore, è valorizzata errata a seguito dell'istruzione Codice:
if ((l = (struct link_t*)GetWindowLong(hwnd, GWL_USERDATA)) != NULL) C'è qualche cosa che non va in questa chiamata ?
__________________
AMD Ryzen 5 7600X - Dissipatore Thermalright Assassin King 120SE - RAM Kingston Fury Beast 2x16Gb DDR5 CL30 @ 6000 - Motherboard ASROCK B650 Pro RS - NVME Kingston KC3000 2Tb - PSU FSP Hydro PRO 600w - Win 11 PRO Ultima modifica di Spike79 : 10-01-2008 alle 10:58. |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
GetWindowLong() dovrebbe restituire un LONG.
Prova a fare la chiamata fuori dall'if e catturare il valore di ritorno e stamparlo. Se la funzione viene eseguita con successo quel LONG contiene il valore a 32 bit richiesto; se invece fallisce dovrebbe restituire 0 GetWindowLong |
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Aug 2004
Città: Provincia di Monza e Brianza
Messaggi: 6259
|
Quote:
Non c'è modo di spazzare via completamente cp e quindi valorizzarla da vuota ?
__________________
AMD Ryzen 5 7600X - Dissipatore Thermalright Assassin King 120SE - RAM Kingston Fury Beast 2x16Gb DDR5 CL30 @ 6000 - Motherboard ASROCK B650 Pro RS - NVME Kingston KC3000 2Tb - PSU FSP Hydro PRO 600w - Win 11 PRO |
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Codice:
cp = (struct control*)l->item; Forse qui succede qualcosa che no va? Premetto che non sono un esperto, non vorrei portarti su una traccia falsa, ma forse il problema potrebbe essere lì. |
|
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Aug 2004
Città: Provincia di Monza e Brianza
Messaggi: 6259
|
E' proprio lì che succede il 'danno' anche secondo me....seguendolo in debug, vedo che appena passa dalla valorizzazione della prima struttura, cp viene riempito di "error".... secondo me è la 'GetWindowLong' che fa casino, ma non so come ovviare all'errore...
![]()
__________________
AMD Ryzen 5 7600X - Dissipatore Thermalright Assassin King 120SE - RAM Kingston Fury Beast 2x16Gb DDR5 CL30 @ 6000 - Motherboard ASROCK B650 Pro RS - NVME Kingston KC3000 2Tb - PSU FSP Hydro PRO 600w - Win 11 PRO |
![]() |
![]() |
![]() |
#15 | ||
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Come detto sopra, in ogni caso, ritorna un LONG il cui valore è un valore a 32 bit e rappresenta l'informazione richiesta se la funzione esegue con successo, oppure vale zero se la funzione fallisce. Quale informazione viene richiesta, in questo caso, lo vediamo nel secondo parametro passato in ingresso (il primo parametro è l'HANDLE alla finestra di cui si richiede l'informazione): GWL_USERDATA. Guardando su MSDN si legge che: Quote:
[nel caso te lo stessi chiedendo, la funzione per settare quel valore sarebbe questa: SetWindowLong, passandogli come secondo parametro "GWL_USERDATA" e come terzo un LONG che è il valore a cui si vuole settare il parametro. Intanto potresti verificare se questa funzione nell'applicazione viene invocata da qualche parte oppure no.] Penso sarebbe il caso di capire nel dettaglio che strutture siano in coinvolte e cosa succeda di preciso qui: Codice:
if ((l = (struct link_t*)GetWindowLong(hwnd, GWL_USERDATA)) != NULL) Codice:
cp = (struct control*)l->item; [3] ammesso che il punto [2] sia ok, ha poi senso castare la deferenziazione del puntatore l al tipo (struct control*) ? Questo è quello che io proverei a controllare, magari cambiando il codice in quei due passaggi per fargli compiere una sola operazione per riga ed esaminando in debug i singoli valori prodotti da ogni operazione. |
||
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Aug 2004
Città: Provincia di Monza e Brianza
Messaggi: 6259
|
Intanto grazie per tutti i vostri consigli, non sapendo più dove sbattere la testa, sono preziosissimi per me.
Tornando al problema....il Long che mi ritorna dalla GetWindowLong è ok, l'ho messo in una variabile d'appoggio ed è corretto, anche quando il giro va male. Che sia il casting di "l" ? Se non ho capito male, la GetWindowLong ritorna un Long che ho settato per la finesta attiva....non c'è modo di usare magari un'altra funzione ? ho visto che c'è la SetWindowLong per settare correttamente GWL_USERDATA, magari è proprio il fatto che non riesce a ricavare info sulla finestra corrente a metterlo in crisi.... ![]()
__________________
AMD Ryzen 5 7600X - Dissipatore Thermalright Assassin King 120SE - RAM Kingston Fury Beast 2x16Gb DDR5 CL30 @ 6000 - Motherboard ASROCK B650 Pro RS - NVME Kingston KC3000 2Tb - PSU FSP Hydro PRO 600w - Win 11 PRO |
![]() |
![]() |
![]() |
#17 | ||
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Dunque, ragioniamo un attimo:
Quote:
Infatti: Quote:
Il che ci porta a: Io *a naso* penso proprio che il problema abbia a che fare con i casting... Prova a controllare le definizioni delle strutture a cui si casta (struct link_t e strutc control). Buona caccia ![]() |
||
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:03.