commit a6920c1dd9c92762b4d1306fdf171e037b58c6c9
parent 63199e950d54fcb1d9b926e4f7debb53c33c8892
Author: Tizian Leonhardt <tizianleonhardt@web.de>
Date:   Wed,  3 Feb 2021 20:30:42 +0100
Use read_register and early return when type is not available
Diffstat:
1 file changed, 16 insertions(+), 8 deletions(-)
diff --git a/project/extract_sizeret.py b/project/extract_sizeret.py
@@ -6,9 +6,9 @@ import json
 
 # allocator mapped to register containing size argument
 break_arg = {
-    "kmem_cache_alloc_trace": "$rdx",
-    "kmalloc_order": "$rdi",
-    "__kmalloc": "$rdi",
+    "kmem_cache_alloc_trace": "rdx",
+    "kmalloc_order": "rdi",
+    "__kmalloc": "rdi",
 }
 
 entries = set()
@@ -31,8 +31,14 @@ class EntryExitBreakpoint(gdb.Breakpoint):
         if f.unwind_stop_reason() != gdb.FRAME_UNWIND_NO_REASON:
             return False
 
+        t = self.type_lookup(f)
+
+        if t is None:
+            return False
+
         self.extract(f)
-        self.type_lookup(f)
+
+        print(t, prev_entry)
 
         return False
 
@@ -44,11 +50,11 @@ class EntryExitBreakpoint(gdb.Breakpoint):
 
         if self.number in entries:
             # extract size from correct register
-            if int(gdb.parse_and_eval(break_arg[frame.name()])) > 0:
-                prev_entry = f"size={gdb.parse_and_eval(break_arg[frame.name()])}"
+            if int(frame.read_register(break_arg[frame.name()])) > 0:
+                prev_entry = f"size={frame.read_register(break_arg[frame.name()])}"
         elif self.number in exits and prev_entry is not None:
             # extract return value, print for now
-            print(f"{prev_entry}, ret={hex(int(str(gdb.parse_and_eval('$rax')), 10) & (2 ** 64 - 1))}", flush=True)
+            print(f"{prev_entry}, ret={hex(int(str(frame.read_register('rax')), 10) & (2 ** 64 - 1))}", flush=True)
             prev_entry = None
 
     def type_lookup(self, frame):
@@ -66,10 +72,12 @@ class EntryExitBreakpoint(gdb.Breakpoint):
             key = f"{symtab.filename}:{sym.line}"
 
             if key in types:
-                print(types[key])
+                return types[key]
 
             f_iter = f_iter.older()
 
+        return None
+
 class Stage3():
     breakpoints = []