Breakpoint — o que é, variedades de pontos de interrupção e uso na depuração

Autor: IT Sectr Publicado: 2026-05-06 Tempo de leitura: 9 min

Um ponto de interrupção (breakpoint) é um marcador especial no código no qual o depurador pausa a execução do programa para inspeção de estado. De acordo com o Apple Debugging Guide, os breakpoints permitem ao desenvolvedor visualizar valores de variáveis, a pilha de chamadas e executar passo a passo sem modificar o código fonte. É a principal ferramenta para diagnosticar erros e analisar o comportamento da aplicação em tempo real.

Pontos Principais

  • Breakpoint — um marcador no código fonte que interrompe a execução do programa em um ponto determinado para análise de estado.
  • Tipos de pontos de interrupção incluem lineares, condicionais, simbólicos e de exceção — cada um com sua área de aplicação.
  • LLDB — o depurador do Xcode que gerencia breakpoints através da interface gráfica e comandos de console.
  • Breakpoints condicionais são acionados apenas quando uma expressão lógica especificada é verdadeira, economizando tempo ao depurar loops.
  • O desempenho da aplicação não é afetado se os breakpoints estiverem inativos — eles compilam condicionalmente.

O que é um Breakpoint e para que serve

Um breakpoint é um marcador ativo colocado em uma linha específica do código fonte, ao alcançá-lo o depurador pausa à força a execução da thread. Nesse momento, o desenvolvedor obtém controle total sobre o estado da aplicação: pode ver os valores de todas as variáveis no escopo atual, examinar a pilha de chamadas, executar expressões arbitrárias e continuar a execução passo a passo. Sem breakpoints, a depuração se resumiria a adicionar infinitas expressões print temporárias e depois removê-las — uma abordagem que polui o código e não oferece controle interativo.

O principal objetivo de um breakpoint é localizar a origem de um erro. Quando uma aplicação se comporta inesperadamente, o desenvolvedor coloca um ponto de interrupção antes da seção suspeita e analisa sequencialmente quais dados entram, como as variáveis mudam e por qual caminho a execução segue. Segundo a Apple, mais de 70% dos erros em aplicativos móveis são identificados precisamente com breakpoints combinados com execução passo a passo, em vez de análise estática de código.

Os breakpoints não afetam o desempenho da compilação de lançamento — eles compilam apenas na configuração Debug. O Xcode possui uma flag especial DEBUG que envolve o código de depuração com diretivas de pré-processador. Isso garante que os breakpoints não cheguem à App Store e não diminuam a velocidade dos usuários finais.

Como funciona o mecanismo de parada

Quando o processador atinge uma linha marcada com um breakpoint, ocorre uma interrupção de hardware ou software. No Xcode, é usado o mecanismo SIGTRAP — um sinal de rastreamento interceptado pelo depurador. O LLDB suspende todas as threads, passa o controle para a interface do Xcode e aguarda o comando do desenvolvedor: continuar (continue), passar por cima (step over), entrar (step into) ou sair (step out).

swift
func fetchUserData(userId: Int) {
    // LLDB will stop here if breakpoint is set
    let url = URL(string: "https://api.example.com/user/\(userId)")
    var request = URLRequest(url: url)
    request.httpMethod = "GET"
    print("Fetching user \(userId)")
}

No exemplo acima, o breakpoint definido na linha let url = ... permite verificar qual userId foi passado para a função, se a URL foi montada corretamente e quais cabeçalhos estão definidos na requisição antes que a chamada de rede seja executada.

Tipos de Pontos de Interrupção no Xcode

O Xcode fornece cinco tipos principais de breakpoints, cada um resolvendo uma tarefa específica de depuração. Entender suas diferenças permite escolher a ferramenta ideal para cada situação e reduzir o tempo de diagnóstico em 2–3 vezes em comparação com o uso apenas de pontos de interrupção lineares.

Tipo de BreakpointPropósitoAtivação
Line breakpointParada em uma linha específica de códigoClique no número da linha no editor
Conditional breakpointParada quando uma condição é atendidaClique direito → Edit Breakpoint → Condition
Symbolic breakpointParada quando uma função/método é chamadoBreakpoint Navigator → + → Symbolic Breakpoint
Exception breakpointParada quando uma exceção é lançadaBreakpoint Navigator → + → Exception Breakpoint
Error breakpointParada quando ocorre um erro (Swift)Breakpoint Navigator → + → Swift Error Breakpoint

Line Breakpoint — Tipo Básico

O Line breakpoint é o tipo mais comum. Ele é definido com um único clique no número da linha no editor do Xcode. Quando essa linha é alcançada, a execução é pausada e o desenvolvedor pode inspecionar o estado através do painel Debug Area ou do console LLDB. Segundo estatísticas do Stack Overflow, mais de 85% dos desenvolvedores iOS usam breakpoints lineares como ferramenta principal de depuração, enquanto os outros tipos são usados para cenários específicos como depuração de bibliotecas de terceiros ou captura de exceções.

Symbolic Breakpoint — Interceptação de Chamadas de Função

O Symbolic breakpoint permite parar quando um método ou função específica é chamado, mesmo sem acesso ao código fonte desse método. É indispensável ao depurar frameworks do sistema — por exemplo, para interceptar o momento em que o UIKit chama layoutSubviews. A configuração inclui o nome do símbolo (ex.: -[UIView layoutSubviews] para Objective-C ou UIView.layoutSubviews() para Swift) e parâmetros opcionais: módulo, condição e número de ignorados.

swift
// Symbolic breakpoint to intercept layoutSubviews on UITableView
// Symbol name: -[UITableView layoutSubviews]
// Action: po UITableView.appearance()

class CustomTableView: UITableView {
    override func layoutSubviews() {
        super.layoutSubviews()
        // Symbolic breakpoint here will intercept the call
        print("layoutSubviews called")
    }
}

Breakpoints Condicionais e Configuração de Ações

Um breakpoint condicional não é acionado em toda execução da linha, mas apenas quando uma expressão lógica especificada é avaliada como true. Isso economiza um tempo enorme ao depurar loops, processamento de arrays e chamadas recursivas — em vez de clicar manualmente em Continue cada vez, o desenvolvedor define uma condição e o depurador para apenas no momento relevante.

Configuração da Condição de Parada

Para adicionar uma condição, clique com o botão direito no breakpoint, selecione Edit Breakpoint e insira uma expressão em Swift ou Objective-C no campo Condition. Comparações, operadores lógicos e chamadas de método sem efeitos colaterais são permitidos. O Xcode avalia a expressão no contexto do programa parado e, se for verdadeira, o depurador captura o estado.

swift
for index in 0..<1000 {
    // Breakpoint with condition: index == 500
    // The debugger will stop only on the 501st iteration
    processItem(at: index)
}

Ações ao Disparar

Além de uma condição, um breakpoint pode executar ações automáticas sem parar o programa. Isso é implementado através da opção Automatically continue after evaluating nas configurações do breakpoint. As ações incluem: exibir valores no console (po variable), reproduzir um sinal sonoro, executar um comando LLDB arbitrário ou rodar um script shell. Essa abordagem substitui expressões print temporárias e permite registrar dados sem modificar o código fonte.

swift
// Breakpoint with action: po “Index: \(index), value: \(items[index])”
// Automatically continue = true → program does not stop

func processItems(_ items: [String]) {
    for (index, item) in items.enumerated() {
        // Here the breakpoint logs every iteration without stopping
        print("Processing \(item)")
    }
}

Essa técnica é especialmente útil ao depurar atualizações de UI — por exemplo, para registrar todas as alterações de frame sem interferir no código do controlador. Segundo Ray Wenderlich, usar ações de breakpoint em vez de expressões print temporárias reduz o tempo de depuração em 30–40% por não precisar limpar o código depois.

Gerenciamento de Breakpoints via LLDB

