SIGTRAP
摘自 Bugly
SIG是信号名的通用前缀。TRAP 是陷阱的意思。它并不是一个真正的崩溃信号。它会在处理器执行 trap 指令时发送。LLDB调试器通常会处理此信号,并在指定的断点处停止运行。如果你收到了原因不明的 SIGTRAP,先清除上次的输出,然后重新进行构建通常能解决这个问题。
该异常是由于打算给一个附加的调试器在执行特定的断点来中断进程时触发。你可以在自己的代码中使用__builtin_trap()方法来触发此异常。如果没有被调试器所附加,那么进程将会结束并且生成一份崩溃报告。
如果Swift代码在运行时发现一个意外的情况时,也会以该异常类型结束程序。例如:
为一个非可选(non-optional)类型被赋值nil
- 崩溃 1.1
#0 Thread
SIGTRAP
解析原始
0 libdispatch.dylib __dispatch_semaphore_dispose$VARIANT$armv81 + 76
1 libdispatch.dylib __dispatch_dispose$VARIANT$armv81 + 80
2 libsystem_blocks.dylib _Block_release + 152
3 libsystem_blocks.dylib _Block_release + 152
- 崩溃 1.2 释放ANManager其时, 再次访问
dispatch_semaphore
信号量的崩溃
#0 Thread
SIGTRAP
解析原始
0 libdispatch.dylib __dispatch_semaphore_dispose + 148
1 libdispatch.dylib __dispatch_dispose + 56
2 libdispatch.dylib __dispatch_dispose + 56
3 libdispatch.dylib -[OS_dispatch_object _xref_dispose] + 56
4 AlphaNote -[ANManager .cxx_destruct] + 172
SIGSEGV
先来一段
Bugly
的解释 : SEGV_ACCERR
SIG 是信号名的通用前缀, SEGV 是 segmentation violation 的缩写
在 POSIX 兼容的平台上,SIGSEGV 是当一个进程执行了一个无效的内存引用,或发生段错误时发送给它的信号。SIGSEGV 的符号常量在头文件 signal.h 中定义。因为在不同平台上,信号数字可能变化,因此符号信号名被使用。通常,它是信号11。
对于不正确的内存处理,如当程序企图访问 CPU 无法定址的内存区块时,计算机程序可能抛出 SIGSEGV。操作系统可能使用信号栈向一个处于自然状态的应用程序通告错误,由此,开发者可以使用它来调试程序或处理错误。
在一个程序接收到 SIGSEGV 时的默认动作是异常终止。这个动作也许会结束进程,但是可能生成一个核心文件以帮助调试,或者执行一些其他特定于某些平台的动作。
SIGSEGV可以被捕获。也就是说,应用程序可以请求它们想要的动作,以替代默认发生的动作。这样的动作可以是忽略它、调用一个函数,或恢复默认的动作。在一些情形下,忽略 SIGSEGV 导致未定义行为。
一个应用程序可能处理SIGSEGV的例子是调试器,它可能检查信号栈并通知开发者目前所发生的,以及程序终止的位置。
SIGSEGV通常由操作系统生成,但是有适当权限的用户可以在需要时使用kill系统调用或kill命令(一个用户级程序,或者一个shell内建命令)来向一个进程发送信号。
闪退场景一:recorder deleteRecording 之前 先判断文件是否存在,否则会造成过度释放,解决方法:
if ([[NSFileManager defaultManager] fileExistsAtPath:self.recorder.url.path]) {
if (![self.recorder deleteRecording])
NSLog(@"Failed to delete %@", self.recorder.url);
}
闪退场景二: delegate = nil 。
将XXViewContrller设置为delegate时,当页面发生跳转时,XXViewController的对象会被释放,这是代码走到[_delegate callbackMethod],便出现crash。解决方法有二:1.将@property (nonatomic ,assign) id <BLELibDelegate>delegate; 中 assign关键字改为weak。 2.在XXViewController的delloc方法中添加:xxx.delegate = nil;
SIGSEGV 是当一个进程执行了一个无效的内存引用,或发生段错误时发送给它的信号。
#24 Thread
SIGSEGV
SEGV_ACCERR
解析原始
0 CoreFoundation CFDataGetBytePtr + 84
1 CFNetwork HTTPMessage::copyHeadersWithShadowedArrayValues() + 260
2 CFNetwork HTTPMessage::copyHeadersWithShadowedArrayValues() + 260
3 CFNetwork URLRequest::createArchiveList(__CFAllocator const*, long*, void const***, long*, __CFDictionary const**) const + 1060
4 CFNetwork URLRequest::copyPropertyList(__CFAllocator const*, __CFDictionary const**) const + 84
5 CFNetwork ___ZN12__CFURLCache23CreateAndStoreCacheNodeEP16__CFURLCacheNodePK20_CFCachedURLResponsePK10__CFStringPK13_CFURLRequestPKvbRb_block_invoke + 1128
6 libdispatch.dylib __dispatch_call_block_and_release + 24
网友评论