AppCode 2020.3 Help

Breakpoints

Breakpoints are special markers that suspend program execution at a specific point. This lets you examine the program state and behavior. Breakpoints can be simple (for example, suspending the program on reaching some line of code) or involve more complex logic (checking against additional conditions, writing log messages, and so on).

Once set, a breakpoint remains in your project until you remove it explicitly, except for temporary breakpoints ).

Types of breakpoints

The following types of breakpoints are available in AppCode:

  • Line breakpoints: suspend the program upon reaching the line of code where the breakpoint was set. This type of breakpoints can be set on any executable line of code.

  • Exception breakpoints: suspend the program when NSException (for Objective-C) or Error (for Swift) or their subclasses are thrown. They apply globally to the exception condition and do not require a particular source code reference.

  • Symbolic breakpoints: suspend the program when a specific function or method are executed.

Set breakpoints

Set line breakpoints

  • Click the gutter at the executable line of code where you want to set the breakpoint. Alternatively, place the caret at the line and press ⌃F8.

    Line breakpoint

Set exception breakpoints

  1. Click View Breakpoints View Breakpoints button in the left part of the Debug tool window or press ⌃⇧F8.

  2. In the Breakpoints dialog, press ⌘N or click the Add button, and select Exception Breakpoints or JavaScript Exception Breakpoint.

  3. For Exception Breakpoint, you can specify when you want to suspend the program: when any or an Objective-C only exception is thrown.

    When any exception is thrown option

Set symbolic breakpoints

  1. Click View Breakpoints View Breakpoints button in the left part of the Debug tool window or press ⌃⇧F8.

  2. In the Breakpoints dialog, press ⌘N or click the Add button, and select Symbolic Breakpoints.

  3. Specify the symbol name and select whether you want this breakpoint to be hit in all modules, or in a specific module only.

    Symbolic breakpoint settings

Manage breakpoints

Remove breakpoints

  • For line breakpoints: click the breakpoint in the gutter.

  • For all breakpoints: from the main menu, select Run | View Breakpoints ⌃⇧F8, select the breakpoint, and click Remove .

To avoid accidentally removing a breakpoint and losing its parameters, you can choose to remove breakpoints by dragging them to the editor or clicking the middle mouse button. To do this, go to Preferences | Build, Execution, Deployment | Debugger and select Drag to the editor or click with middle mouse button. Clicking a breakpoint will then enable or disable it.

Mute breakpoints

If you don't need to stop at your breakpoints for some time, you can mute them. This allows you to resume normal program operation without leaving the debugger session. After that, you can unmute breakpoints and continue debugging.

  • Click the Mute Breakpoints button Mute Breakpoints button in the toolbar of the Debug tool window.

Enable/disable breakpoints

When you remove a breakpoint, its internal configuration is lost. To temporarily turn an individual breakpoint off without losing its parameters, you can disable it:

  • For line breakpoints: right-click it and set the Enabled option as required. You can also toggle them with the middle mouse button if removing breakpoints is not assigned to it.

  • For all breakpoints: click View Breakpoints ⌃⇧F8 and check/uncheck the breakpoint on the list.

Move/copy breakpoints

  • To move a breakpoint, drag it to another line.

  • To copy a breakpoint, hold Ctrl and drag a breakpoint to another line. This creates a breakpoint with the same parameters at the destination.

Configure breakpoints' properties

Depending on the breakpoint type, you can configure additional properties which allow you to tailor its operation for specific needs. The most used options are available via intentions.

  • To access breakpoint intentions, place the caret at the line with the breakpoint and press ⌥⏎. Use this option when you need to quickly configure basic breakpoint properties.

  • To access the full list of properties, right-click the breakpoint and click More or press ⌃⇧F8. Use this option for a bird's eye view of all breakpoints and full control over their configuration.

Intentions reference

IntentionDescription
Remove breakpointRemoves the breakpoint at the selected line.
Disable breakpointDisables the breakpoint at the selected line.
Edit breakpointOpens a dialog with the most used breakpoint properties. For more properties, click More or press ⌃⇧F8.

Breakpoints' properties

OptionDescriptionBreakpoint type
EnabledClear the checkbox to temporarily disable a breakpoint without removing it from the project. Disabled breakpoints will be skipped during the debugging process.All types
Suspend

Select the checkbox to pause the program execution when a breakpoint is hit. Suspending an application is useful if you need to obtain logging information or calculate an expression at a certain point without interrupting the program. If you need to create a master breakpoint that will trigger dependent breakpoints when hit, choose not to suspend the program at that breakpoint.

