Skip to content

Instantly share code, notes, and snippets.

@neror
Created March 12, 2011 23:55
Show Gist options
  • Save neror/867716 to your computer and use it in GitHub Desktop.
Save neror/867716 to your computer and use it in GitHub Desktop.
Trace call stacks of random objc methods
neror@neror-laptop:~/Work/Cocoa/DTrace$ ps aux|grep FTAnimationExamples
neror 21643 0.0 0.0 2435120 544 s000 S+ 6:21PM 0:00.00 grep FTAnimationExamples
neror 21570 0.0 0.3 777004 27784 ?? SX 6:12PM 0:02.81 /Users/neror/Library/Application Support/iPhone Simulator/4.3/Applications/C624085B-7FA1-4860-BE75-EEF244470FBF/FTAnimationExamples.app/FTAnimationExamples
neror@neror-laptop:~/Work/Cocoa/DTrace$ sudo ./traceMethodFlow.d -p21570 "FTAnimation*" "-fade*"
dtrace: script './traceMethodFlow.d' matched 63636 probes
CPU FUNCTION
1 -> -fadeAnimationFor:duration:delegate:startSelector:stopSelector:fadeOut: FTAnimationManager
1 -> +animationWithKeyPath: CAPropertyAnimation
1 -> +alloc NSObject(NSObject)
1 -> +allocWithZone: NSObject(NSObject)
1 <- +allocWithZone: NSObject(NSObject)
1 <- +alloc NSObject(NSObject)
1 -> -init NSObject(NSObject)
1 <- -init NSObject(NSObject)
1 -> -setKeyPath: CAPropertyAnimation
1 <- -setKeyPath: CAPropertyAnimation
1 -> -willChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -observationInfo NSObject(NSKeyValueObservingCustomization)
1 <- -observationInfo NSObject(NSKeyValueObservingCustomization)
1 -> -_implicitObservationInfo NSObject(NSKeyValueObservingPrivate)
1 <- -_implicitObservationInfo NSObject(NSKeyValueObservingPrivate)
1 <- -willChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -respondsToSelector: NSObject(NSObject)
1 -> -class NSObject(NSObject)
1 <- -class NSObject(NSObject)
1 <- -respondsToSelector: NSObject(NSObject)
1 -> -copy NSObject(NSObject)
1 -> -copyWithZone: NSCFString
1 <- -copyWithZone: NSCFString
1 <- -copy NSObject(NSObject)
1 -> -didChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 <- -didChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 <- +animationWithKeyPath: CAPropertyAnimation
1 -> -autorelease NSObject(NSObject)
1 <- -autorelease NSObject(NSObject)
1 -> +numberWithFloat: NSNumber
1 -> +allocWithZone: NSNumber
1 <- +allocWithZone: NSNumber
1 -> -initWithFloat: NSPlaceholderNumber
1 <- -initWithFloat: NSPlaceholderNumber
1 <- +numberWithFloat: NSNumber
1 -> -autorelease NSObject(NSObject)
1 <- -autorelease NSObject(NSObject)
1 -> -setFromValue: CABasicAnimation
1 <- -setFromValue: CABasicAnimation
1 -> -willChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -observationInfo NSObject(NSKeyValueObservingCustomization)
1 <- -observationInfo NSObject(NSKeyValueObservingCustomization)
1 -> -_implicitObservationInfo NSObject(NSKeyValueObservingPrivate)
1 <- -_implicitObservationInfo NSObject(NSKeyValueObservingPrivate)
1 <- -willChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -didChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 <- -didChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> +numberWithFloat: NSNumber
1 -> +allocWithZone: NSNumber
1 <- +allocWithZone: NSNumber
1 -> -initWithFloat: NSPlaceholderNumber
1 <- -initWithFloat: NSPlaceholderNumber
1 <- +numberWithFloat: NSNumber
1 -> -autorelease NSObject(NSObject)
1 <- -autorelease NSObject(NSObject)
1 -> -setToValue: CABasicAnimation
1 <- -setToValue: CABasicAnimation
1 -> -willChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -observationInfo NSObject(NSKeyValueObservingCustomization)
1 <- -observationInfo NSObject(NSKeyValueObservingCustomization)
1 -> -_implicitObservationInfo NSObject(NSKeyValueObservingPrivate)
1 <- -_implicitObservationInfo NSObject(NSKeyValueObservingPrivate)
1 <- -willChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -didChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 <- -didChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> +arrayWithObject: NSArray
1 -> +alloc NSObject(NSObject)
1 -> +allocWithZone: NSArray
1 -> +self NSObject(NSObject)
1 <- +self NSObject(NSObject)
1 -> +immutablePlaceholder __NSPlaceholderArray
1 <- +immutablePlaceholder __NSPlaceholderArray
1 <- +allocWithZone: NSArray
1 <- +alloc NSObject(NSObject)
1 -> -initWithObjects:count: __NSPlaceholderArray
1 <- -initWithObjects:count: __NSPlaceholderArray
1 -> +__new:: __NSArrayI
1 -> -retain NSObject(NSObject)
1 <- -retain NSObject(NSObject)
1 <- +__new:: __NSArrayI
1 -> -autorelease NSObject(NSObject)
1 <- -autorelease NSObject(NSObject)
1 <- +arrayWithObject: NSArray
1 -> -animationGroupFor:withView:duration:delegate:startSelector:stopSelector:name:type: FTAnimationManager
1 -> +animation CAAnimation
1 -> +alloc NSObject(NSObject)
1 -> +allocWithZone: NSObject(NSObject)
1 <- +allocWithZone: NSObject(NSObject)
1 <- +alloc NSObject(NSObject)
1 -> -init NSObject(NSObject)
1 <- -init NSObject(NSObject)
1 <- +animation CAAnimation
1 -> -autorelease NSObject(NSObject)
1 <- -autorelease NSObject(NSObject)
1 -> +arrayWithArray: NSArray
1 -> +alloc NSObject(NSObject)
1 -> +allocWithZone: NSArray
1 -> +self NSObject(NSObject)
1 <- +self NSObject(NSObject)
1 -> +immutablePlaceholder __NSPlaceholderArray
1 <- +immutablePlaceholder __NSPlaceholderArray
1 <- +allocWithZone: NSArray
1 <- +alloc NSObject(NSObject)
1 -> -count __NSArrayI
1 <- -count __NSArrayI
1 -> -initWithArray:range:copyItems: NSArray
1 -> -count __NSArrayI
1 <- -count __NSArrayI
1 -> -getObjects:range: __NSArrayI
1 <- -getObjects:range: __NSArrayI
1 -> -initWithObjects:count: __NSPlaceholderArray
1 <- -initWithObjects:count: __NSPlaceholderArray
1 -> +__new:: __NSArrayI
1 -> -retain NSObject(NSObject)
1 <- -retain NSObject(NSObject)
1 <- +__new:: __NSArrayI
1 <- -initWithArray:range:copyItems: NSArray
1 <- +arrayWithArray: NSArray
1 -> -autorelease NSObject(NSObject)
1 <- -autorelease NSObject(NSObject)
1 -> -setAnimations: CAAnimationGroup
1 <- -setAnimations: CAAnimationGroup
1 -> -willChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -observationInfo NSObject(NSKeyValueObservingCustomization)
1 <- -observationInfo NSObject(NSKeyValueObservingCustomization)
1 -> -_implicitObservationInfo NSObject(NSKeyValueObservingPrivate)
1 <- -_implicitObservationInfo NSObject(NSKeyValueObservingPrivate)
1 <- -willChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -respondsToSelector: NSObject(NSObject)
1 -> -class NSObject(NSObject)
1 <- -class NSObject(NSObject)
1 <- -respondsToSelector: NSObject(NSObject)
1 -> -copy NSObject(NSObject)
1 -> -copyWithZone: __NSArrayI
1 <- -copyWithZone: __NSArrayI
1 -> -retain NSObject(NSObject)
1 <- -retain NSObject(NSObject)
1 <- -copy NSObject(NSObject)
1 -> -didChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 <- -didChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -setDelegate: CAAnimation
1 <- -setDelegate: CAAnimation
1 -> -willChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -observationInfo NSObject(NSKeyValueObservingCustomization)
1 <- -observationInfo NSObject(NSKeyValueObservingCustomization)
1 -> -_implicitObservationInfo NSObject(NSKeyValueObservingPrivate)
1 <- -_implicitObservationInfo NSObject(NSKeyValueObservingPrivate)
1 <- -willChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -retain NSObject(NSObject)
1 <- -retain NSObject(NSObject)
1 -> -didChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 <- -didChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -setDuration: CAAnimation
1 <- -setDuration: CAAnimation
1 -> -willChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -observationInfo NSObject(NSKeyValueObservingCustomization)
1 <- -observationInfo NSObject(NSKeyValueObservingCustomization)
1 -> -_implicitObservationInfo NSObject(NSKeyValueObservingPrivate)
1 <- -_implicitObservationInfo NSObject(NSKeyValueObservingPrivate)
1 <- -willChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -didChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 <- -didChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -setRemovedOnCompletion: CAAnimation
1 <- -setRemovedOnCompletion: CAAnimation
1 -> -willChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -observationInfo NSObject(NSKeyValueObservingCustomization)
1 <- -observationInfo NSObject(NSKeyValueObservingCustomization)
1 -> -_implicitObservationInfo NSObject(NSKeyValueObservingPrivate)
1 <- -_implicitObservationInfo NSObject(NSKeyValueObservingPrivate)
1 <- -willChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -didChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 <- -didChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -isEqualToString: NSCFString
1 -> -class NSObject(NSObject)
1 <- -class NSObject(NSObject)
1 <- -isEqualToString: NSCFString
1 -> +functionWithName: CAMediaTimingFunction
1 -> -isEqualToString: NSCFString
1 -> -class NSObject(NSObject)
1 <- -class NSObject(NSObject)
1 <- -isEqualToString: NSCFString
1 -> -isEqualToString: NSCFString
1 <- -isEqualToString: NSCFString
1 <- +functionWithName: CAMediaTimingFunction
1 -> -setTimingFunction: CAAnimation
1 <- -setTimingFunction: CAAnimation
1 -> -willChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -observationInfo NSObject(NSKeyValueObservingCustomization)
1 <- -observationInfo NSObject(NSKeyValueObservingCustomization)
1 -> -_implicitObservationInfo NSObject(NSKeyValueObservingPrivate)
1 <- -_implicitObservationInfo NSObject(NSKeyValueObservingPrivate)
1 <- -willChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -retain NSObject(NSObject)
1 <- -retain NSObject(NSObject)
1 -> -didChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 <- -didChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -setValue:forKey: CAAnimation
1 -> +superclass NSObject(NSObject)
1 <- +superclass NSObject(NSObject)
1 <- -setValue:forKey: CAAnimation
1 -> -class NSObject(NSObject)
1 <- -class NSObject(NSObject)
1 -> -setValue:forKey: NSObject(NSKeyValueCoding)
1 -> -setValue:forUndefinedKey: CAAnimation
1 -> -willChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -observationInfo NSObject(NSKeyValueObservingCustomization)
1 <- -observationInfo NSObject(NSKeyValueObservingCustomization)
1 -> -_implicitObservationInfo NSObject(NSKeyValueObservingPrivate)
1 <- -_implicitObservationInfo NSObject(NSKeyValueObservingPrivate)
1 <- -willChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -retain NSObject(NSObject)
1 <- -retain NSObject(NSObject)
1 -> -didChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 <- -didChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 <- -setValue:forUndefinedKey: CAAnimation
1 <- -setValue:forKey: NSObject(NSKeyValueCoding)
1 -> -setValue:forKey: CAAnimation
1 -> +superclass NSObject(NSObject)
1 <- +superclass NSObject(NSObject)
1 <- -setValue:forKey: CAAnimation
1 -> -class NSObject(NSObject)
1 <- -class NSObject(NSObject)
1 -> -setValue:forKey: NSObject(NSKeyValueCoding)
1 -> -setValue:forUndefinedKey: CAAnimation
1 -> -willChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -observationInfo NSObject(NSKeyValueObservingCustomization)
1 <- -observationInfo NSObject(NSKeyValueObservingCustomization)
1 -> -_implicitObservationInfo NSObject(NSKeyValueObservingPrivate)
1 <- -_implicitObservationInfo NSObject(NSKeyValueObservingPrivate)
1 <- -willChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -didChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 <- -didChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 <- -setValue:forUndefinedKey: CAAnimation
1 <- -setValue:forKey: NSObject(NSKeyValueCoding)
1 -> +stringWithUTF8String: NSString
1 -> +allocWithZone: NSString
1 <- +allocWithZone: NSString
1 -> -initWithBytes:length:encoding: NSPlaceholderString
1 <- -initWithBytes:length:encoding: NSPlaceholderString
1 <- +stringWithUTF8String: NSString
1 -> -autorelease NSObject(NSObject)
1 <- -autorelease NSObject(NSObject)
1 -> -setValue:forKey: CAAnimation
1 -> +superclass NSObject(NSObject)
1 <- +superclass NSObject(NSObject)
1 <- -setValue:forKey: CAAnimation
1 -> -class NSObject(NSObject)
1 <- -class NSObject(NSObject)
1 -> -setValue:forKey: NSObject(NSKeyValueCoding)
1 -> -setValue:forUndefinedKey: CAAnimation
1 -> -willChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -observationInfo NSObject(NSKeyValueObservingCustomization)
1 <- -observationInfo NSObject(NSKeyValueObservingCustomization)
1 -> -_implicitObservationInfo NSObject(NSKeyValueObservingPrivate)
1 <- -_implicitObservationInfo NSObject(NSKeyValueObservingPrivate)
1 <- -willChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -didChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 <- -didChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 <- -setValue:forUndefinedKey: CAAnimation
1 <- -setValue:forKey: NSObject(NSKeyValueCoding)
1 -> +stringWithUTF8String: NSString
1 -> +allocWithZone: NSString
1 <- +allocWithZone: NSString
1 -> -initWithBytes:length:encoding: NSPlaceholderString
1 <- -initWithBytes:length:encoding: NSPlaceholderString
1 <- +stringWithUTF8String: NSString
1 -> -autorelease NSObject(NSObject)
1 <- -autorelease NSObject(NSObject)
1 -> -setValue:forKey: CAAnimation
1 -> +superclass NSObject(NSObject)
1 <- +superclass NSObject(NSObject)
1 <- -setValue:forKey: CAAnimation
1 -> -class NSObject(NSObject)
1 <- -class NSObject(NSObject)
1 -> -setValue:forKey: NSObject(NSKeyValueCoding)
1 -> -setValue:forUndefinedKey: CAAnimation
1 -> -willChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -observationInfo NSObject(NSKeyValueObservingCustomization)
1 <- -observationInfo NSObject(NSKeyValueObservingCustomization)
1 -> -_implicitObservationInfo NSObject(NSKeyValueObservingPrivate)
1 <- -_implicitObservationInfo NSObject(NSKeyValueObservingPrivate)
1 <- -willChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -didChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 <- -didChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 <- -setValue:forUndefinedKey: CAAnimation
1 <- -setValue:forKey: NSObject(NSKeyValueCoding)
1 -> -setValue:forKey: CAAnimation
1 -> +superclass NSObject(NSObject)
1 <- +superclass NSObject(NSObject)
1 <- -setValue:forKey: CAAnimation
1 -> -class NSObject(NSObject)
1 <- -class NSObject(NSObject)
1 -> -setValue:forKey: NSObject(NSKeyValueCoding)
1 -> -setValue:forUndefinedKey: CAAnimation
1 -> -willChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -observationInfo NSObject(NSKeyValueObservingCustomization)
1 <- -observationInfo NSObject(NSKeyValueObservingCustomization)
1 -> -_implicitObservationInfo NSObject(NSKeyValueObservingPrivate)
1 <- -_implicitObservationInfo NSObject(NSKeyValueObservingPrivate)
1 <- -willChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -didChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 <- -didChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 <- -setValue:forUndefinedKey: CAAnimation
1 <- -setValue:forKey: NSObject(NSKeyValueCoding)
1 -> -setValue:forKey: CAAnimation
1 -> +superclass NSObject(NSObject)
1 <- +superclass NSObject(NSObject)
1 <- -setValue:forKey: CAAnimation
1 -> -class NSObject(NSObject)
1 <- -class NSObject(NSObject)
1 -> -setValue:forKey: NSObject(NSKeyValueCoding)
1 -> -setValue:forUndefinedKey: CAAnimation
1 -> -willChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -observationInfo NSObject(NSKeyValueObservingCustomization)
1 <- -observationInfo NSObject(NSKeyValueObservingCustomization)
1 -> -_implicitObservationInfo NSObject(NSKeyValueObservingPrivate)
1 <- -_implicitObservationInfo NSObject(NSKeyValueObservingPrivate)
1 <- -willChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -didChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 <- -didChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 <- -setValue:forUndefinedKey: CAAnimation
1 <- -setValue:forKey: NSObject(NSKeyValueCoding)
1 <- -animationGroupFor:withView:duration:delegate:startSelector:stopSelector:name:type: FTAnimationManager
1 -> +functionWithName: CAMediaTimingFunction
1 -> -isEqualToString: NSCFString
1 -> -class NSObject(NSObject)
1 <- -class NSObject(NSObject)
1 <- -isEqualToString: NSCFString
1 -> -isEqualToString: NSCFString
1 -> -class NSObject(NSObject)
1 <- -class NSObject(NSObject)
1 <- -isEqualToString: NSCFString
1 -> -isEqualToString: NSCFString
1 -> -class NSObject(NSObject)
1 <- -class NSObject(NSObject)
1 <- -isEqualToString: NSCFString
1 -> -isEqualToString: NSCFString
1 -> -class NSObject(NSObject)
1 <- -class NSObject(NSObject)
1 <- -isEqualToString: NSCFString
1 -> -isEqualToString: NSCFString
1 <- -isEqualToString: NSCFString
1 <- +functionWithName: CAMediaTimingFunction
1 -> -setTimingFunction: CAAnimation
1 <- -setTimingFunction: CAAnimation
1 -> -willChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -observationInfo NSObject(NSKeyValueObservingCustomization)
1 <- -observationInfo NSObject(NSKeyValueObservingCustomization)
1 -> -_implicitObservationInfo NSObject(NSKeyValueObservingPrivate)
1 <- -_implicitObservationInfo NSObject(NSKeyValueObservingPrivate)
1 <- -willChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 -> -retain NSObject(NSObject)
1 <- -retain NSObject(NSObject)
1 -> -release NSObject(NSObject)
1 <- -release NSObject(NSObject)
1 -> -didChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 <- -didChangeValueForKey: NSObject(NSKeyValueObserverNotification)
1 <- -fadeAnimationFor:duration:delegate:startSelector:stopSelector:fadeOut: FTAnimationManager
^C
#!/usr/sbin/dtrace -Z -s
/*
* Run like so:
*
* sudo ./traceMethodFlow.d -o trace.txt -p<PID> "<CLASS PATTERN>" "<METHOD PATTERN>"
*
* or
*
* sudo ./traceMethodFlow.d -o trace.txt -c "<PATH TO BINARY>" "<CLASS PATTERN>" "<METHOD PATTERN>"
*
* <CLASS PATTERN> is a glob that matches a class (or classes) whose methods you
* want to trace.
*
* <METHOD PATTERN> is a glob that matches the methods of the classes matching <CLASS PATTERN>
*
* Both the class and method patterns can be specified as "*" if you want everything. Be careful,
* though. Passing "*" for the class pattern will trace *every* class in the app.
*
*/
#pragma D option flowindent
BEGIN
{
self->enabled = 0;
}
objc$target:$1:$2:entry
{
self->enabled = 1;
}
objc$target:::entry,
objc$target:::return
/self->enabled == 1/
{
trace(probemod);
}
objc$target:$1:$2:return
{
self->enabled = 0;
}
END
{
self->enabled = 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment