Running Your Application with Diagnostics

During the test and debug phases of your product development, configure a scheme to run your application with various memory management diagnostics and logging options enabled. Schemes have a Run action with a Diagnostics pane that allows you to choose from a selection of runtime diagnostic tools.

bullet
To run your app with diagnostics
  1. From the Scheme toolbar menu, choose a scheme.

  2. From the same menu, choose Edit Scheme to display the scheme dialog.

  3. In the left column, select Run.

  4. To specify runtime diagnostics, click the Diagnostics tab.

  5. Click OK.

  6. Click the Run button or choose Product > Run.

    ../Art/scheme_configuration_diagnostics_2x.png../Art/scheme_configuration_diagnostics_2x.png

Select the tools that you want Xcode to use. You can view output from these tools in the debug area console and in the debug log in the log navigator.

Memory Management options:

  • Enable Scribble. Fill allocated memory with 0xAA and deallocated memory with 0x55.

  • Enable Guard Edges. Add guard pages before and after large allocations.

  • Enable Guard Malloc. Use libgmalloc to catch common memory problems such as buffer overruns and use-after-free.

  • Enable Zombie Objects. Replace deallocated objects with a “zombie” object that traps any attempt to use it. When you send a message to a zombie object, the runtime logs an error and crashes. You can look at the backtrace to see the chain of calls that triggered the zombie detector.

Logging options:

  • Distributed Objects. Enable logging for distributed objects (NSConnection, NSInvocation, NSDistantObject, and NSConcretePortCoder).

  • Garbage Collection Activity. Enable various logging facilities in the garbage-collected memory allocator. Log when a collection occurs, log when new regions are allocated, and log all weak reference manipulations.

  • Malloc Stack. Record stack logs for memory allocations and deallocations.

  • Log Exceptions. Log Objective-C runtime exception handling.

  • Log DYLD API Usage. Log dynamic-linker API calls (for example, dlopen).

  • Log Library Loads. Log dynamic-linker library loads.

Debugger options:

  • Stop on Debugger() and DebugStr(). Enable Core Services routines that enter the debugger with a message. These routines send a SIGINT signal to the current process.