2016-11-14 112 views
0

我得到這個異常拋出在應用程序的某個點,但無法追查原因。我假設它只是一個從後臺線程調用的UI調用,但是我找不到在主線程中沒有進行的任何UI調用。如何追蹤這個異常

順便說一句,所有的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:] 

編輯: OK我真的很幸運,發現並沒有包裹在主線程調用的通知。原來,這是一個從觸發通知的後臺線程更改的屬性。令人驚訝的是很難找到被調用的UI代碼。我一定做錯了什麼。

+2

確保將所有UI調用分派給主線程。這可能會解決問題。 – vadian

+0

可能重複[獲取「此應用程序正在修改自動佈局引擎」錯誤?](http://stackoverflow.com/questions/28302019/getting-a-this-application-is-modifying-the-autolayout-engine-錯誤)討論以突出問題:http://stackoverflow.com/questions/28302019/getting-a-this-application-is-modifying-the-autolayout-engine-error – Larme

+0

謝謝,我會嘗試Xcode斷點 - 從來沒有有機會之前使用它。 –

回答

0
  • 嘗試在主隊列中實現UI更改。

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

你加了所有的異常斷點?它可以幫助。

enter image description here

0

你是對的,這是由於來自背景UI修改。你可以在xCode中添加一個異常斷點,並試着確定這個調用在哪裏?

之後,你就可以撥打這通電話中

DispatchQueue.main.async { your call } 

爲迅速,或GCD版本爲目標C

0

你不應該做與在後臺線程UIKit對象的任何變化。他們應該在蘋果在其開發者文檔中陳述的主線程中完成。

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 :)

+0

謝謝,我已經知道這一點,我無法弄清楚是哪一行UI代碼被調用導致這個異常。我一定錯過了一些代碼,但不能在被調用的代碼上得到一個斷點。 –

+0

我相信你已經設置了一個異常斷點來捕獲它。如果不是,我添加了照片來這樣做。我希望它有幫助 – KrishnaCA

+0

但它不顯示任何代碼行 - 請參閱我的問題的補充。 –

0

我會添加一些步驟,以@ mkeremkeskin的回答:

循序漸進:

  1. 轉到斷點導航:Breakpoint Navigator
  2. 添加一個異常斷點:Exception Breakpoint
  3. 讓它扔在所有異常

您應該能夠追查異常現在。