SIG是信号名的通用前缀,SEGV是段违法的缩写,SEGV_MAPERR表示堆栈映射错误。SIGSEGV一般发生内存操作时,比如__memcpy_base、memcpy等。在 POSIX 兼容的平台上,SIGSEGV 是当一个进程执行了一个无效的内存引用,或发生段错误时发送给它的信号。SIGSEGV 的符号常量在头文件 signal.h 中定义。因为在不同平台上,信号数字可能变化,因此符号信号名被使用。通常情况下,它的信号是11。
当程序企图访问 CPU 无法定址的内存区块时,计算机程序可能抛出 SIGSEGV。SIGSEGV通常由操作系统生成,但是有适当权限的用户可以在需要时使用kill系统调用或kill命令(一个用户级程序,或者一个shell内建命令)来向一个进程发送信号。
以下是转自bugly的两个ios的例子:
闪退场景一: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;
SIG是信号名的通用前缀,SEGV是段违法的缩写,SEGV_MAPERR表示堆栈映射错误。SIGSEGV一般发生内存操作时,比如__memcpy_base、memcpy等。在 POSIX 兼容的平台上,SIGSEGV 是当一个进程执行了一个无效的内存引用,或发生段错误时发送给它的信号。SIGSEGV 的符号常量在头文件 signal.h 中定义。因为在不同平台上,信号数字可能变化...
01-01 17:17:34.870 F/libc ( 1606): Fatal
sig
nal 11 (
SIGSEGV
) at 0x00000018 (code=1), thread 1942
01-01 17:17:34.930 I/DE
BUG
( 1167): *** *** *** *** *** *
-> % ./a.out 9000000
the size is: 0x895440
[2] 10558 segmentation fault (core dumped) ./a.out 9000000
打印跟了一下程序,段错误发生在定义数组的时候,感觉程序没毛病,就使用gdb跟了一下,效果如下:
(gdb) r ...
在日志的最后看到了红字
IMemory : cannot map BpMemoryHeap (binder=0x9b2af780), size=18665472, fd=87 (Out of memory)
什么?我OOM了?但是我在开发的过程中,明明通过LeakCancy内存泄漏神器进行了周密的内存泄漏排除鸭。
并且问题并不复现,在思考了两三天后,并
SIGSEGV
(
SEGV
_
MAPER
R)
记录一下关于我在项目中遇到
SIGSEGV
(
SEGV
_
MAPER
R) 异常引起原因。
在 POSIX 兼容的平台上,
SIGSEGV
是当一个进程执行了一个无效的内存引用,或发生段错误时发送给它的信号。
SIGSEGV
的符号常量在头文件
sig
nal.h 中定义。因为在不同平台上,信号数字可能变化,因此符号信号名被使用。通常,它是信号11。
对于不正确的内存处理,如当程序企图访问 CPU 无法定址的内存区块时,计算机程序可能抛出
SIGSEGV
。操作系统可能使用信号栈
在程序运行的过程中,有时候会抛出错误
SIGSEGV
。
什么是
SIGSEGV
?
SIGSEGV
:
SIG
是信号名的通用前缀,
SEGV
是segmentation violation,也就是存储器区段错误。
SIGSEGV
原因:
一般是无效的内存引用,导致进程异常终止。一般可以具体为下面三种情况:
访问空指针。
char *c = NULL;
*c; // dereferencing a NULL pointer
内存越界访问
char *c = "Hello";
c[10] =
问题:在验证某些功能时,启动camera auto DC模式成功,切换其它模式失败基本必现camera error,crash log如下:
C015C0D 08-08 16:01:22.447 6408 6600 F libc : Fatal
sig
nal 11 (
SIGSEGV
), code 1 (
SEGV
_
MAPER
R), fault addr 0xe375435c in tid 6600 (res_init), pid 6408 (provider@2.4-se)
C015DB6 0...
Crash reason:
SIGSEGV
/
SEGV
_
MAPER
R Crash address: 0xaef15000 Process uptime: not available Thread 0 (crashed) 0 libQtGui.so.4 + 0x29531a r0 = 0x00bb80b6 r1 = 0x00bb00b6 r2 = 0x00000011 r3 = 0xff000000 r4 = 0xbac6b57a r5 = 0x00d300cd r6 = 0xaef15000 r7 = 0x02380124 r8 = 0x00ff0000 r9 = 0x02380124 r10 = 0x00000000 r12 = 0xaef15011 fp = 0x0000000f sp = 0xbee2c2c0 lr = 0xaef15000 pc = 0xb64ae31a Found by: given as instruction pointer in context 1 rtm2!google_breakpad::LinuxPtraceDumper::GetThreadInfoByIndex(un
sig
ned int, google_breakpad::ThreadInfo*) [linux_ptrace_dumper.cc : 224 + 0xa] sp = 0xbee2c2d8 pc = 0x0001ec08 Found by: stack scanning 2 0xffee9b0b r4 = 0xffee9b0d r5 = 0xffee9b0d r6 = 0xffee9b0d r7 = 0xffee9b0d r8 = 0xffee9b0d r9 = 0xffee9b0d r10 = 0xffee9b0d fp = 0xffee9b0d sp = 0xbee2c418 pc = 0xffee9b0d Found by: call frame info 3 libQtGui.so.4 + 0x28e565 sp = 0xbee2c430 pc = 0xb64a7567 Found by: stack scanning 这段是什么意思?
这段是一段程序崩溃的日志信息,其中包含了崩溃的原因、地址、进程运行时间、线程信息等。
Crash reason:
SIGSEGV
/
SEGV
_
MAPER
R 表示崩溃的原因是段错误,这是指程序试图访问不属于其自己的内存区域。
Crash address: 0xaef15000 是崩溃发生时程序访问的非法内存地址。
Process uptime: not available 表示无法获取进程运行时间。
Thread 0 (crashed) 0 libQtGui.so.4 0x29531a 是崩溃发生时调用堆栈中的第一个函数调用,并且这个函数在 libQtGui.so.4 库中,在 0x29531a 位置发生崩溃。
r0-r12,fp,sp,lr,pc是程序在崩溃时的寄存器值。
Found by: given as instruction pointer in context 1 rtm2!google_breakpad::LinuxPtraceDumper::GetThreadInfoByIndex(un
sig
ned int, google_breakpad::ThreadInfo*) [linux_ptrace_dumper.cc : 224 0xa] 表示这些信息是由LinuxPtraceDumper来收集的。
总之,这段日志信息表明程序在libQtGui.so.4库中的0x29531a位置发生了段错误,导致程序崩溃。