Domanda

Qual è l'istruzione per causare un'interruzione definitiva in Xcode?Ad esempio in Visual Studio potrei fare '_asm int 3' o 'DebugBreak()'.In alcune implementazioni di GCC è asm("break 0") o asm("trap").

Ho provato varie combo sotto Xcode senza fortuna.(l'assemblatore inline funziona bene, quindi non è un problema di sintassi).

Per riferimento, questo è per una macro di asserzione.Non voglio utilizzare le definizioni in assert.h sia per portabilità, sia perché sembrano eseguire un abort() nella versione fornita da XCode.


John - Super, saluti.Per riferimento, la sintassi int 3 è quella richiesta per Mac Intel e iPhone.


Chris - Grazie per il tuo commento, ma ci sono molti motivi per evitare la funzione assert() standard per le basi di codice portate su piattaforme diverse.Se ti sei preso la briga di eseguire la tua asserzione, di solito è perché disponi di funzionalità aggiuntive (registrazione, rimozione dello stack, interazione con l'utente) che desideri mantenere.

Il tuo suggerimento di tentare di sostituire l'hander tramite un'implementazione di '__assert" o simile non sarà portabile.Lo standard "assert" è solitamente una macro e sebbene possa essere mappato a __assert su Mac, non lo è su altre piattaforme.

È stato utile?

Soluzione

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.

Altri suggerimenti

Puoi semplicemente inserire una chiamata a Debugger() - che interromperà la tua app nel debugger (se viene eseguita nel debugger) o la interromperà con un'eccezione se non lo è.

Anche, non evitare assert() per “motivi di portabilità” - la portabilità è il motivo per cui esiste!Fa parte dello Standard C e lo troverai ovunque trovi un compilatore C.Ciò che vuoi veramente fare è definire un nuovo gestore di asserzioni questo fa un'interruzione del debugger invece di chiamare abort();praticamente tutti i compilatori C offrono un meccanismo attraverso il quale è possibile eseguire questa operazione.

In genere questo viene fatto semplicemente implementando una funzione o una macro che segue questo prototipo:

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

Si chiama quando un'espressione di asserzione fallisce.Di solito no assert() stesso, è ciò che esegue "il printf() seguito da abort()" questo è il comportamento documentato predefinito.Personalizzando questa funzione o macro, è possibile modificarne il comportamento.

Per i posteri:Ho del codice per generare arresti nello stack frame corretto nel debugger e (facoltativo) per mettere in pausa l'app in modo da poter collegare il debugger just-in-time.Funziona per simulatore e dispositivo (e possibilmente desktop, se mai ne avessi bisogno).Post esaustivamente dettagliato su http://iphone.m20.nl/wp/2010/10/xcode-iphone-debugger-halt-assertions/

Ho trovato quanto segue in un Foro Apple:

Xcode non ha alcuna rottura simbolica integrata, ma sono veloci da aggiungere.Vai alla finestra dei punti di interruzione e aggiungi:

-[aumento NSException]

kill(getpid(), SIGINT);

Funziona nel simulatore e nel dispositivo.

Esiste anche la seguente funzione disponibile come alternativa diretta a Halt() multipiattaforma:

#include <stdlib.h>

void abort(void);

Lo utilizziamo nel nostro motore multipiattaforma per l'implementazione dell'iPhone in caso di affermazioni fatali.Piattaforma multipiattaforma su Nintendo DS/Wii/XBOX 360/iOS ecc...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top