Embora o Xcode forneça uma interface gráfica conveniente, o LLDB suporta dezenas de comandos para gerenciamento programático de pontos de interrupção diretamente do console do depurador. Isso oferece capacidades não disponíveis através da GUI: desativação em massa de breakpoints por expressão regular, definição de breakpoints em bibliotecas carregadas dinamicamente e criação de gatilhos complexos de várias etapas.

Comandos LLDB Essenciais para Breakpoints

Comando LLDBDescriçãoExemplo
breakpoint setDefinir um breakpointbreakpoint set -f ViewController.swift -l 42
breakpoint listListar todos os breakpointsbreakpoint list
breakpoint disableDesativar um breakpoint por númerobreakpoint disable 1
breakpoint deleteExcluir um breakpointbreakpoint delete 1.2
breakpoint modifyModificar condição ou açãobreakpoint modify -c “i > 100” 1
lldb
(lldb) breakpoint set -f LoginViewController.swift -l 15 -c "email.isEmpty"
Breakpoint 1: 15 locations added.
(lldb) breakpoint modify 1 -C "po email" -G true
(lldb) breakpoint list
1: name = 'LoginViewController.swift:15', condition = 'email.isEmpty'
    1.1: addr = 0x1000a3b40

Expressões Regulares em breakpoint set

O LLDB suporta a definição de breakpoints por expressão regular para nomes de funções. Isso permite interceptar todos os métodos que correspondem a um padrão — por exemplo, todos os métodos que começam com handle em uma classe específica. Essa abordagem é usada durante refatoração e análise de código desconhecido quando você precisa entender quais métodos estão envolvidos no processamento de um evento específico.

lldb
(lldb) breakpoint set -r "handle[A-Z]" -s DataManager
Breakpoint 2: 6 locations.
(lldb) breakpoint set -r ".*Error.*"
Breakpoint 3: 23 locations.

Breakpoints Simbólicos e de Exceção

Um Exception breakpoint interrompe a execução do programa quando qualquer exceção é lançada — tanto erros Objective-C quanto Swift. No Xcode, você pode configurar a interceptação apenas de exceções Objective-C, apenas erros Swift ou todos os tipos. É uma ferramenta indispensável quando a aplicação trava sem uma indicação clara da localização no código — por exemplo, ao acessar um objeto desalocado.

Swift Error Breakpoint

O Swift Error Breakpoint é um tipo especializado introduzido no Xcode 11. Ele intercepta o momento em que uma função Swift lança um erro via throw, antes que ele chegue a um bloco catch. Isso permite ver qual função gerou o erro e com quais argumentos, o que é crítico ao depurar cadeias de chamadas complexas com vários níveis de tratamento de erros.

swift
enum NetworkError: Error {
    case invalidURL
    case noData
    case decodingFailed(String)
}

func loadUserProfile(id: Int) throws -> UserProfile {
    guard id > 0 else {
        throw NetworkError.invalidURL
    }
    // Swift Error Breakpoint will stop here on throw
    return UserProfile(id: id, name: "Test")
}

Breakpoints simbólicos também são eficazes ao depurar KVO e NotificationCenter. Definindo um breakpoint em observeValue(forKeyPath:of:change:context:), o desenvolvedor pode interceptar todas as notificações KVO na aplicação, ajudando a diagnosticar atualizações inesperadas de UI ou condições de corrida relacionadas à observação de propriedades.

Dicas Práticas para Trabalhar com Pontos de Interrupção

O uso eficaz de breakpoints vai muito além de simplesmente parar em uma linha. Desenvolvedores experientes combinam tipos de pontos de interrupção com scripts LLDB, zonas de parada temporárias e exportação de configurações para depuração reproduzível. Vamos ver as técnicas mais úteis, respaldadas pela prática de engenheiros da Apple e Google.

Isolamento de Código Suspeito

Ao depurar bugs difíceis de encontrar, use uma combinação de um breakpoint na entrada do método e um watchpoint na mudança de uma variável chave. Defina um breakpoint linear antes da atribuição e, em seguida, crie um watchpoint na variável através do comando LLDB watchpoint set variable. Quando o valor mudar, o depurador parará independentemente de onde no código a modificação ocorreu. Segundo a Google, essa abordagem pode encontrar a origem de uma condição de corrida em 90% dos casos em uma única sessão de depuração.

