" svc#128"意外地进入调试器 - 如何调试?

时间:2015-01-04 16:21:24

标签: xcode debugging assembly arm

有一系列StackOverflow问题在svc #128指令后意外地提到了调试器。在我自己处理这个问题时,我想问一些关于何时以及为什么会出现此问题的一般性问题。

  • 详细说明iOS中使用的svc #128是什么?
  • 是什么原因导致它进入调试器?
  • 在开发过程中是否有办法抑制调试器的入侵?
  • 调试此问题的根本原因的可能方法?
  • 人们过去曾使用过的成功解决方案吗?

1 个答案:

答案 0 :(得分:1)

svc #128svc 0x80调用是ARM指令集(ARM Documentation)中的Supervisor Call。您需要查看寄存器值以指示被调用的内容。

示例汇编程序:

libsystem_kernel.dylib`__pthread_kill:
0x195557268:  movz   x16, #328                 // NOTE THIS VALUE
0x19555726c:  svc    #128
0x195557270:  b.cc   0x195557288               ; __pthread_kill + 32
...

在此Kernel System Calls表中查找movz值(本例中为#328)。对于#328,这对应于pthread_kill,它与上面列出的方法的名称相匹配。当调用中断时,它将在svc之后立即落在指令上,在本例中为b.cc指令。

请注意,LLDB也会中断某些线程到线程信号,例如: SIGUSR2,即使它是有意和正确的。您可以将Xcode配置为忽略此状态并继续执行而不会出现问题:

Permanently configuring LLDB (in Xcode 4.3.2) not to stop on signals

感谢Notlikethat的输入