Chisel, your debugger on steroids

We all use the occasional print statement in our code to help with debugging. Advanced users use breakpoints to inspect the values of variables and state. I never knew there where so many helper methods for your lldb debugger.

Using the lldb debugger

Using the lldb debugger

For a long time I’ve been using the po variable in the debugger to inspect the variable, or even to evaluate a query like po variable.property. Seems I learn something new every time I do some research on the Xcode debugger.

 

I recently discovered Chisel, a collection of even more helpful lldb commands. I’ve listed all the available commands below.

(lldb) help

Debugger commands:
  apropos           -- List debugger commands related 
                       to a word or subject.
  breakpoint        -- Commands for operating on
                       breakpoints
                       (see 'help b' for shorthand.)
  bugreport         -- Commands for creating 
                       domain-specific bug reports.
  command           -- Commands for managing custom
                       LLDB commands.
  disassemble       -- Disassemble specified 
                       instructions in the current 
                       target. Defaults to the current
                       function for the current thread
                       and stack frame.
  expression        -- Evaluate an expression on the 
                       current thread. Displays any 
                       returned value with LLDB's 
                       default formatting.
  frame             -- Commands for selecting and
                       examine the current thread's 
                       stack frames.
  gdb-remote        -- Connect to a process via 
                       remote GDB server. If no host
                       is specified, localhost is 
                       assumed.
  gui               -- Switch into the curses based
                       GUI mode.
  help              -- Show a list of all debugger
                       commands, or give details about
                       a specific command.
  kdp-remote        -- Connect to a process via 
                       remote KDP server. If no UDP
                       port is specified, port 
                       41139 is assumed.
  language          -- Commands specific to a
                       source language.
  log               -- Commands controlling LLDB 
                       internal logging.
  memory            -- Commands for operating on 
                       memory in the current target
                       process.
  platform          -- Commands to manage and create 
                       platforms.
  plugin            -- Commands for managing 
                       LLDB plugins.
  process           -- Commands for interacting
                       with processes on the current
                       platform.
  quit              -- Quit the LLDB debugger.
  register          -- Commands to access registers
                       for the  current thread and
                       stack frame.
  script            -- Invoke the script interpreter
                       with provided code and display
                       any results.  Start the 
                       interactive interpreter if 
                       no code is supplied.
  settings          -- Commands for managing 
                       LLDB settings.
  source            -- Commands for examining 
                       source code described by
                       debug information for the
                       current target process.
  target            -- Commands for operating on
                       debugger targets.
  thread            -- Commands for operating on 
                       one or more threads in the
                       current process.
  type              -- Commands for operating on 
                       the type system.
  version           -- Show the LLDB debugger version.
  watchpoint        -- Commands for operating
                       on watchpoints.

