Sto cercando un modo per eseguire il debug di una patch critica di Critical 7 (TCriticalSection) rara/deadlock. In questo caso, se un thread è in attesa su una sezione critica per più di 10 secondi, mi piacerebbe produrre un report con la traccia stack di entrambi i thread che attualmente bloccano la sezione critica e anche il thread che non è riuscito a essere in grado per bloccare la sezione critica dopo aver atteso 10 secondi. Va bene quindi se viene sollevata un'eccezione o se l'applicazione termina.Delphi: Esecuzione del debug della sezione critica del debug segnalando lo stack di chiamate di thread in esecuzione sul blocco "failure"
Preferirei continuare a utilizzare le sezioni critiche, anziché utilizzare altre primitive di sincronizzazione, se possibile, ma posso cambiare se necessario (ad esempio per ottenere una funzione di timeout).
Se lo strumento/metodo funziona in runtime al di fuori dell'IDE, questo è un bonus, poiché questo è difficile da riprodurre su richiesta. Nel raro caso riesco a duplicare il deadlock all'interno dell'IDE, se provo a mettere in pausa per avviare il debug, l'IDE rimane lì senza fare nulla e non arriva mai a uno stato in cui posso visualizzare i thread o gli stack delle chiamate. Posso resettare il programma in esecuzione, però.
Aggiornamento: In questo caso, sto trattando solo una sezione critica e 2 thread, quindi questo probabilmente non è un problema di ordinamento dei blocchi. Credo che ci sia un tentativo annidato improprio di inserire il blocco attraverso due thread diversi, il che si traduce in un deadlock.
+1 per il controllo bloccato del thread MadExcept. –
madExcept può anche essere richiesto di fare un dump del thread in qualsiasi momento, quindi è forse l'ideale per questo. – mj2008
madExcept sembra l'opzione migliore. Grazie! – Anagoge