如何追踪此异常

时间:2016-11-14 10:46:41

标签: ios

我在应用程序中的某个点抛出此异常,但无法追踪原因。我假设它只是一个从后台线程调用的UI调用,但我找不到任何未在主线程上进行的UI调用。

BTW所有的UI调用都包含在DispatchQueue.main.async{}中,可能是我错过了一些但却无法弄清楚如何追踪它。

任何建议如何找出导致此问题的调用 - 有几个后台线程同时运行以及来自SNS和蓝牙的事件。

This application is modifying the autolayout engine from a background thread after the engine was accessed from the main thread. This can lead to engine corruption and weird crashes.
 Stack:(
    0   CoreFoundation                      0x000000018fc8e1d8 <redacted> + 148
    1   libobjc.A.dylib                     0x000000018e6c855c objc_exception_throw + 56
    2   CoreFoundation                      0x000000018fc8e108 <redacted> + 0
    3   Foundation                          0x0000000190875ea4 <redacted> + 192
    4   Foundation                          0x00000001906bd3fc <redacted> + 36
    5   UIKit                               0x0000000196434770 <redacted> + 72
    6   UIKit                               0x0000000195ae61e8 <redacted> + 1140
    7   QuartzCore                          0x0000000192fa6188 <redacted> + 148
    8   QuartzCore                          0x0000000192f9ae64 <redacted> + 292
    9   QuartzCore                          0x0000000192f9ad24 <redacted> + 32
    10  QuartzCore                          0x0000000192f177ec <redacted> + 252
    11  QuartzCore                          0x0000000192f3ec58 <redacted> + 512
    12  QuartzCore                          0x0000000192f3f124 <redacted> + 660
    13  libsystem_pthread.dylib             0x000000018ed22fbc <redacted> + 572
    14  libsystem_pthread.dylib             0x000000018ed22ce4 <redacted> + 200
    15  libsystem_pthread.dylib             0x000000018ed22378 pthread_mutex_lock + 0
    16  libsystem_pthread.dylib             0x000000018ed21da4 start_wqthread + 4
)

好的所以我添加了断点,但我在线程10上得到以下内容(!)我无法弄清楚在线程10上运行的是什么或者正在调用什么UI代码。

