Pergunta

Qual é a instrução para causar uma falha no Xcode?Por exemplo, no Visual Studio eu poderia fazer '_asm int 3' ou 'DebugBreak ()'.Em algumas implementações do GCC é asm("break 0") ou asm("trap").

Tentei vários combos no Xcode sem sorte.(assembler embutido funciona bem, então não é um problema de sintaxe).

Para referência, isto é para uma macro assert.Não quero usar as definições em assert.h tanto para portabilidade quanto porque elas parecem fazer um abort() na versão fornecida pelo XCode.


John - Super, felicidades.Para referência, a sintaxe int 3 é a necessária para Macs Intel e iPhone.


Chris - Obrigado pelo seu comentário, mas há muitos motivos para evitar a função assert() padrão para bases de código portadas para diferentes plataformas.Se você se deu ao trabalho de criar sua própria afirmação, geralmente é porque possui funcionalidades adicionais (registro, desenrolamento de pilha, interação do usuário) que deseja manter.

Sua sugestão de tentar substituir o manipulador por meio de uma implementação de '__assert" ou similar não será portátil.O 'assert' padrão geralmente é uma macro e embora possa ser mapeado para __assert no Mac, isso não acontece em outras plataformas.

Foi útil?

Solução

http://developer.apple.com/documentation/DeveloperTools/Conceptual/XcodeProjectManagement/090_Running_Programs/chapter_11_section_3.html

asm {trap}            ; Halts a program running on PPC32 or PPC64.

__asm {int 3}         ; Halts a program running on IA-32.

Outras dicas

Você pode simplesmente inserir uma chamada para Debugger() - isso interromperá seu aplicativo no depurador (se estiver sendo executado no depurador) ou o interromperá com uma exceção, se não estiver.

Também, não evite assert() por "razões de portabilidade" — portabilidade é a razão pela qual existe!Faz parte do Standard C e você o encontrará onde quer que encontre um compilador C.O que você realmente quer fazer é definir um novo manipulador de asserção isso interrompe o depurador em vez de chamar abort();praticamente todos os compiladores C oferecem um mecanismo pelo qual você pode fazer isso.

Normalmente, isso é feito simplesmente implementando uma função ou macro que segue este protótipo:

void __assert(const char *expression, const char *file, int line);

É chamado quando uma expressão de asserção falha.Geralmente isso, não assert() em si, é o que realiza "o printf() seguido pela abort()"esse é o comportamento padrão documentado.Ao personalizar esta função ou macro, você pode alterar seu comportamento.

Para a posteridade:Eu tenho algum código para gerar paradas no quadro de pilha correto no depurador e (opcionalmente) pausar o aplicativo para que você possa anexar o depurador just-in-time.Funciona para simulador e dispositivo (e possivelmente para desktop, se você precisar).Postagem exaustivamente detalhada em http://iphone.m20.nl/wp/2010/10/xcode-iphone-debugger-halt-assertions/

Encontrei o seguinte em um Fórum da Apple:

O Xcode não vem com intervalos simbólicos incorporados - mas eles são rápidos em adicionar.Vá para a janela de pontos de interrupção e adicione:

-[NSAumento de exceção]

kill(getpid(), SIGINT);

Funciona no simulador e no dispositivo.

Há também a seguinte função que está disponível como alternativa Halt() direta de plataforma cruzada:

#include <stdlib.h>

void abort(void);

Nós o usamos em nosso mecanismo de plataforma cruzada para implementação do iPhone em caso de afirmações fatais.Plataforma cruzada entre Nintendo DS/Wii/XBOX 360/iOS etc...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top