add support for collecting backtraces
This commit is contained in:
parent
fae660b0e4
commit
87dae0df7a
|
@ -35,13 +35,15 @@ log message was reported.
|
||||||
(define drop-gc? #t)
|
(define drop-gc? #t)
|
||||||
(define start-right-away? #f)
|
(define start-right-away? #f)
|
||||||
|
|
||||||
(define done-chan (make-channel))
|
(define log-done-chan (make-channel))
|
||||||
(define start-chan (make-channel))
|
(define bt-done-chan (make-channel))
|
||||||
|
|
||||||
|
(define start-log-chan (make-channel))
|
||||||
(void
|
(void
|
||||||
(thread
|
(thread
|
||||||
(λ ()
|
(λ ()
|
||||||
(let loop ()
|
(let loop ()
|
||||||
(sync start-chan)
|
(sync start-log-chan)
|
||||||
(let loop ([events '()])
|
(let loop ([events '()])
|
||||||
(sync
|
(sync
|
||||||
(handle-evt
|
(handle-evt
|
||||||
|
@ -49,32 +51,104 @@ log message was reported.
|
||||||
(λ (info)
|
(λ (info)
|
||||||
(loop (cons info events))))
|
(loop (cons info events))))
|
||||||
(handle-evt
|
(handle-evt
|
||||||
done-chan
|
log-done-chan
|
||||||
(λ (resp-chan)
|
(λ (resp-chan)
|
||||||
(channel-put resp-chan events)))))
|
(channel-put resp-chan events)))))
|
||||||
(loop)))))
|
(loop)))))
|
||||||
|
|
||||||
|
(define thread-to-watch (current-thread))
|
||||||
|
(let ([win (get-top-level-windows)])
|
||||||
|
(unless (null? win)
|
||||||
|
(define fr-thd (eventspace-handler-thread (send (car win) get-eventspace)))
|
||||||
|
(unless (eq? thread-to-watch fr-thd)
|
||||||
|
(eprintf "WARNING: current-thread and eventspace thread aren't the same thread\n"))))
|
||||||
|
(define start-bt-chan (make-channel))
|
||||||
|
(void
|
||||||
|
(thread
|
||||||
|
(λ ()
|
||||||
|
(let loop ()
|
||||||
|
(sync start-bt-chan)
|
||||||
|
(let loop ([marks '()])
|
||||||
|
(sync
|
||||||
|
(handle-evt
|
||||||
|
(alarm-evt (+ (current-inexact-milliseconds) 10))
|
||||||
|
(λ (_)
|
||||||
|
(loop (cons (continuation-marks thread-to-watch)
|
||||||
|
marks))))
|
||||||
|
(handle-evt
|
||||||
|
bt-done-chan
|
||||||
|
(λ (resp-chan)
|
||||||
|
(define stacks (map continuation-mark-set->context marks))
|
||||||
|
(channel-put resp-chan stacks)))))
|
||||||
|
(loop)))))
|
||||||
|
|
||||||
(define controller-frame-eventspace (make-eventspace))
|
(define controller-frame-eventspace (make-eventspace))
|
||||||
(define f (parameterize ([current-eventspace controller-frame-eventspace])
|
(define f (parameterize ([current-eventspace controller-frame-eventspace])
|
||||||
(new frame% [label "Log Follower"])))
|
(new frame% [label "Log Follower"])))
|
||||||
(define sb (new button% [label "Start"] [parent f]
|
(define sb (new button% [label "Start Following Log"] [parent f]
|
||||||
[callback
|
[callback
|
||||||
(λ (_1 _2)
|
(λ (_1 _2)
|
||||||
(sb-callback))]))
|
(sb-callback))]))
|
||||||
|
(define sb2 (new button% [label "Start Collecting Backtraces"] [parent f]
|
||||||
|
[callback
|
||||||
|
(λ (_1 _2)
|
||||||
|
(start-bt-callback))]))
|
||||||
(define db (new button% [label "Stop && Dump"] [parent f] [enabled #f]
|
(define db (new button% [label "Stop && Dump"] [parent f] [enabled #f]
|
||||||
[callback
|
[callback
|
||||||
(λ (_1 _2)
|
(λ (_1 _2)
|
||||||
(define resp (make-channel))
|
(cond
|
||||||
(channel-put done-chan resp)
|
[following-log?
|
||||||
(show-results (channel-get resp))
|
(define resp (make-channel))
|
||||||
(send db enable #f)
|
(channel-put log-done-chan resp)
|
||||||
(send sb enable #t))]))
|
(show-results (channel-get resp))
|
||||||
|
(send db enable #f)
|
||||||
|
(send sb enable #t)
|
||||||
|
(send sb2 enable #t)
|
||||||
|
(set! following-log? #f)]
|
||||||
|
[following-bt?
|
||||||
|
(define resp (make-channel))
|
||||||
|
(channel-put bt-done-chan resp)
|
||||||
|
(define stacks (channel-get resp))
|
||||||
|
(show-bt-results stacks)
|
||||||
|
(send db enable #f)
|
||||||
|
(send sb enable #t)
|
||||||
|
(send sb2 enable #t)
|
||||||
|
(set! following-bt? #f)]))]))
|
||||||
|
|
||||||
|
(define following-log? #f)
|
||||||
|
(define following-bt? #f)
|
||||||
|
|
||||||
(define (sb-callback)
|
(define (sb-callback)
|
||||||
|
(set! following-log? #t)
|
||||||
(send sb enable #f)
|
(send sb enable #f)
|
||||||
|
(send sb2 enable #f)
|
||||||
(send db enable #t)
|
(send db enable #t)
|
||||||
(channel-put start-chan #t))
|
(channel-put start-log-chan #t))
|
||||||
|
|
||||||
|
(define (start-bt-callback)
|
||||||
|
(set! following-bt? #t)
|
||||||
|
(send sb enable #f)
|
||||||
|
(send sb2 enable #f)
|
||||||
|
(send db enable #t)
|
||||||
|
(channel-put start-bt-chan #t))
|
||||||
|
|
||||||
(send f show #t)
|
(send f show #t)
|
||||||
|
|
||||||
|
(define (show-bt-results stacks)
|
||||||
|
(define top-frame (make-hash))
|
||||||
|
(for ([stack (in-list stacks)])
|
||||||
|
(unless (null? stack)
|
||||||
|
(define k (car stack))
|
||||||
|
(hash-set! top-frame k (cons stack (hash-ref top-frame k '())))))
|
||||||
|
(define sorted (sort (hash-map top-frame (λ (x y) y)) > #:key length))
|
||||||
|
(printf "top 10: ~s\n" (map length (take sorted (min (length sorted) 10))))
|
||||||
|
(define most-popular (cadr sorted))
|
||||||
|
(for ([x (in-range 10)])
|
||||||
|
(printf "---- next stack\n")
|
||||||
|
(pretty-print (list-ref most-popular (random (length most-popular))))
|
||||||
|
(printf "\n"))
|
||||||
|
(void))
|
||||||
|
|
||||||
(struct gui-event (start end name) #:prefab)
|
(struct gui-event (start end name) #:prefab)
|
||||||
|
|
||||||
(define (show-results evts)
|
(define (show-results evts)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user