Você pode definir um ponto de interrupção condicional no Xcode definindo o ponto de interrupção normalmente, então clique com o botão direito do mouse nele e selecione Editar Ponto de Interrupção (escolha Executar -> Mostrar -> Pontos de Interrupção).
Na entrada do ponto de interrupção, há uma coluna Condição.
Agora, há vários problemas a serem considerados para essa condição. Em primeiro lugar, o gdb não entende a sintaxe de ponto, portanto, em vez de myObj.name, você deve usar [nome do myObj] (a menos que nome seja um ivar).
A seguir, como com a maioria das expressões em gdb, você deve informar o tipo de resultado de retorno, a saber "BOOL". Portanto, defina uma condição como:
(BOOL)[[myObj name] isEqualToString:@"Bar"]
Freqüentemente, é realmente mais fácil apenas fazer isso no código adicionando temporariamente o código como:
if ( [myObj.name isEqualToString:@"Bar"] ) {
NSLog( @"here" );
}
e, em seguida, definir o ponto de interrupção no NSLog. Então, sua condição pode ser arbitrariamente complexa sem ter que se preocupar com o que o gdb pode ou não analisar.
Aqui está como você faz usando pontos de interrupção condicionais XCode lldb.
Primeiro, clique duas vezes no ponto de interrupção (ou clique com o botão direito
edit breakpoint
), você pode ver uma janela pop-up.Aqui está o que essa opção significa:
Aqui está um resumo. Para o exemplo acima na imagem, significa que quando a variável
buildingId
for igual a 13, interrompa aqui. Se eu adicionar o tempo de ignorar a 1, ele ignorará a primeira vez quandobuildingId
for igual a 13 e interromperá na segunda vez que a condição for atendida.Para ações, quando você pressiona adicionar ações, haverá uma lista de escolha. Normalmente o que eu faço é usar o
Debugger Command
po
para imprimir as variáveis que preciso verificar e acredito que existem maneiras melhores de usar as ações do que eu.Parece que você tem que recompilar e executar o aplicativo se você alterar as condições em tempo de execução
fonte
Não tenho certeza se isso vai funcionar, mas você pode tentar definir um ponto de interrupção nessa linha de código, abrir o console do depurador (Cmd + Shift + R) e digitar
Onde N é substituído pelo número do ponto de interrupção (um inteiro).
fonte
Se você alterar myObj.name usando o setter, poderá adicionar um ponto de interrupção simbólico no
-[MyObjClass setName:]
console do depurador ou no menu Executar-> Gerenciar pontos de interrupção-> Adicionar ponto de interrupção simbólico no Xcode. Se não (por que não? Você provavelmente não deveria estar modificando a variável de instância diretamente, exceto no inicializador ou desalocador designado), você pode definir um ponto de controle no gdb (use o Debugger Console no Xcode assim que o depurador estiver em execução). Esta página explica como. Não acredito que o Xcode exponha uma IU para definir pontos de controle sem usar o console do depurador.fonte
Às vezes, ao trabalhar com Frameworks (compilações de depuração) e precisar colocar um ponto de interrupção em determinado arquivo / local que é difícil de navegar ou não é exposto publicamente no framework em desenvolvimento. Uma opção é escrever uma classe auxiliar para acionar pontos de interrupção condicionais e tornar a entrada / saída mais fácil.
Declaração de cabeçalho na estrutura em desenvolvimento.
E arquivo de implementação:
fonte