Current command abbreviations 
(type 'help command alias' for more info):
  add-dsym  -- Add a debug symbol file to one 
               of the target's current modules
               by specifying a path to a 
               debug symbols file, or using 
               the options to  specify a module
               to download symbols for.
  attach    -- Attach to process by ID or name.
  b         -- Set a breakpoint using one of several 
               shorthand formats.
  bt        -- Show the current thread's call stack.
               Any numeric argument displays at most
               that many frames. The argument 'all'
               displays all threads.
  c         -- Continue execution of all threads in
               the current process.
  call      -- Evaluate an expression on the 
               current thread. Displays any returned
               value with LLDB's default formatting.
  continue  -- Continue execution of all threads
               in the current process.
  detach    -- Detach from the current target process.
  di        -- Disassemble specified instructions
               in the current target. Defaults to
               the current function for the current
               thread and stack frame.
  dis       -- Disassemble specified instructions
               in the current target. Defaults to
               the current function for the current
               thread and stack frame.
  display   -- Evaluate an expression at every
               stop (see 'help target stop-hook'.)
  down      -- Select a newer stack frame. 
               Defaults to moving one frame,
               a numeric argument can specify 
               an arbitrary number.
  env       -- Shorthand for viewing and setting 
               environment variables.
  exit      -- Quit the LLDB debugger.
  f         -- Select the current stack frame
               by index from within the current
               thread (see 'thread backtrace'.)
  file      -- Create a target using the argument
               as the main executable.
  finish    -- Finish executing the current
               stack frame and stop after returning.
               Defaults to current
               thread unless specified.
  image     -- Commands for accessing information
               for one or more target modules.
  j         -- Set the program counter
               to a new address.
  jump      -- Set the program counter 
               to a new address.
  kill      -- Terminate the current target process.
  l         -- List relevant source code using
               one of several shorthand formats.
  list      -- List relevant source code using
               one of several shorthand formats.
  n         -- Source level single step, 
               stepping over calls. Defaults to
               current thread unless specified.
  next      -- Source level single step, 
               stepping over calls. Defaults to 
               current thread unless specified.
  nexti     -- Instruction level single step,
               stepping over calls. Defaults to 
               current thread unless specified.
  ni        -- Instruction level single step,
               stepping over calls. Defaults to
               current thread unless specified.
  p         -- Evaluate an expression on the 
               current thread. Displays any returned
               value with LLDB's default formatting.
  parray    -- Evaluate an expression on the
               current thread. Displays any returned 
               value with LLDB's default formatting.
  po        -- Evaluate an expression on the
               current thread. Displays any returned
               value with formatting controlled by
               the type's author.
  poarray   -- Evaluate an expression on the
               current thread. Displays any returned
               value with LLDB's default formatting.
  print     -- Evaluate an expression on the
               current thread. Displays any returned
               value with LLDB's default formatting.
  q         -- Quit the LLDB debugger.
  r         -- Launch the executable in the debugger.
  rbreak    -- Sets a breakpoint or set of
               breakpoints in the executable.
  repl      -- Evaluate an expression on the
               current thread. Displays any returned
               value with LLDB's default formatting.
  run       -- Launch the executable in the debugger.
  s         -- Source level single step, 
               stepping into calls. Defaults to
               current thread unless specified.
  si        -- Instruction level single step,
               stepping into calls. Defaults to
               current thread unless specified.
  sif       -- Step through the current block,
               stopping if you step directly 
               into a function whose name 
               matches the TargetFunctionName.
  step      -- Source level single step, 
               stepping into calls. Defaults to
               current thread unless specified.
  stepi     -- Instruction level single step, 
               stepping into calls. Defaults to
               current thread unless specified.
  t         -- Change the currently selected thread.
  tbreak    -- Set a one-shot breakpoint using
               one of several shorthand formats.
  undisplay -- Stop displaying expression at
               every stop
               (specified by stop-hook index.)
  up        -- Select an older stack frame. 
               Defaults to moving one frame,
               a numeric argument can specify 
               an arbitrary number.
  x         -- Read from the memory of the current
               target  process.

The commands added by Chisel:

