Commits

Ronald Oussoren committed afacc52

Show how to use instrumentObjcMessageSends

Comments (0)

Files changed (1)

pyobjc-core/Examples/Scripts/instrumentSends.py

+"""
+Warning: this script uses an undocumented, private API of the Objective-C 
+runtime.
+
+It sometimes is useful to see which Objective-C methods are called in a 
+program. Luckily the Objective-C runtime contains a private API for logging
+all method calls. This file shows how to call that API.
+"""
+import objc
+import Foundation
+
+objc.loadBundleFunctions(Foundation.__bundle__, globals(),
+[
+    ('instrumentObjcMessageSends', objc._C_VOID +
+    objc._C_NSBOOL),
+])
+
+# To enable
+#  - the logfile will be created as ``/tmp/msgSends-<PID>`` (where ``<PID>``
+#    is the process-id of the process that calls the function.
+#  - the file contains a list of method names, somethink like this::
+#
+#     - NSClassicMapTable NSClassicMapTable objectForKey:
+#     - NSClassicMapTable NSClassicMapTable objectForKey:
+#     - NSClassicMapTable NSClassicMapTable objectForKey:
+#     + NSObject NSObject alloc
+#     + NSObject NSObject allocWithZone:
+#
+# - in PyObjC scripts you'll see a lot of calls that have nothing to do
+#   with you're program itself but are generated by the bridge code (such
+#   as all NSClassicMapTable calls in the example in the previous item).
+
+instrumentObjcMessageSends(True) 
+
+# To disable
+instrumentObjcMessageSends(False)