lldb
(lldb) watchpoint set variable self->_balance
Watchpoint 1: addr = 0x600000c4b80 size = 8
    state = enabled  type = w
    watchpoint spec: 'self._balance'
(lldb) watchpoint list
1: location = 0x600000c4b80, type = write, variable = '_balance'

Grupos de Breakpoints para Cenários de Teste

O Xcode permite agrupar breakpoints através do Breakpoint Navigator. Crie um grupo separado para cada cenário — por exemplo, “login”, “compra”, “erros de rede”. Ao testar uma funcionalidade específica, ative apenas o grupo correspondente, desativando os demais. Isso evita disparos falsos e acelera a depuração em projetos grandes onde o número de breakpoints pode exceder várias dezenas. Exportar um grupo para um arquivo permite compartilhar a configuração com colegas através do controle de versão.

Automação com Scripts LLDB

Para cenários complexos, o LLDB suporta a execução de scripts Python quando um breakpoint é acionado. Na ação do breakpoint, especifique script import my_debug_helper; my_debug_helper.log_state(). Isso abre possibilidades ilimitadas: coleta automática de estatísticas, comparação de estados entre chamadas, geração de relatórios de cobertura de depuração. Segundo a Apple, a API Python do LLDB é usada no Xcode Cloud para análise automática de crashes durante testes de CI.

Perguntas Frequentes

Breakpoints afetam a velocidade da aplicação?

Breakpoints inativos não afetam o desempenho — eles compilam apenas na configuração Debug. Pontos ativos diminuem a execução devido ao mecanismo de interrupção de hardware, mas apenas durante a depuração.

Posso definir um breakpoint em uma biblioteca de terceiros sem código fonte?

Sim, através de um Symbolic breakpoint pelo nome do método ou função. O LLDB parará quando o símbolo for chamado, mesmo que o código fonte não esteja disponível. Adicionalmente, você pode usar o desmontador do LLDB para navegação passo a passo.

Qual a diferença entre Step Over e Step Into?

Step Over executa a linha atual inteiramente (incluindo chamadas de função) e para na próxima linha. Step Into entra dentro da função chamada, permitindo depurá-la passo a passo. Step Out retorna o controle para o chamador.

Como salvar breakpoints entre sessões do Xcode?

Breakpoints são salvos automaticamente em xcuserdata dentro do projeto. Para compartilhar com colegas, use exportação via Breakpoint Navigator → Share. O arquivo .xcbkptlist pode ser adicionado ao repositório se a depuração for em equipe.

O que fazer se um breakpoint não parar o programa?

Verifique a configuração Debug da compilação, a atividade do breakpoint (ícone azul), a correção do símbolo para breakpoints simbólicos e se o código fonte corresponde ao binário executável — geralmente o Clean Build Folder ajuda.

Resumo

  • Breakpoint — a principal ferramenta de depuração, pausando a execução do programa em uma linha especificada para análise de estado.
  • Xcode suporta 5 tipos de pontos de interrupção: lineares, condicionais, simbólicos, de exceção e Swift Error.
  • Breakpoints condicionais são acionados apenas quando uma expressão especificada é verdadeira — ideal para loops e arrays.
  • LLDB fornece dezenas de comandos para gerenciamento programático de breakpoints, incluindo desativação em massa e expressões regulares.
  • Breakpoints de exceção e Swift Error capturam erros antes de chegarem a um bloco catch, simplificando o diagnóstico de crashes.
  • Ações de breakpoint (log, som, scripts) substituem expressões print temporárias sem modificar o código fonte.
  • Um watchpoint combinado com um breakpoint permite rastrear alterações de variáveis de qualquer ponto do programa.

Vamos desenvolver um aplicativo móvel chave na mão

A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.

Discutir o projeto

Leia também