carshlytics 崩溃日志
这个问题突然出现,特别困惑,公司内部大神咨询了一遍,没找到根本原因。很多猜测异步线程 刷新了webView。
[图片上传中...(image.png-7ec48f-1540179166270-0)]
、
Crashed: WebThread
0 WebCore 0x18da9fae8 _WebThreadLock() + 220
1 WebCore 0x18d58b858 WebRunLoopLock(__CFRunLoopObserver*, unsigned long, void*) + 44
2 CoreFoundation 0x1853a6910 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 32
3 CoreFoundation 0x1853a4238 __CFRunLoopDoObservers + 412
4 CoreFoundation 0x1853a4768 __CFRunLoopRun + 1152
5 CoreFoundation 0x1852c4da8 CFRunLoopRunSpecific + 552
6 WebCore 0x18d5882d4 RunWebThread(void*) + 592
7 libsystem_pthread.dylib 0x185025220 _pthread_body + 272
8 libsystem_pthread.dylib 0x185025110 _pthread_body + 290
9 libsystem_pthread.dylib 0x185023b10 thread_start + 4
image.png
转折点
同事联调web界面的时候,右滑关闭web界面app崩溃,访问的web地址是 微软的 员工邮箱 OutLook,每次侧滑关闭崩溃
image.png
WebCore`_WebThreadLock:
0x116a512e0 <+0>: pushq %rbp
0x116a512e1 <+1>: movq %rsp, %rbp
0x116a512e4 <+4>: pushq %r14
0x116a512e6 <+6>: pushq %rbx
0x116a512e7 <+7>: callq 0x117e08f5a ; symbol stub for: pthread_main_np
0x116a512ec <+12>: movl %eax, %r14d
0x116a512ef <+15>: testl %r14d, %r14d
0x116a512f2 <+18>: je 0x116a512fd ; <+29>
0x116a512f4 <+20>: movb $0x1, 0x174dacd(%rip) ; WebCore::SVGNames::zoomAndPanAttr + 7
0x116a512fb <+27>: jmp 0x116a51329 ; <+73>
0x116a512fd <+29>: cmpb $0x1, 0x1735a6c(%rip) ; savedAutoreleasePoolMark + 7
0x116a51304 <+36>: jne 0x116a513c5 ; <+229>
0x116a5130a <+42>: movq 0x1735a67(%rip), %rbx ; webThread
0x116a51311 <+49>: callq 0x117e08f60 ; symbol stub for: pthread_self
0x116a51316 <+54>: movq %rbx, %rdi
0x116a51319 <+57>: movq %rax, %rsi
0x116a5131c <+60>: callq 0x117e08f48 ; symbol stub for: pthread_equal
0x116a51321 <+65>: testl %eax, %eax
0x116a51323 <+67>: je 0x116a513c5 ; <+229>
0x116a51329 <+73>: movl $0x5c, %edi
0x116a5132e <+78>: callq 0x117e08f4e ; symbol stub for: pthread_getspecific
0x116a51333 <+83>: movq %rax, %rbx
0x116a51336 <+86>: testq %rbx, %rbx
0x116a51339 <+89>: je 0x116a5137b ; <+155>
0x116a5133b <+91>: cmpq 0x1735aa6(%rip), %rbx ; webLock
0x116a51342 <+98>: je 0x116a5138c ; <+172>
0x116a51344 <+100>: movb $0x1, %cl
0x116a51346 <+102>: xorl %eax, %eax
0x116a51348 <+104>: lock
0x116a51349 <+105>: cmpxchgb %cl, 0x1735aa4(%rip) ; webLock + 12
0x116a51350 <+112>: jne 0x116a513b7 ; <+215>
0x116a51352 <+114>: movq %rbx, 0x1735a8f(%rip) ; webLock
0x116a51359 <+121>: movl $0x1, %eax
0x116a5135e <+126>: movl %eax, 0x1735a8c(%rip) ; webLock + 8
0x116a51364 <+132>: testl %r14d, %r14d
0x116a51367 <+135>: je 0x116a5139f ; <+191>
0x116a51369 <+137>: movb $0x0, 0x174da58(%rip) ; WebCore::SVGNames::zoomAndPanAttr + 7
0x116a51370 <+144>: incl 0x1735a12(%rip) ; mainThreadLockCount
0x116a51376 <+150>: popq %rbx
0x116a51377 <+151>: popq %r14
0x116a51379 <+153>: popq %rbp
0x116a5137a <+154>: retq
0x116a5137b <+155>: callq 0x117e07a3c ; symbol stub for: WTF::Thread::initializeCurrentTLS()
0x116a51380 <+160>: movq %rax, %rbx
0x116a51383 <+163>: cmpq 0x1735a5e(%rip), %rbx ; webLock
0x116a5138a <+170>: jne 0x116a51344 ; <+100>
0x116a5138c <+172>: movl 0x1735a5e(%rip), %eax ; webLock + 8
0x116a51392 <+178>: incl %eax
0x116a51394 <+180>: movl %eax, 0x1735a56(%rip) ; webLock + 8
0x116a5139a <+186>: testl %r14d, %r14d
0x116a5139d <+189>: jne 0x116a51369 ; <+137>
0x116a5139f <+191>: movl 0x17359df(%rip), %eax ; webThreadLockCount
0x116a513a5 <+197>: incl %eax
0x116a513a7 <+199>: movl %eax, 0x17359d7(%rip) ; webThreadLockCount
0x116a513ad <+205>: cmpl $0x2, %eax
0x116a513b0 <+208>: jae 0x116a513e8 ; <+264>
0x116a513b2 <+210>: popq %rbx
0x116a513b3 <+211>: popq %r14
0x116a513b5 <+213>: popq %rbp
0x116a513b6 <+214>: retq
0x116a513b7 <+215>: leaq 0x1735a36(%rip), %rdi ; webLock + 12
0x116a513be <+222>: callq 0x117e07922 ; symbol stub for: WTF::Lock::lockSlow()
0x116a513c3 <+227>: jmp 0x116a51352 ; <+114>
0x116a513c5 <+229>: callq 0x116a52660 ; CurrentThreadContext()
0x116a513ca <+234>: movq %rax, %rcx
0x116a513cd <+237>: leaq 0x170b23c(%rip), %rdi ; @"%s, %p: Tried to obtain the web lock from a thread other than the main thread or the web thread. This may be a result of calling to UIKit from a secondary thread. Crashing now..."
0x116a513d4 <+244>: leaq 0x13f80da(%rip), %rsi ; "void _WebThreadLock()"
0x116a513db <+251>: xorl %eax, %eax
0x116a513dd <+253>: movq %rcx, %rdx
0x116a513e0 <+256>: callq 0x117e06c7a ; symbol stub for: NSLog
0x116a513e5 <+261>: int3
0x116a513e6 <+262>: ud2
0x116a513e8 <+264>: callq 0x116a52660 ; CurrentThreadContext()
0x116a513ed <+269>: movq %rax, %rcx
0x116a513f0 <+272>: leaq 0x170b239(%rip), %rdi ; <@"%s, %p: Multiple locks on web thread not allowed! Please file a bug. Crashing now..."
0x116a513f7 <+279>: leaq 0x13f80b7(%rip), %rsi ; "void _WebThreadLock()">
0x116a513fe <+286>: xorl %eax, %eax
0x116a51400 <+288>: movq %rcx, %rdx
0x116a51403 <+291>: callq 0x117e06c7a ; symbol stub for: NSLog
0x116a51408 <+296>: int3
-> 0x116a51409 <+297>: ud2
0x116a5140b <+299>: nopl (%rax,%rax)
image.png
猜测
xcode日志 只有_WebThreadLock 没有具体的错误原因,也没有定位到崩溃代码位置。crashlytics上有一下runloop相关信息
1 WebCore 0x18d58b858 WebRunLoopLock(__CFRunLoopObserver*, unsigned long, void*) + 44
所以我猜测是不是项目中使用runloop出现了问题。全局查找,注册了所有的runloop,然后在测试 右滑关闭outlook界面,崩溃不出现了。注册代码
_timerLoop = [NSTimer timerWithTimeInterval:_durationTime target:self selector:@selector(timerScrollImage) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:_timerLoop forMode:NSDefaultRunLoopMode];
//注册一下代码
// [[NSRunLoop currentRunLoop] runMode:UITrackingRunLoopMode beforeDate:[NSDate date]];