From fe2a2b57f45cdc594d08fde788211d346dba4ce4 Mon Sep 17 00:00:00 2001
From: Ben Gamari <ben@smart-cactus.org>
Date: Sat, 19 Dec 2020 15:54:16 +0000
Subject: [PATCH] gdb.find_refs: Things

---
 gdb/ghc_gdb/find_refs.py | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/gdb/ghc_gdb/find_refs.py b/gdb/ghc_gdb/find_refs.py
index 67d991a..0d7c155 100644
--- a/gdb/ghc_gdb/find_refs.py
+++ b/gdb/ghc_gdb/find_refs.py
@@ -14,6 +14,8 @@ T = TypeVar('T')
 
 stg_STACK_info = gdb.parse_and_eval('&stg_STACK_info')
 
+CLOSURE_HEADER_SIZE = gdb.parse_and_eval('sizeof(StgHeader)') # bytes
+
 def search_memory_many(inferior: gdb.Inferior, start: Ptr, end: Ptr, val: bytes) -> Iterator[Ptr]:
     #print('Searching for %r in %d to %d' % (val, start.addr(), end.addr()))
     assert end.addr() > start.addr()
@@ -167,7 +169,7 @@ def find_containing_closure(inferior: gdb.Inferior,
                     if ptr.addr() - start.addr() > 8:
                         # Only trace the indirectee of IND_STATICs
                         return None
-                elif i <= nptrs + 5: # A bit of fudge for the headers
+                elif i <= nptrs + CLOSURE_HEADER_SIZE: # A bit of fudge for the headers
                     return start
                 elif int(info['type']) == closure.ClosureType.STACK:
                     stack = gdb.parse_and_eval('(StgStack *) %d' % start.addr())
@@ -182,8 +184,7 @@ def find_containing_closure(inferior: gdb.Inferior,
         except gdb.MemoryError as e:
             print('failed to find containing closure of 0x%x:' % ptr.addr())
             traceback.print_exc()
-            continue
-
+            return None
 
     return None
 
-- 
GitLab