Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Xcode debugger (lldb) get object description from memory address

Little-known fact: It is now possible, in Xcode, while paused in the debugger, to introspect the notification center to learn what objects are registered to receive what notifications:

(lldb) po NotificationCenter.default

<NSNotificationCenter:0x6040000d40b0>
Name, Object, Observer, Options
com.apple.accessibility.reduce.motion.status, 0x10b126190, 0x7fc795700140, 1001
com.apple.accessibility.asst.scanner.status, 0x10b126190, 0x7fc795700140, 1001
// ... etc. ...

Very nice, but how do I go from obtaining the memory address 0x7fc795700140 to learning what object that is?

EDIT I'm leaving this question here, but I think the correct answer is the kind of thing shown at LLDB (Swift): Casting Raw Address into Usable Type

like image 388
matt Avatar asked Aug 02 '17 14:08

matt


Video Answer


2 Answers

First, the LLDB commands I used.

(lldb) expr -l objc -O -- 0x600001582d00

<__NSArrayI 0x600001582d00>(
<UIStoryboardShowSegueTemplate: 0x600002c3e4c0>,
<UIStoryboardPresentationSegueTemplate: 0x600001582210>,
<UIStoryboardPresentationSegueTemplate: 0x600001582620>,
<UIStoryboardShowSegueTemplate: 0x600002c3f4c0>,
<UIStoryboardPresentationSegueTemplate: 0x6000015839d0>,
<UIStoryboardShowSegueTemplate: 0x600002c3d680>,
<UIStoryboardEmbedSegueTemplate: 0x600002c3dc40>
)

For an instance of a Swift class.

expr -l swift -O -- 

For an instance of an Objective-C class.

expr -l objc -O --

For an instance of a C class.

expr -l c -O --

Now, an explanation. I had the joy of fixing over 1400 lemory leaks in our jr. iOS developers' code. Often when in the Memory Graph Debugger, and I was inspecting leaked objects, all that I had was the object’s address in memory. This was in an Objective-C and Swift app, so we had to be able to inspect objects from both languages. While in LLDB, I had to specify the language of the variable at the memory address being inspected. This worked in Swift and Objective-C. What I provided above is sample output and examples of the command for Swift, Objective-C and C.

like image 51
Alex Zavatone Avatar answered Nov 15 '22 21:11

Alex Zavatone


po works for addresses (In Objective-C/Mac context, at least)

e.g.:

(lldb) po [NSNotificationCenter defaultCenter]

NSWindowDidResizeNotification, 0x7fff9a0e98e0, 0x6100001246a0, 1400

(lldb) po 0x6100001246a0

ExpandOneView: 0x6100001246a0

like image 23
Phillip Mills Avatar answered Nov 15 '22 23:11

Phillip Mills