Scripts/instrumentSends

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 Foundation
import objc


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)  # noqa: F821

# To disable
instrumentObjcMessageSends(False)  # noqa: F821