All types
Condition

Select to specify a condition for hitting a breakpoint. A condition is any boolean expression that evaluates to true or false.

This expression must be valid at the line where the breakpoint is set, and it is evaluated each time the breakpoint is hit. If the evaluation result is true, the selected actions are performed. In this field, you can enter multi-line conditional expressions.

Line

Symbolic

Log

Select if you want to log the following events to the console:

  • "Breakpoint hit" message: a log message will be displayed in the console output when the breakpoint is hit.

  • Stack trace: when the breakpoint is hit, its stack trace will be printed to the console.

    This is useful if you want to check what paths have led to this point without interrupting the program's execution.

All types
Evaluate and log

Select to evaluate an expression when the breakpoint is hit, and show the result in the console output.

Line

Symbolic

Remove once hitSelect to remove the breakpoint from your project right after it has been hit.

Line

Symbolic

JavaScript Exception

Disable until breakpoint is hitSelect the breakpoint that will trigger the current breakpoint. Until that breakpoint is hit, the current breakpoint will be disabled. You can also select if you wish to disable it again or leave it enabled once it has been hit.All types
Uncaught onlySelect to be notified when you've hit a breakpoint on an uncaught exception. JavaScript Exception breakpoints
When thrown

Select to suspend the program when you've hit a breakpoint on a caught exception:

  • Any: on any exception.

  • Objective-C only: only on exceptions in Objective-C code.

Exception
When caughtSelect to suspend the program when an exception is caught.Exception

Breakpoint statuses

Breakpoints can have the following statuses:

StatusDescription
VerifiedAfter you have started a debugger session, the debugger checks whether it is technically possible to suspend the program at the breakpoint. If yes, the debugger marks the breakpoint as verified.
WarningIf it is technically possible to suspend the program at the breakpoint, however there are issues related to it, the debugger gives you a warning. This may happen, for example, when it is impossible to suspend the program at one of the method's implementations.
InvalidIf it is technically impossible to suspend the program at the breakpoint, the debugger marks it as invalid. The most common cause for this is that there is no executable code on the line.
Inactive/dependentA breakpoint is marked as inactive/dependent when it is configured to be disabled until another breakpoint is hit, and this has not happened yet.
MutedAll breakpoints are temporarily inactive because they have been muted.
DisabledThis breakpoint is temporarily inactive because it has been disabled.
Non-suspendingThe suspend policy is set for this breakpoint so that it does not suspend the execution when hit.

Breakpoint icons

Depending on their type and status, breakpoints are marked with the following icons:

LineSymbolicException
Regularline breakpointmethod breakpointexception breakpoint
Disableddisabled line breakpointdisabled method breakpointdisabled exception breakpoint
Verifiedverified line breakpointverified method breakpoint
Mutedmuted line breakpointmuted method breakpoint
Inactive/dependentinactive/dependent line breakpointinactive/dependent method breakpoint
Muted disabledmuted disabled line breakpointmuted disabled method breakpoint
Non-suspendingnon-suspending line breakpointnon-suspending method breakpoint
Verified non-suspendingverified non-suspending line breakpointverified non-suspending method breakpoint
Invalidinvalid breakpoint

Productivity tips

Use breakpoints for debug printing
Use non-suspending logging breakpoints (sometimes referred to as watchpoints in other debuggers) instead of inserting print statements in your code. This provides a more flexible and centralized way of handling debug log messages.
Set logging breakpoints more quickly
To set a non-suspending logging breakpoint, hold Shift and click the gutter. This will not suspend the program execution and instead log a message like Breakpoint reached: MyClass.swift:36. If you want to log some expression that is in front of you in the editor, select it before holding Shift and clicking the gutter.
Add breakpoint descriptions
If you have many breakpoints in your project, you can add descriptions to breakpoints for ease of search. To do this, right-click a breakpoint in the Breakpoints dialog ⌃⇧F8 and select Edit description from the menu. Now when you start typing the breakpoint name, it gets the focus.
Group breakpoints
You can organize breakpoints into groups, for example, if you need to mark out breakpoints for a specific problem. To do this, in the Breakpoints dialog ⌃⇧F8, select a breakpoint you want to place in a group and select Move to group from the menu.
Test your program for concurrency issues
A good way to find out if a multi-threaded program is robust in terms of concurrency is to use breakpoints that only suspend one thread when hit. Stopping a single thread may reveal problems in the design of the application, which would not otherwise be evident.
Last modified: 16 March 2021