c++ - आईएसओ पर रिज्यूमेबल अटैक/ब्रेकपॉइंट एमएस कंपाइलर के साथ__डेबग बीक्यूएफ़()
ios debugging (1)
बाहर निकलता है मैं एक 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)
एक अनुगामी NOP mov x0, x0
एक कारण के लिए है: जब ब्रेक जोर देते हैं, तो डीबगर वास्तव में आश्वस्त लाइन पर बंद हो जाएगा और कुछ यादृच्छिक पंक्ति नहीं है जहां निम्नलिखित अनुदेश स्थित होना होता है।
यदि किसी व्यक्ति को IOS पर IISDebugger के बराबर की तलाश है, तो आप AmIBeingDebugged उपयोग कर सकते हैं I
मैं कस्टम आस्ति मैक्रो को लागू करने की कोशिश कर रहा हूं (जैसा कि assert.h है जैसा है), लेकिन मैं प्राप्त होने और दावा करने के बाद मैं निष्पादन जारी रखने में सक्षम होना चाहता हूं।
उदाहरण के लिए, ऐसा ASSERT
कार्यान्वयन हो सकता है:
#define ASSERT(expr) ((void)( (!!(expr)) || (__debugbreak(), 0)))
__debugbreak माइक्रोसॉफ्ट कंपाइलर्स में एक आंतरिक फ़ंक्शन है जो सॉफ्टवेयर ब्रेकपॉइंट सम्मिलित करता है, x86 में _asm int 3
बराबर है। IOS के लिए कि __debugbreak को लागू करने के लिए अलग अलग तरीके हैं:
-
__asm__("int $3");
x86 के लिए -
__asm__("bkpt #0");
नियमित बांह के लिए -
__asm__("brk #0");
arm64 के लिए - __builtin_trap ()
-
raise(SIGTRAP)
लेकिन उन सभी के साथ जब मेरा दावा है कि मैं केवल कदम नहीं उठा सकता हूं और जिस तरह से मैं दृश्य स्टूडियो के साथ काम कर रहा हूं उसे जारी रख सकता हूं; जब कोई मेरे आईओएस में दावा करता है तो वह जोर में फंस जाता है और मेरे पास कोई विकल्प नहीं है, लेकिन इसे खत्म करने के लिए, मैं मैन्युअल रूप से निर्देश सूचक भी नहीं ले सकता और ज़ोर से उसे छोड़ सकता हूं।
क्या आईओएस पर दावा लगाया जा सकता है जो डिबगर में टूट जाएगा और अभी भी मुझे निष्पादन जारी रखने की अनुमति देगा?