From 705fbc92c4921daa87e1eb8c945d32a39980668f Mon Sep 17 00:00:00 2001
From: Ben Gamari <ben@smart-cactus.org>
Date: Sat, 1 Jul 2017 22:15:18 -0400
Subject: [PATCH] gdb: Better TSO and blackhole printing

---
 ghc-gdb.py | 36 ++++++++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)

diff --git a/ghc-gdb.py b/ghc-gdb.py
index 1d52561..8c6aaab 100644
--- a/ghc-gdb.py
+++ b/ghc-gdb.py
@@ -319,6 +319,37 @@ def build_closure_printers():
         return s
     p[C.RET_SMALL] = ret_small
 
+    def tso(closure, depth):
+        tso = closure.cast(gdb.lookup_type('StgTSO').pointer()).dereference()
+        return Text('TSO(id=%d)' % tso['id'])
+    p[C.TSO] = tso
+
+    def blocking_queue(closure, depth):
+        s = Hang('BLOCKING_QUEUE')
+        ty = gdb.lookup_type('StgBlockingQueue').pointer()
+        queue = closure.cast(ty).dereference()
+        s += Text('BH %s owned by TSO %s ' % (queue['bh'], queue['owner']))
+
+        #msg = queue['queue']
+        #while msg != 0:
+        #    s += print_closure(msg)
+        #    msg = msg.dereference()['link']
+        return s
+    p[C.BLOCKING_QUEUE] = blocking_queue
+
+    def prim(closure, depth):
+        s = Hang('PRIM')
+        info = closure.dereference()['header']['info']
+        print(gdb.parse_and_eval('&stg_MSG_BLACKHOLE_info'))
+        if info == gdb.parse_and_eval('&stg_MSG_THROWTO_info'):
+            s += "MSG_THROWTO"
+        elif info == gdb.parse_and_eval('&stg_MSG_BLACKHOLE_info'):
+            ty = gdb.lookup_type('MessageBlackHole').pointer()
+            msg = closure.cast(ty).dereference()
+            s += "MSG_BLACKHOLE(BH=%s, to TSO %s)" % (msg['bh'], msg['tso'])
+        return s
+    p[C.PRIM] = prim
+
     return p
 
 closurePrinters = build_closure_printers()
@@ -537,7 +568,12 @@ class PrintGhcThreadsCmd(gdb.Command):
         blocked_reasons = {
             0: lambda tso: 'nothing',
             1: lambda tso: 'MVar@%s' % tso['block_info']['closure'],
+            14: lambda tso: 'MVar read@%s' % tso['block_info']['closure'],
             2: lambda tso: 'blackhole@%s' % tso['block_info']['bh'],
+            5: lambda tso: 'delay',
+            6: lambda tso: 'stm',
+            10: lambda tso: 'ccall',
+            12: lambda tso: 'interruptible ccall'
         }
         for tso_ptr in all_threads():
             tso = tso_ptr.dereference()
-- 
GitLab