[Lldb-commits] [lldb] 2be791e - Insert crashing stack frame when call to null func ptr

Jason Molenda via lldb-commits lldb-commits at lists.llvm.org
Thu May 5 17:55:28 PDT 2022


Author: Jason Molenda
Date: 2022-05-05T17:55:22-07:00
New Revision: 2be791e32af33b7ef735bb180a8a91ee501d0560

URL: https://github.com/llvm/llvm-project/commit/2be791e32af33b7ef735bb180a8a91ee501d0560
DIFF: https://github.com/llvm/llvm-project/commit/2be791e32af33b7ef735bb180a8a91ee501d0560.diff

LOG: Insert crashing stack frame when call to null func ptr

On arm64 targets, when the crashing pc is 0, the caller
frame can be found by looking at $lr, but the crash
reports don't use that trick to show the actual crashing
frame.  This patch adds that stack frame that lldb shows.

Also fix an issue where some register names were printed
as having a prefix of 'None'.

Differential Revision: https://reviews.llvm.org/D125042
rdar://92631787

Added: 
    

Modified: 
    lldb/examples/python/crashlog.py

Removed: 
    


################################################################################
diff  --git a/lldb/examples/python/crashlog.py b/lldb/examples/python/crashlog.py
index e0bd52d8711ef..bc34bf75f8b19 100755
--- a/lldb/examples/python/crashlog.py
+++ b/lldb/examples/python/crashlog.py
@@ -516,6 +516,23 @@ def parse_frames(self, thread, json_frames):
             image_addr = self.get_used_image(image_id)['base']
             pc = image_addr + frame_offset
             thread.frames.append(self.crashlog.Frame(idx, pc, frame_offset))
+
+            # on arm64 systems, if it jump through a null function pointer,
+            # we end up at address 0 and the crash reporter unwinder 
+            # misses the frame that actually faulted.  
+            # But $lr can tell us where the last BL/BLR instruction used 
+            # was at, so insert that address as the caller stack frame.  
+            if idx == 0 and pc == 0 and "lr" in thread.registers:
+                pc = thread.registers["lr"]
+                for image in self.data['usedImages']:
+                    text_lo = image['base']
+                    text_hi = text_lo + image['size']
+                    if text_lo <= pc < text_hi:
+                      idx += 1
+                      frame_offset = pc - text_lo
+                      thread.frames.append(self.crashlog.Frame(idx, pc, frame_offset))
+                      break
+
             idx += 1
 
     def parse_threads(self, json_threads):
@@ -551,7 +568,7 @@ def parse_thread_registers(self, json_thread_state, prefix=None):
                 continue
             try:
                 value = int(state['value'])
-                registers["{}{}".format(prefix,key)] = value
+                registers["{}{}".format(prefix or '',key)] = value
             except (KeyError, ValueError, TypeError):
                 pass
         return registers


        


More information about the lldb-commits mailing list