Thanks Matthew - very cool idea.  I&#39;ll try to apply it to my code base and see how it works.<br><br>Thanks,<br>yc<br><br><div class="gmail_quote">On Fri, Apr 17, 2009 at 7:03 PM, Matthew Flatt <span dir="ltr">&lt;<a href="mailto:mflatt@cs.utah.edu">mflatt@cs.utah.edu</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div class="im">At Fri, 17 Apr 2009 18:33:12 -0700, YC wrote:<br>
&gt; what are some approaches to determine where in code the thread execution (or<br>
&gt; multiple threads) hangs?<br>
<br>
</div>Here&#39;s a function that creates a thread to watch a different thread.<br>
Every `delay&#39; seconds, it grabs a stack trace of the thread `t&#39;:<br>
<br>
 (define (watch-thread t delay)<br>
   ;; create a new thread to report snapshots of t:<br>
   (thread (lambda ()<br>
             (let loop ()<br>
               (sleep delay)<br>
               (let ([trace (continuation-mark-set-&gt;context<br>
                             (continuation-marks t))])<br>
                 (unless (null? trace)<br>
                    (for-each print-location trace)<br>
                   (newline)))<br>
               (loop)))))<br>
<br>
Maybe something like that would help you.<br>
<br>
Here&#39;s a basic print-location function to use with watch-thread:<br>
<br>
 (define (print-location i)<br>
   (let ([id (car i)]<br>
         [src (cdr i)])<br>
     (cond<br>
      [src (printf &quot;~a:~a~a\n&quot;<br>
                   (srcloc-source src)<br>
                   (if (srcloc-line src)<br>
                       (format &quot;~a:~a&quot;<br>
                               (srcloc-line src)<br>
                               (srcloc-column src))<br>
                       (srcloc-position src))<br>
                   (if id<br>
                       (format &quot;: ~a&quot; id)<br>
                       &quot;&quot;))]<br>
      [id (printf &quot;~a\n&quot; id)]<br>
      [else (printf &quot;???\n&quot;)])))<br>
<br>
For example, the following shows where all the time goes when you load<br>
the implementation of the main PLT Scheme reference:<br>
<br>
  (let ([watcher-t (watch-thread (current-thread) 0.1)])<br>
    (dynamic-require &#39;(lib &quot;scribblings/reference/reference.scrbl&quot;) #f)<br>
    (kill-thread watcher-t))<br>
<br>
This is a noisy way to monitor a thread, though. Instead of dumping each<br>
stack trace, you might just save it to check later when the thread<br>
seems to be stuck.<br>
<br>
The gprof-like profiler that Eli mentioned on plt-dev works in a<br>
similar way:<br>
<br>
 <a href="http://list.cs.brown.edu/pipermail/plt-dev/2009-April/000543.html" target="_blank">http://list.cs.brown.edu/pipermail/plt-dev/2009-April/000543.html</a><br>
<br>
</blockquote></div><br>