libobjc.A.dylib`objc_exception_throw:
->  0x18e6c8524 <+0>:   stp    x28, x27, [sp, #-64]!
    0x18e6c8528 <+4>:   stp    x22, x21, [sp, #16]
    0x18e6c852c <+8>:   stp    x20, x19, [sp, #32]
    0x18e6c8530 <+12>:  stp    x29, x30, [sp, #48]
    0x18e6c8534 <+16>:  add    x29, sp, #48              ; =48 
    0x18e6c8538 <+20>:  sub    sp, sp, #4032             ; =4032 
    0x18e6c853c <+24>:  mov    x20, x0
    0x18e6c8540 <+28>:  orr    w0, wzr, #0x20
    0x18e6c8544 <+32>:  bl     0x18e6b6c24               ; __cxa_allocate_exception
    0x18e6c8548 <+36>:  mov    x19, x0
    0x18e6c854c <+40>:  adrp   x8, 157305
    0x18e6c8550 <+44>:  ldr    x8, [x8, #408]
    0x18e6c8554 <+48>:  mov    x0, x20
    0x18e6c8558 <+52>:  blr    x8
    0x18e6c855c <+56>:  mov    x20, x0
    0x18e6c8560 <+60>:  adrp   x8, 151285
    0x18e6c8564 <+64>:  ldr    x1, [x8]
    0x18e6c8568 <+68>:  bl     0x18e6daf20               ; objc_msgSend
    0x18e6c856c <+72>:  str    x20, [x19]
    0x18e6c8570 <+76>:  adrp   x8, 151286
    0x18e6c8574 <+80>:  add    x8, x8, #160              ; =160 
    0x18e6c8578 <+84>:  add    x8, x8, #16               ; =16 
    0x18e6c857c <+88>:  mov    x21, x19
    0x18e6c8580 <+92>:  str    x8, [x21, #8]!
    0x18e6c8584 <+96>:  mov    x0, x20
    0x18e6c8588 <+100>: bl     0x18e6c681c               ; object_getClassName
    0x18e6c858c <+104>: str    x0, [x19, #16]
    0x18e6c8590 <+108>: cbnz   x20, 0x18e6c859c          ; <+120>
    0x18e6c8594 <+112>: movz   x8, #0
    0x18e6c8598 <+116>: b      0x18e6c85e0               ; <+188>
    0x18e6c859c <+120>: tbz    x20, #63, 0x18e6c85d8     ; <+180>
    0x18e6c85a0 <+124>: lsr    x8, x20, #60
    0x18e6c85a4 <+128>: cmp    x8, #15                   ; =15 
    0x18e6c85a8 <+132>: lsr    x8, x20, #57
    0x18e6c85ac <+136>: and    x8, x8, #0x78
    0x18e6c85b0 <+140>: adrp   x9, 157305
    0x18e6c85b4 <+144>: add    x9, x9, #544              ; =544 
    0x18e6c85b8 <+148>: add    x8, x9, x8
    0x18e6c85bc <+152>: lsr    x9, x20, #52
    0x18e6c85c0 <+156>: adrp   x10, 157305
    0x18e6c85c4 <+160>: add    x10, x10, #672            ; =672 
    0x18e6c85c8 <+164>: add    x9, x10, w9, uxtb #3
    0x18e6c85cc <+168>: csel   x8, x8, x9, lo
    0x18e6c85d0 <+172>: ldr    x8, [x8]
    0x18e6c85d4 <+176>: b      0x18e6c85e0               ; <+188>
    0x18e6c85d8 <+180>: ldr    x8, [x20]
    0x18e6c85dc <+184>: and    x8, x8, #0xffffffff8
    0x18e6c85e0 <+188>: str    x8, [x19, #24]
    0x18e6c85e4 <+192>: adrp   x22, 151466
    0x18e6c85e8 <+196>: add    x22, x22, #1958           ; =1958 
    0x18e6c85ec <+200>: ldrb   w8, [x22]
    0x18e6c85f0 <+204>: cbz    w8, 0x18e6c8610           ; <+236>
    0x18e6c85f4 <+208>: mov    x0, x20
    0x18e6c85f8 <+212>: bl     0x18e6c681c               ; object_getClassName
    0x18e6c85fc <+216>: stp    x20, x0, [sp, #8]
    0x18e6c8600 <+220>: str    x19, [sp]
    0x18e6c8604 <+224>: adrp   x0, 29
    0x18e6c8608 <+228>: add    x0, x0, #2192             ; =2192 
    0x18e6c860c <+232>: bl     0x18e6c7f00               ; _objc_inform
    0x18e6c8610 <+236>: adrp   x8, 151466
    0x18e6c8614 <+240>: add    x8, x8, #1959             ; =1959 
    0x18e6c8618 <+244>: ldrb   w8, [x8]
    0x18e6c861c <+248>: cbz    w8, 0x18e6c8674           ; <+336>
    0x18e6c8620 <+252>: ldrb   w8, [x22]
    0x18e6c8624 <+256>: cbnz   w8, 0x18e6c8644           ; <+288>
    0x18e6c8628 <+260>: mov    x0, x20
    0x18e6c862c <+264>: bl     0x18e6c681c               ; object_getClassName
    0x18e6c8630 <+268>: stp    x20, x0, [sp, #8]
    0x18e6c8634 <+272>: str    x19, [sp]
    0x18e6c8638 <+276>: adrp   x0, 29
    0x18e6c863c <+280>: add    x0, x0, #2192             ; =2192 
    0x18e6c8640 <+284>: bl     0x18e6c7f00               ; _objc_inform
    0x18e6c8644 <+288>: movz   w1, #0x1f4
    0x18e6c8648 <+292>: add    x0, sp, #32               ; =32 
    0x18e6c864c <+296>: bl     0x18eb7709c               ; backtrace
    0x18e6c8650 <+300>: mov    x22, x0
    0x18e6c8654 <+304>: adrp   x8, 132269
    0x18e6c8658 <+308>: ldr    x8, [x8, #48]
    0x18e6c865c <+312>: ldr    x0, [x8]
    0x18e6c8660 <+316>: bl     0x18eb7a548               ; fileno
    0x18e6c8664 <+320>: mov    x2, x0
    0x18e6c8668 <+324>: add    x0, sp, #32               ; =32 
    0x18e6c866c <+328>: mov    x1, x22
    0x18e6c8670 <+332>: bl     0x18eb86804               ; backtrace_symbols_fd
    0x18e6c8674 <+336>: mov    x0, x20
    0x18e6c8678 <+340>: nop    
    0x18e6c867c <+344>: adrp   x2, 0
    0x18e6c8680 <+348>: add    x2, x2, #1680             ; =1680 
    0x18e6c8684 <+352>: mov    x0, x19
    0x18e6c8688 <+356>: mov    x1, x21
    0x18e6c868c <+360>: bl     0x18e6e4764               ; symbol stub for: +[NSObject resolveInstanceMethod:]

编辑:  好的,我很幸运,发现一个未包含在主线程调用中的通知。事实证明,这是一个从触发通知的后台线程更改的属性。很难找到被调用的UI代码。我一定是做错了。

5 个答案:

答案 0 :(得分:0)

  • 尝试在主队列中实现UI更改。

    Swift 3:
            OperationQueue.main.addOperation({
              // Update UI
            })
    

答案 1 :(得分:0)

您是否添加了所有异常断点?它可以帮助。

enter image description here

答案 2 :(得分:0)

你是对的,这是由于来自后台的UI修改。你能在xCode中添加一个异常断点并尝试确定这个调用在哪里吗?

之后,您可以将此电话放在

DispatchQueue.main.async { your call }

用于swift,或用于Objective C的gcd版本

答案 3 :(得分:0)

您不应该在后台线程中对UIKit个对象进行任何更改。它们应该在Apple的开发者文档中所说的主线程中完成。

  

Note

     

在大多数情况下,只能从应用程序的主线程中使用UIKit类。对于从UIResponder派生的类或涉及以任何方式操纵应用程序的用户界面的类尤其如此。

如果你在后台线程中做一些操作,需要更新UIKit元素。您可以通过以下方式执行此操作

dispatch_async(dispatch_get_main_queue(), ^{

});

[[NSOperationQueue mainQueue] addOperationWithBlock:^{

}];

在swift3中,

DispatchQueue.main.async {

}

OperationQueue.main.addOperation { 

}

为了检测您获得异常的位置,您可以使用异常断点来执行此操作。你可以这样做,如下图所示:

In this picture, you can see that <code>UITextView</code> text is being set in background queue

Set a breakpoint exception

Configure it for Objective-C

Ready!!

There you go, caught it :)

答案 4 :(得分:0)

我将在@ mkeremkeskin的回答中添加几个步骤:

一步一步:

  1. 转到断点导航器:Breakpoint Navigator
  2. 添加例外断点:Exception Breakpoint
  3. 让它抛出所有异常
  4. 您现在应该能够追踪例外情况。