使用signal、setjmp、longjmp进行Linux/Android C异常处理
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <setjmp.h>
jmp_buf sigsegv_buf; void sigsegv_callback(int sig_num){
printf("recieve a segment fault signal! [%d]\n", sig_num);
longjmp(sigsegv_buf, );
return;
}
void vulfunc(){
char dest[];
printf("into vulfunc\n");
strcpy(dest, "deadbeefdeadbeefdeadbeefdeadbeef");
printf("%s\n", dest);
return;
} int main(){
bsd_signal(SIGSEGV, sigsegv_callback);
int res;
res = setjmp(sigsegv_buf);
if(res==){
vulfunc();
}else if(res==){
printf("recovered from segment fault!\n");
}
printf("end\n");
if(res!=){
exit();
}
return ;
}
一个缓冲区溢出函数,导致segment fault 出发异常后的捕获和处理。
- main函数中利用signal/bsd_signal函数注册异常处理函数 sigsegv_callback
- 用setjmp设置程序恢复点(保存寄存器状态)
- 调用vulfunc,发生溢出,导致segment fault
- 执行到sigsegv_callback
- 在sigsegv_callback中使用longjmp从保存的状态中恢复程序到setjmp的下一条指令,设置setjmp的返回值为非0
- setjmp返回的是longjmp中设置的非0值,从而跳转setjmp后面的另一分支。
在Android(native executable file和Java+jni )测试。
亦可参考:http://www.csl.mtu.edu/cs4411.ck/www/NOTES/non-local-goto/sig-1.html
使用signal、setjmp、longjmp进行Linux/Android C异常处理的更多相关文章
- setjmp/longjmp 使用
C语言中有一个goto语句,其可以结合标号实现函数内部的任意跳转(通常情况下,很多人都建议不要使用goto语句,因为采用goto语句后,代码维护工作量加大).另外,C语言标准中还提供一种非局部跳转“n ...
- Linux setjmp longjmp
/********************************************************************* * Linux setjmp longjmp * 说明: ...
- 函数 setjmp, longjmp, sigsetjmp, siglongjmp
一,相关函数接口 1,setjmp,longjmp,sigsetjmp,siglongjmp #include <setjmp.h> int setjmp(jmp_buf env); ...
- 热烈庆祝华清远见2014嵌入式系统(Linux&Android)开发就业培训课程全面升级
近日,华清远见公开宣布:2014嵌入式系统 (Linux&Android)开发就业培训课程再次升级!据悉,华清远见如今已经持续10年,一直保持课程每年2次的更新的频率.华清远见的每 次课程更新 ...
- Linux/Android 性能优化工具 perf
/***************************************************************************** * Linux/Android 性能优化工 ...
- Signal ()函数详细介绍 Linux函数
http://blog.csdn.net/ta893115871/article/details/7475095 Signal ()函数详细介绍 Linux函数 signal()函数理解 在<s ...
- Signal ()函数详细介绍 Linux函数(转)
Signal ()函数详细介绍 Linux函数 收藏人:紫火神兵 2012-09-27 | 阅:5659 转:22 | 来源 | 分享 signa ...
- setjmp/longjmp
1.setjmp/longjmp属于传统的错误处理 2.setjmp/longjmp是对goto语句的补充,goto仅仅能实现局部跳转.setjmp/longjmp能够实现全局跳转 3.setjmp/ ...
- linux&android PPP 相关知识
Linux&Android PPP相关FAQ 目录 Linux&Android PPP相关FAQ.. 1 一. 文档说明... 3 二. 常见调试技 ...
随机推荐
- VC_MFC水波纹控件,开源
代码和效果图: https://github.com/wjx0912/MfcWaterEffect 集成以下5个文件即可: watereffect\DIB.hwatereffect\DIB.cppwa ...
- HTML、html
1.HTTPS(超文本传输协议,HyperText Transfer Protocol) 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息.HTTP协议以明文方式发 ...
- linux 中printf的使用
linux 中printf的使用printf "helloworld\n"printf 中换行必须加上\n printf '%d %s\n' 1 "abc" c ...
- .NET微信通过授权获取用户的基本信息
一.填写授权回调页面的域名 二.引导用户到指定的授权页面 例如:https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID& ...
- NodeJs http.get 方法请求时间过长问题处理!
NodeJs 获取网页内容 http.get 默认请求超时过长了,程序要卡死好一会. 根据网上资料现改造了一个带超时设置的获取网页内容方法. 主要方法使用 setTimeout 来超时, 代码如下: ...
- Shiro 整合SpringMVC 并且实现权限管理
Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Security做的功能强大 ...
- Asp.net MVC中 Controller 与 View之间的数据传递
在ASP.NET MVC中,经常会在Controller与View之间传递数据 1.Controller向View中传递数据 (1)使用ViewData["user"] (2)使用 ...
- 安装 python psutil 包
yum install python-pip 下载 psutil https://pypi.python.org/pypi?:action=display&name=psutil#downlo ...
- .net 中生成二维码的组件
http://qrcodenet.codeplex.com/
- unity3d 镜头随鼠标移动
using UnityEngine; using System.Collections; public class sheji : MonoBehaviour { public int speed = ...