XCode:以编程方式启用符号断点?

有没有办法以编程方式启用断点? 通常我会使用断点条件,但我需要使用符号断点。

具体来说,在scrollToIndexPath的调用和reloadData的调用之间,有些东西正在改变我的UIScrollView的contentOffset 。 我只想在调用scrollToIndexPath之后启用符号断点。

吉姆·英厄姆的答案适用于x86系统。 对于iOS设备,我能够使用此答案中描述的方法以编程方式创build断点。 插入线

 asm("svc 0"); 

导致debugging器在XCode中的以下指令停止。

在这里输入图像说明

有趣的是,如果你没有连接到XCode程序继续正常执行。

不,您不能以编程方式启用断点。

为什么不设置你的符号断点,然后禁用它。 然后添加一个断点到scrollToIndexPath 。 当达到该断点时,启用符号断点并继续应用程序,直到reloadData被调用。

你可以通过使用__builtin_trap()来做到这一点。 在x86系统上,你将不得不手动调整电脑后,点击陷阱。 但是这样做很容易,如果你的代码碰到了很多,而且你只需要在一些复杂的情况下进行陷阱,那么这样做有时候很有用。 就像是:

  > lldb trapit (lldb) target create "trapit" Current executable set to 'trapit' (x86_64). (lldb) run Process 63363 launched: '/private/tmp/trapit' (x86_64) About to trap. Process 63363 stopped * thread #1: tid = 0x2054b7, function: main , stop reason = EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) frame #0: 0x0000000100000f4d trapit`main at trapit.c:6 3 int main() 4 { 5 printf ("About to trap.\n"); -> 6 __builtin_trap(); 7 printf("Trapped.\n"); 8 } (lldb) dis -f trapit`main: 0x100000f30 <+0>: pushq %rbp 0x100000f31 <+1>: movq %rsp, %rbp 0x100000f34 <+4>: subq $0x10, %rsp 0x100000f38 <+8>: leaq 0x47(%rip), %rdi ; "About to trap.\n" 0x100000f3f <+15>: movb $0x0, %al 0x100000f41 <+17>: callq 0x100000f66 ; symbol stub for: printf 0x100000f46 <+22>: leaq 0x49(%rip), %rdi ; "Trapped.\n" -> 0x100000f4d <+29>: ud2 0x100000f4f <+31>: movl %eax, -0x4(%rbp) 0x100000f52 <+34>: movb $0x0, %al 0x100000f54 <+36>: callq 0x100000f66 ; symbol stub for: printf 0x100000f59 <+41>: xorl %ecx, %ecx 0x100000f5b <+43>: movl %eax, -0x8(%rbp) 0x100000f5e <+46>: movl %ecx, %eax 0x100000f60 <+48>: addq $0x10, %rsp 0x100000f64 <+52>: popq %rbp 0x100000f65 <+53>: retq (lldb) reg write pc 0x100000f4f (lldb) c Process 63363 resuming Trapped. Process 63363 exited with status = 0 (0x00000000)