|Number of watchers on Github||6574|
|Number of open issues||37|
|Average time to close an issue||about 1 month|
|Average time to merge a PR||14 days|
|Open pull requests||21+|
|Closed pull requests||12+|
|Last commit||over 1 year ago|
|Repo Created||over 5 years ago|
|Repo Last Updated||over 1 year ago|
|Organization / Author|
|Do you use chisel? Leave a review!|
|View open issues (37)|
|View chisel activity|
|View on github|
|Fresh, new opensource launches 🚀🚀🚀|
Trendy new open source projects in your inbox! View examples
Chisel is a collection of
LLDB commands to assist in the debugging of iOS apps.
brew update brew install chisel
.lldbinit file doesn't exist you can create it & open it by tapping on the terminal
touch .lldbinit open .lldbinit
Then add the following line to your
# ~/.lldbinit ... command script import /usr/local/opt/chisel/libexec/fblldb.py
Alternatively, download chisel and add the following line to your ~/.lldbinit file.
# ~/.lldbinit ... command script import /path/to/fblldb.py
The commands will be available the next time
There are many commands; here's a few: (Compatibility with iOS/Mac indicated at right)
|pviews||Print the recursive view description for the key window.||Yes||Yes|
|pvc||Print the recursive view controller description for the key window.||Yes||No|
|fv||Find a view in the hierarchy whose class name matches the provided regex.||Yes||No|
|fvc||Find a view controller in the hierarchy whose class name matches the provided regex.||Yes||No|
|show/hide||Show or hide the given view or layer. You don't even have to continue the process to see the changes!||Yes||Yes|
|mask/unmask||Overlay a view or layer with a transparent rectangle to visualize where it is.||Yes||No|
|border/unborder||Add a border to a view or layer to visualize where it is.||Yes||Yes|
|caflush||Flush the render server (equivalent to a
repaintif no animations are in-flight).
|bmessage||Set a symbolic breakpoint on the method of a class or the method of an instance without worrying which class in the hierarchy actually implements the method.||Yes||Yes|
|wivar||Set a watchpoint on an instance variable of an object.||Yes||Yes|
|presponder||Print the responder chain starting from the given object.||Yes||Yes|
|...||... and many more!|
To see the list of all of the commands execute the help command in
LLDB or go to the Wiki.
(lldb) help The following is a list of built-in, permanent debugger commands: ... The following is a list of your current user-defined commands: ...
The bottom of the list will contain all of the commands sourced from
You can also inspect a specific command by passing its name as an argument to the help command (as with all other
(lldb) help border Draws a border around <viewOrLayer>. Color and width can be optionally provided. Arguments: <viewOrLayer>; Type: UIView*; The view to border. Options: --color/-c <color>; Type: string; A color name such as 'red', 'green', 'magenta', etc. --width/-w <width>; Type: CGFloat; Desired width of border. Syntax: border [--color=color] [--width=width] <viewOrLayer>
All of the commands provided by
Chisel come with verbose help. Be sure to read it when in doubt!
You can add local, custom commands. Here's a contrived example.
#!/usr/bin/python # Example file with custom commands, located at /magical/commands/example.py import lldb import fblldbbase as fb def lldbcommands(): return [ PrintKeyWindowLevel() ] class PrintKeyWindowLevel(fb.FBCommand): def name(self): return 'pkeywinlevel' def description(self): return 'An incredibly contrived command that prints the window level of the key window.' def run(self, arguments, options): # It's a good habit to explicitly cast the type of all return # values and arguments. LLDB can't always find them on its own. lldb.debugger.HandleCommand('p (CGFloat)[(id)[(id)[UIApplication sharedApplication] keyWindow] windowLevel]')
Then all that's left is to source the commands in lldbinit.
Chisel has a python function just for this, loadCommandsInDirectory in the fblldb.py module.
# ~/.lldbinit ... command script import /path/to/fblldb.py script fblldb.loadCommandsInDirectory('/magical/commands/')
There's also builtin support to make it super easy to specify the arguments and options that a command takes. See the border and pinvocation commands for example use.
Developing commands, whether for local use or contributing to
Chisel directly, both follow the same workflow. Create a command as described in the Custom Commands section and then
Xcode's debug bar or
process interruptif attached directly)
command source ~/.lldbinitin LLDB to source the commands
Please contribute any generic commands that you make. If it helps you then it will likely help many others! :D See
CONTRIBUTING.md to learn how to contribute.
Chisel is BSD-licensed. See
This minor release fixes an issue with Chisel.xcodeproj (#218).
This release adds a new command,
findinstances, fixes a bug (#209), and adds installation documentation.
findinstanceswhich finds object instances in memory, by type and filtered by predicate (@kastiglione, #197, #216)
Makefilefor installing Chisel's library (@keith, #214)
pvc(@kastiglione, #209, #210)
This release includes new commands and bug fixes to existing commands. Thank you for all issues and pull requests! This also has some breaking changes, but hopefully they do make things better.
-aflag to print object internals using
rcomponents: Update ComponentKit debugging helper (@adamjernst, #178)
zzz: New command to run an lldb command after a delay (@zats, #179)
pa11y: Force start of accessibility server (@bartoszj , #189)
xnoidcommands (@bartoszj, #192)
Plus, a few fixes to commands support Swift and iOS 11.