Current user-defined commands:

  alamborder    -- Put a border around views 
                   with an ambiguous layout
  alamunborder  -- Removes the border around views
                   with an ambiguous layout
  bdisable      -- Disable a set of breakpoints for
                   a regular expression
  benable       -- Enable a set of breakpoints for
                   a regular expression
  binside       -- Set a breakpoint for a relative
                   address within the framework / 
                   library that's currently running.
                   This does the work of finding the
                   offset for the framework / 
                   library and sliding your address 
                   accordingly.
  bmessage      -- Set a breakpoint for a selector
                   on a class, even if the class 
                   itself doesn't override that 
                   selector. It walks the hierarchy 
                   until it finds a class that does
                   implement the selector and sets 
                   a conditionalbreakpoint there.
  border        -- Draws a border around <viewOrLayer>.
                   Color  and width can be optionally
                   provided.  Additionally depth can
                   be provided in order to recursively
                   border subviews.
  caflush       -- Force Core Animation to flush. 
                   This will 'repaint' the UI but 
                   also may mess with ongoing
                   animations.
  dcomponents   -- Set debugging options for components.
  dismiss       -- Dismiss a presented view controller.
  fa11y         -- Find the views whose accessibility 
                   labels match labelRegex and puts
                   the address of the first result
                   on the clipboard.
  findinstances -- Find instances of specified 
                   ObjC classes.
  flicker       -- Quickly show and hide a view
                   to quickly help visualize where
                   it is.
  fv            -- Find the views whose class names
                   match classNameRegex and puts the
                   address of first on the clipboard.
  fvc           -- Find the view controllers whose
                   class names match classNameRegex
                   and puts the address of first
                   on the clipboard.
  heapfrom      -- Show all nested heap pointers
                   contained within a given variable.
  hide          -- Hide a view or layer.
  mask          -- Add a transparent rectangle to
                   the window to reveal a possibly
                   obscured or hidden view or 
                   layer's bounds
  mwarning      -- simulate a memory warning
  pa11y         -- Print accessibility labels of
                   all views in hierarchy of 
                   <aView>
  pa11yi        -- Print accessibility identifiers
                   of all views in hierarchy of 
                   <aView>
  pactions      -- Print the actions and targets of
                   a control.
  paltrace      -- Print the Auto Layout trace for 
                   the given view. Defaults to the
                   key window.
  panim         -- Prints if the code is currently
                   execution with a UIView animation
                   block.
  pbcopy        -- Print object and copy output 
                   to clipboard
  pblock        -- Print the block`s implementation
                   address and signature
  pbundlepath   -- Print application's bundle
                   directory path.
  pca           -- Print layer tree from the 
                   perspective of the render 
                   server.
  pcells        -- Print the visible cells of the 
                   highest table view in the 
                   hierarchy.
  pclass        -- Print the inheritance starting 
                   from an instance of any class.
  pcomponents   -- Print a recursive description
                   of components found starting
                   from <aView>.
  pcurl         -- Print the NSURLRequest (HTTP) 
                   as curl command.
  pdata         -- Print the contents of NSData 
                   object as string.
  pdocspath     -- Print application's 'Documents' 
                   directory path.
  pinternals    -- Show the internals of an object
                   by dereferencing it as a pointer.
  pinvocation   -- Print the stack frame, receiver,
                   and arguments of the current 
                   invocation. It will fail to print
                   all arguments if any arguments
                   are variadic (varargs).
  pivar         -- Print the value of an object's 
                   named instance variable.
  pjson         -- Print JSON representation of 
                   NSDictionary or NSArray object
  pkp           -- Print out the value of the key
                   path expression using 
                   -valueForKeyPath:
  pmethods      -- Print the class and instance 
                   methods of a class.
  poobjc        -- Print the expression result, 
                   with the expression run in an 
                   ObjC++ context. 
                   (Shortcut for 
                   "expression -O -l ObjC++ -- " )
  pproperties   -- Print the properties of an 
                   instance or Class
  present       -- Present a view controller.
  presponder    -- Print the responder chain starting
                   from a specific responder.
  ptv           -- Print the highest table view in
                   the hierarchy.
  pvc           -- Print the recursion description 
                   of <aViewController>.
  pviews        -- Print the recursion description
                   of <aView>.
  rcomponents   -- Synchronously reflow and update
                   all components.
  sequence      -- Run commands in sequence,
                   stopping on any error.
  setinput      -- Input text into text field or 
                   text view that is first responder.
  settext       -- Set text on text on a view by 
                   accessibility id.
  show          -- Show a view or layer.
  slowanim      -- Slows down animations. Works on 
                   the iOS Simulator and a device.
  taplog        -- Log tapped view to the console.
  unborder      -- Removes border around 
                   <viewOrLayer>.
  unmask        -- Remove mask from a view or layer
  unslowanim    -- Turn off slow animations.
  visualize     -- Open a UIImage, CGImageRef, UIView,
                   or CALayer in Preview.app on your
                   Mac.
  vs            -- Interactively search for a view by
                   walking the hierarchy.
  wivar         -- Set a watchpoint for an object's
                   instance variable.
  xdebug        -- Print debug description the 
                   XCUIElement in human readable
                   format.
  xnoid         -- Print XCUIElement objects with 
                   label but without identifier.
  xobject       -- Print XCUIElement details.
  xtree         -- Print XCUIElement subtree.
  zzz           -- Executes specified lldb command
                   after delay.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.