문제

Xcode에서 하드 브레이크를 발생시키는 지침은 무엇입니까?예를 들어 Visual Studio에서는 '_asm int 3' 또는 'DebugBreak()'를 수행할 수 있습니다.일부 GCC 구현에서는 asm("break 0") 또는 asm("trap")입니다.

나는 운 좋게 Xcode에서 다양한 콤보를 시도했습니다.(인라인 어셈블러는 잘 작동하므로 구문 문제는 아닙니다.)

참고로 이는 Assert 매크로에 대한 것입니다.나는 이식성을 위해 그리고 XCode가 제공하는 버전에서 abort()를 수행하는 것처럼 보이기 때문에 Assert.h의 정의를 사용하고 싶지 않습니다.


존 - 슈퍼, 건배.참고로 int 3 구문은 Intel Mac 및 iPhone에 필요한 구문입니다.


Chris - 귀하의 의견에 감사드립니다. 하지만 다른 플랫폼으로 포팅된 코드베이스에 대한 표준 Assert() 함수를 피해야 할 많은 이유가 있습니다.자신만의 어설션을 롤링하는 데 어려움을 겪었다면 일반적으로 유지하려는 추가 기능(로깅, 스택 해제, 사용자 상호 작용)이 있기 때문입니다.

'__assert" 또는 이와 유사한 구현을 통해 핸들러를 교체하려는 제안은 이식 가능하지 않습니다.표준 'assert'는 일반적으로 매크로이며 Mac에서는 __assert에 매핑될 수 있지만 다른 플랫폼에서는 매핑되지 않습니다.

도움이 되었습니까?

해결책

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.

다른 팁

호출을 삽입하면 됩니다. Debugger() — 디버거에서 앱을 중지하거나(디버거에서 실행 중인 경우) 그렇지 않은 경우 예외를 발생시켜 중지합니다.

또한, 피하지 마세요 assert() "이식성 이유로" — 이식성이 존재하는 이유입니다!이는 표준 C의 일부이며 C 컴파일러를 찾을 수 있는 곳이면 어디에서나 찾을 수 있습니다.당신이 정말로 하고 싶은 것은 새로운 것을 정의하는 것이다. 어설션 핸들러 호출하는 대신 디버거가 중단됩니다. abort();사실상 모든 C 컴파일러는 이를 수행할 수 있는 메커니즘을 제공합니다.

일반적으로 이 프로토타입을 따르는 함수나 매크로를 구현하면 됩니다.

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

어설션 표현식이 실패하면 호출됩니다.보통은 그렇지 않아요 assert() 그 자체가 "를 수행하는 것입니다. printf() 이어서 abort()" 이것이 문서화된 기본 동작입니다.이 기능이나 매크로를 사용자 정의하여 해당 동작을 변경할 수 있습니다.

__builtin_trap();

Debugger()는 이제 가치가 떨어지기 때문에 이것이 대신 작동할 것입니다.

https://developer.apple.com/library/mac/technotes/tn2124/_index.html#//apple_ref/doc/uid/DTS10003391-CH1-SECCONTROLLEDCRASH

후손을 위해:디버거의 올바른 스택 프레임에서 정지를 생성하고 (선택적으로) 적시에 디버거를 연결할 수 있도록 앱을 일시 중지하는 코드가 있습니다.시뮬레이터 및 장치(필요한 경우 데스크톱도 가능)에서 작동합니다.매우 자세한 게시물은 다음 사이트에 있습니다. http://iphone.m20.nl/wp/2010/10/xcode-iphone-debugger-halt-assertions/

나는 다음을 발견했습니다. 애플 포럼:

Xcode에는 상징적 인 브레이크가 내장되어 있지 않지만 빠르게 추가 할 수 있습니다.중단점 창으로 이동하여 다음을 추가합니다.

-[NS예외 발생]

kill(getpid(), SIGINT);

시뮬레이터와 장치에서 작동합니다.

크로스 플랫폼 바로 Halt() 대안으로 사용할 수 있는 다음 기능도 있습니다.

#include <stdlib.h>

void abort(void);

치명적인 오류가 발생할 경우 iPhone 구현을 위한 크로스 플랫폼 엔진에서 이를 사용합니다.Nintendo DS/Wii/XBOX 360/iOS 등의 크로스 플랫폼...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top