By Jason Brennan
LLDB is the current state of the art for iOS debugging, but it’s clunky and cumbersome and doesn’t work well with objects. It really doesn't feel very different from gdb
. It's a solid tool but it requires breakpoints, and although you can integrate with Objective C apps, it's not really built for it. Dealing with objects is cumbersome, and it's hard to see your changes.
This is where Super Debugger comes in. It's a new tool for rapidly exploring your objects in an iOS app whether they're running on an iPhone, iPad, or the iOS Simulator, and it's available today on Github. Check over the included readme to see what it can do in detail.
Today we're going to run through a demonstration of an included app called Debug Me
.
-
Clone the
superdb
repository locally to your Mac and change into the directory.git clone https://github.com/Shopify/superdb.git cd superdb
-
Open the included workspace file,
SuperDebug.xcworkspace
, select theDebug Me
target and Build and Run it for your iOS device or the Simulator. Make sure the device is on the same wifi network as your Mac. -
Go back to Xcode and change to the
Super Debug
target. This is the Mac app that you'll use to talk to your iOS app. Build and Run this app. -
In Super Debug, you'll see a window with a list of running, debuggable apps. Find
Debug Me
in the list (hint: it's probably the only one!) and double click it. This will open up the shell view where you can send messages to the objects in your app, all without setting a single break point. -
Now let's follow the instructions shown to us by the Debug Me app.
-
In the Mac app, issue the command
.self
(note the leading dot). This updates theself pointer
, which will execute a Block in the App delegate that returns whatever we want to be pointed to by the variableself
. In this case (and in most cases), we wantself
to point to the current view controller. ForDebug Me
, that means it points to our instance ofDBMEViewController
after we issue this command. -
Now that our pointer is set up, we can send a message to that pointer. Type
self redView layer setMasksToBounds:YES
. This sends a chain of messages inF-Script
syntax. In Objective C, it would look like[[[self redView] layer] setMasksToBounds:YES]
. Here we omit the braces because of our syntax.We do use parentheis sometimes, when passing the result of a message send would be ambiguous, for example something like this in Objective C:
[view setBackgroundColor:[UIColor purpleColor]]
would beview setBackgroundColor:(UIColor purpleColor)
in our syntax. -
The previous step has no visible result, so lets make a change. Type
self redView layer setCornerRadius:15
and see the red view get nice rounded corners! -
Now for the impressive part. Move your mouse over the number
15
and see it highlight. Now click and drag left or right, and see the view's corner radius update in real time. Awesome, huh?
That should be enough to give you a taste of this brand new debugger. Interact with your objects in real-time. Iterate instantly. No more build, compile, wait. It's now Run, Test, Change. Fork the project on Github and get started today.