2015-11-11 6 views
14

Ich versuche ein Programm zu debuggen, das STM verwendet. Die ThreadScope Lesungen werden der Hinweis auf eine sehr hohe Aktivität CPU, wie Sie hier sehen können:Wie erkennen Sie, ob eine Transaktion häufig abbricht?

enter image description here

Also, um herauszufinden, ich versuche, wenn dies aufgrund einer Transaktion geschieht, die häufig bricht. Das erste, was ich dachte, war, so etwas zu Test:

atomically $ do 
    someWork 
    ... 
`orElse` do 
    unsafeIOToSTM $ traceEventIO "transaction aborted!" 
    retry 

Aber ich bin nicht sicher, ob dies richtig ist oder ob dies der beste Ansatz ist, in einem STM-Szenario zu debuggen. Irgendwelche Ideen?

+2

Das hätte war auch mein Ansatz. – chi

+0

Welche Ergebnisse haben Sie von diesem Ansatz erhalten? –

+0

Es gibt keine Spuren. Wenn dieser Ansatz korrekt ist, wird keine Transaktion abgebrochen. – luisgabriel

Antwort

3

Verwenden Sie stm-stats Paket. Es bietet trackSTM, die Sie anstelle von atomically verwenden sollten, und dumpSTMStats :: IO(), dass so etwas wie dieses bieten wird:

STM transaction statistics (2011-10-09 12:28:37.188951 UTC): 
Transaction  Commits Retries  Ratio 
_anonymous_   1   0  0.00 
reader    1   23  23.00 
writer    23   0  0.00 

(. Transaktionsnamen automatisch generiert werden, aber es gibt Helfer dein eigenes Set)

+0

Entschuldigung für die lange Verzögerung zu reagieren. Es scheint, dass dieses Paket für eine lange Zeit nicht aktualisiert wird. Ich schaue mir an, wie sie nach Wiederholungen suchen. Vielen Dank! – luisgabriel

+0

Ich wäre nicht besorgt über fehlende Updates: 1) Joachim, der Betreuer, ist in der Community bekannt; 2) das Paket ist in Stackage LTS, was bedeutet, dass es zumindest baut. –

+0

Ich hatte gerade etwas Zeit, um 'stm-stats' zu testen und es hat perfekt funktioniert! Das Problem war tatsächlich eine Transaktion, die häufig abbrach. Vielen Dank! – luisgabriel

Verwandte Themen