Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save antonjn/1b2101571e3e1a98dee9 to your computer and use it in GitHub Desktop.
Save antonjn/1b2101571e3e1a98dee9 to your computer and use it in GitHub Desktop.
import lldb
def GetFirstArgumentAsValue(target, frame):
# Note: I assume the PC is at the first instruction of the function, before the stack and registers have been modified.
if target.triple.startswith('x86_64'):
return frame.regs[0].GetChildMemberWithName("rdi")
elif target.triple.startswith('i386'):
espValue = frame.regs[0].GetChildMemberWithName("esp")
address = espValue.GetValueAsUnsigned() + target.addr_size
return espValue.CreateValueFromAddress('arg0', address, target.FindFirstType('id'))
else:
return frame.regs[0].GetChildMemberWithName("r0")
def command(debugger, user_input, result, unused):
target = debugger.GetSelectedTarget()
frame = target.GetProcess().GetSelectedThread().GetFrameAtIndex(0)
description = GetFirstArgumentAsValue(target, frame).GetObjectDescription()
if description is None:
output = "I couldn't get the description of the exception being thrown."
else:
output = "Description of exception being thrown: " + repr(description)
result.PutCString(output)
return None
def __lldb_init_module(debugger, unused):
debugger.HandleCommand('command script add --function sniff_objc_exception_throw.command sniff_objc_exception_throw')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment