Resumable assert/breakpoint on iOS like __debugbreak() with MS compiler

后端 未结 1 845
暖寄归人
暖寄归人 2020-12-16 02:17

I\'m trying to implement custom asset macro (similar to what assert.h has), but I want to be able to continue execution after I get and assert.

For example, one such

相关标签:
1条回答
  • 2020-12-16 02:33

    Turns out I can achieve what I want by making a syscall:

    #include <unistd.h>
    
    #if defined(__APPLE__) && defined(__aarch64__)
    #define __debugbreak() __asm__ __volatile__(            \
        "   mov    x0, %x0;    \n" /* pid                */ \
        "   mov    x1, #0x11;  \n" /* SIGSTOP            */ \
        "   mov    x16, #0x25; \n" /* syscall 37 = kill  */ \
        "   svc    #0x80       \n" /* software interrupt */ \
        "   mov    x0, x0      \n" /* nop                */ \
        ::  "r"(getpid())                                   \
        :   "x0", "x1", "x16", "memory")
    #elif defined(__APPLE__) && defined(__arm__)
    #define __debugbreak() __asm__ __volatile__(            \
        "   mov    r0, %0;     \n" /* pid                */ \
        "   mov    r1, #0x11;  \n" /* SIGSTOP            */ \
        "   mov    r12, #0x25; \n" /* syscall 37 = kill  */ \
        "   svc    #0x80       \n" /* software interrupt */ \
        "   mov    r0, r0      \n" /* nop                */ \
        ::  "r"(getpid())                                   \
        :   "r0", "r1", "r12", "memory")
    #elif defined(__APPLE__) && (defined(__i386__) || defined(__x86_64__))
    #define __debugbreak() __asm__ __volatile__("int $3; mov %eax, %eax")
    #endif
    
    #define MYASSERT(expr) do { if (!(expr)){ __debugbreak(); } } while(0)
    

    There is a trailing NOP mov x0, x0 for a reason: when assert breaks, debugger will stop exactly at the assert line and not some random line where the following instruction happens to be located.

    In case if somebody is looking for equivalent of IsDebuggerPresent on iOS, you can use AmIBeingDebugged.

    0 讨论(0)
提交回复
热议问题