我可以在iOS中的代码中创build一个断点,比如VC ++中的`__asm {int 3}`,并在命中后继续执行?

我试图把相当于asm{int 3} (或类似)到我的iPhone程序。 我的目标是让Xcode完全停留在违规行中,而不必调用调用堆栈(所以_Debugger听起来不像这样做,不是我可以find它是哪个框架…),并离开我能够恢复执行(这就是为什么我不喜欢assert )。

(我已经习惯了在其他系统上的这些行为,我想在iOS上重现它们。)

迄今为止我的最佳尝试是这样的:

 asm volatile("bkpt 1"); 

这停止了​​有问题的线上的Xcode,但是当我尝试继续使用Cmd + Alt + P时,Xcode似乎再次运行BKPT 。 如果我使用Shift + Cmd + O,我只是得到这个:

 Watchdog has expired. Remote device was disconnected? Debugging session terminated. 

(不用说,远程设备仍然连接。)

我在iOS,Mac,ARM,gdb或gcc的asm方面没有太多的经验。 所以我已经被困住了 有什么办法让iOS和Xcode做我想做的事吗?

(我不知道它是否有所作为,但根据指令大小来判断我的程序是ARM代码。)

[这个问题最初出现在另一个标题下。 我编辑了它,希望能使事情更清楚。]

raise(SIGTRAP)是一个相对便携的方式,有一个“在代码中”的断点。

尝试:

 __builtin_trap(); 

在Mac和iOS上都可以工作,您可以将小绿色光标拖到下一行继续运行。

我已经尝试了所有这些解决scheme,虽然@RichardGroves答案保留了堆栈,但最好的解决scheme是:

  1. 创build自己的断言方法,如Debug::assert(...)
  2. 在该实现中在XCode中设置一个断点
  3. 使用“步出”命令返回到调用者

这是因为这是两者唯一可靠的方法

  • 查看堆栈跟踪
  • 一步/继续

我也是。 我已经提出了一些代码,做我们想要的东西+解释我们想要在http://iphone.m20.nl/wp/2010/10/xcode-iphone-debugger-halt-assertions/ – 这是第一篇文章所以你不必看起来太难。

 int resume = false; for (int i = 0; i < 20 && !resume; ++i) sleep(1); 

上面是一个穷人的陷阱,你必须手动附加到有问题的程序。 适当增加延迟。 把代码放在你想要破解的地方,然后在sleep语句中插入一个断点,编译并运行你的程序,然后从Xcode连接到它。 一旦Xcode中断,您可以右键单击恢复variables并将其编辑为1,以恢复执行。

截图

我试图find与Microsoft编译器附带的__debugbreak()行为相同的实现,并在我的代码内部而不是在系统库内部的某个位置执行,并允许我继续执行。 __debugbreak()的这个实现和我想要的完全一样:

 #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__) #define __debugbreak() __asm__ __volatile__("int $3; mov %eax, %eax") #endif #define ASSERT(expr) do { if (!(expr)){ __debugbreak(); } } while(0) 

int pthread_kill(pthread_t thread, int sig); 允许继续,并通过pthread_self()暂停当前​​线程。

类似于其他信号函数(例如kill()raise()等),但是, pthread_kill()用于请求将信号传递给特定的线程。

Pthread_kill手册

 std::runtime_error::runtime_error("breakpoint") 

以及types的XCodeexception断点

exception:C ++“named:std :: runtime”

为我工作(使用XCode 8.0)。
它会产生相同的结果,如果我已经手动设置一个断点在行的地方

 std::runtime_error::runtime_error 

函数被调用,即正确的线程,正确的调用堆栈和恢复的可能性。