linux 信号

SIGSEGV与SIGBUS

SIGBUS(Bus error)意味着指针所对应的地址是有效地址,但总线不能正常使用该指针。通常是未对齐的数据访问所致。

SIGSEGV(Segment fault)意味着指针所对应的地址是无效地址,没有物理内存对应该地址。

SEGV_MAPERR, 地址没有映射到对象,可能的原因是dangling pointer或者overflow,

比如

1. ptr1和ptr2指向同一段内存,但是某个线程某个时刻用ptr1将内存delete了,如果因为错误的设计或者假设导致认为ptr2还是指向合法的内存,使用时就会出错;

2. 某个数组有1个元素,但是传入的数组大小却是2,如果我们要用2作为长度来遍历这个数组,那当访问第二个元素时就会出错;

 

SEGV_ACCERR, 对映射的对象没有权限




<><><><><><><><><><><><><><><><><><><><><><><><><><>

SIGSEGV(Segmentation fault)

在内存中,这个地址是存在的。但是,你的程序并没有权利进入这一区域。

当Xcode打出这条Crash Logs时,表示你意图进入一个非法的内存地址区域。它并非是ObjC相关的,而是C放出来的,所以,就算你没有ObjC的对象,也可能碰到这个导致程序当掉的BUG。

值得注意的是它并不是一个异常,所以我们不能用@try 和@catch对去抓他们,但是你可以设置你自己的 signal & sigaction 函数去处理。

如果你不懂什么叫signal ,可以先看看wikipedia是怎么解释的。

SIGBUS(Bus error)

进入非法的内存空间。至多时候,这一块内存空间都是不存在的,又或者你的赋值方式不正确。

SIGFPE(Floating point exception)

无效的算术操作,但是能够被识别成整型操作。

SIGPIPE

你尝试写入一些内容(比如一个音频文件)到管道,但是没有去处理读取结束。

SIGILL

illegal processor instruction.

SIGTRAP

当你在支持指令断点或者变量断点处查看的处理器上运行程序时候,调试器将会去请求CPU进入当相关地址查看指令集,或者进入特定地址段的读写。这个时候,整个程序还是全速运行的。

当处理器检测到断点事件时候,它将追踪到内核当中,内核发送SIGTRAP到正在调试运行的进程。一般情况下,SIGTRAP将会将次进程干掉,但是因为程序正在被调试,调试器将会被通知这一信号同时处理这一情况,调试器继续运行前,通常会让你去查看进程的状态。

SIGABRT

程序当掉。比如你有这样一句代码:

for(…..){

[NSString* objectkey = NSString stringWithFormat:@"%@",[line objectAtIndex:1]];

}

当程序跑到这一行的时候,程序挂掉了,并且抛出了SIGABRT。这个时候,可能是[line objectAtIndex:1],出问题了。可是当你去调试的时候,比如:NSLog(@”%d”,[line count]);打印出来的是数组中有三个数据,问题处在那里呢?

遇到这种情况的时候,有两个调试技巧可以帮助你解决问题:

1、认为问题还是line这个数组上,那么你可以这样做:

for(Object* obj in  line)

NSLog(@”%@”,[line description]);

先看看是不是真的问题处在Line数组的第二个位置没有相应的元素(不是一个NSString*对象,而是一个内存地址)。

2、因为我们是在GDB下的程序,用stringWithString 取代stringWithFormat这一个函数。StringWithFormat使用不确定的方式分割字符串并格式化,而stringWithString是复制char by char。

先写到这里


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值