The only solution I got to work was using breakpoints.
I added a breakpoint at __CFXNotificationPost_old
(CoreFoundation) and bundled that with a Debugger Command po {NSNotification *}($ebp+12)
. All of this is nicely doable within the Xcode GUI:
- click on "Run" on the Xcode application menu (top of the screen)
- select "Debugger"
- within the Debugger window click on "Show-Breakpoints"
- click on the "Enter Symbol-Name"-line and enter "__CFXNotificationPost_old"
- click on the "+" on the very right side
- select "Debugger Command" on that dropdown-list
- enter "po {NSNotification *}($ebp+12)
- (you may also want to activate logging by checking the "Log" checkbox at the bottom)
- run your app in a simulator-debug-session from within Xcode
The app will stop its execution whenever a NSNotification is posted and display it within the gdb-console.
I did try to create a tracepoint within gdb but failed because the tracepoint actions within Xcode gdb seem to buggy - or maybe I am just too stoopid to get them working.
I also tried to create a custom Instruments Dtrace script, but failed as my Dtrace Karate just isnt strong enough.
If you manage to get any of the latter options to work, please go ahead and post them as an alternative answer - I will upvote and mark them as the favored one.
UPDATE
Ages after this question, I found the right way of trapping all notifications on the CoreFoundation level.
This is how it can be done:
void MyCallBack (CFNotificationCenterRef center,
void *observer,
CFStringRef name,
const void *object,
CFDictionaryRef userInfo)
{
NSLog(@"name: %@", name);
NSLog(@"userinfo: %@", userInfo);
}
CFNotificationCenterAddObserver(CFNotificationCenterGetLocalCenter(),
NULL,
MyCallBack,
NULL,
NULL,
CFNotificationSuspensionBehaviorDeliverImmediately);
I actually feel a little ashamed that I did not look closer at CoreFoundation's interface before.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…