美国泰科国际有限公司信号机内fault log是什么意思

4199人阅读
c/c++ learning(32)
&&&&&&& 在实际开发过程中,大家可能会遇到段错误的问题,虽然是个老问题,但是其带来的隐患是极大的,只要出现一次,程序立即崩溃中止。如果程序运行在PC中,segment fault的调试相对比较方便,因为可以通过串口、显示器可以查看消息,只要程序运行,通过GDB调试工具即可捕捉产生segment fault的具体原因。但是不知大家有没有想法,当程序运行在嵌入式设备上时,你所面临资源的缺乏,你没有串口打印信息,没有显示器可查看,你不知道程序运行的状态,如果程序的产生segment falut这种bug发生的周期1年之内只发生过三四次,时间又不确定,你又如何调试知道程序发生错误的具体位置呢?等等问题实在令人纠结。
&&&&&&& 解决此问题的方式方法有如下几种:
&&&&&& 1 在产品发布之前,尽量将所有segment fault产生原因找出,全部消除(最理想情况下)
&&&&&& 2 在程序中的关键位置增加打印信息,设定打印级别,通过打信的信息缩小查bug的范围,如果是嵌入式设备,需要将这些信息写入文件,保存在flash中。
&&&&&& 3 利用看门狗喂狗,如果程序中止或长期陷入死循环,将重新加载程序
&&&&&& 4 利用linux信号机制来解决段错误问题(有点类似于软看门狗)
&&&&&& 下面我着重讲解第4要点的解决方式:
&&&&&&& 首先,我先叙述下我的总体思路,假设我的程序在某处调用一函数dummy_func(),这个函数有个segment fault段错误,如果你程序没对其进行处理,不用怀疑,你的程序马上挂掉,如果是嵌入式设备里的程序,你可能不知道产生segment fault的具体原因和具体位置,只能看log日志慢慢分析。我们知道,在linux的信号机制中,当产生segment fault错误时,程序会产生SIGSEGV信号,于是我们试想,如果我们在程序中能够及时捕捉到此信号,然后在此信号处理函数中重新加载此应用程序,就可以实现类似看门狗的功能,暂且将这种方法称之为软件看门狗吧。但是此方法只是权宜之计,它可以让你的产品在客户面前保持良好印象(因为如果程序挂掉后又重新加载了,而客户不知道),而不至于长期很频繁的去现场解决此问题,这种方式适用于产生段错误的周期具有不确定性,其实我们都知道遇到segment fault我们还得解决此问题产生的具体原因,这才是正确的解决方式。
&&&&&&& 下面我列出完整的程序源码,虽然简单,但是非常有用:
/******************************程序开始
**********************************/
#include &stdio.h&
#include &signal.h&
#include &string.h&
#include &stdlib.h&
char main_status = 0;
/***********************
&* 此函数产生一个段错误
&* *********************/
void dummy_func(void)
&&& printf(&hello world/n&);
&&& char *p = NULL;&&&& //0地址
&&& *p = 0x1a;&&&&&&&&&&&& //对0地址写入数据,出现段错误
/************************
&* 此函数用于重新加载程序
&************************/
void deal(void)
&& char buffer[255];
&& memset(buffer, 0, sizeof(buffer));
&& sprintf(buffer, &cd ~/test&);
&& system(buffer);
&&& *此延时很重要,如果不加延时,ctrl+c的信号无法及时处理(即ctrl+c失效),程序将循环加载&&&
&&& * 如果不加延时,程序又重新执行后面./test1语句将重新加载应用程序了
&&&& sleep(5);&
&& memset(buffer, 0, sizeof(buffer));
&& sprintf(buffer, &./test1&);
&& system(buffer);
&& printf (&xxxxxxxxxxxxxxx/n&);
&& if( 1 == main_status )
&&&&&&& exit(0);
/**************************
&* 捕捉到ctrl+c信号的处理函数
&**************************/
void ctrl_c_func(int signo)
&&& printf(&stop the demo/n&);
&&& main_status = 1;& //置标志位
&&& exit(0);
int ctrl_c_func_init(void)
&&& int ret = 0;
&&& act.sa_handler = ctrl_c_
&&& sigemptyset(&act.sa_mask);
&&& act.sa_flags = 0;
&&& ret = sigaction(SIGINT, &act, NULL);
/****************************
&* main主程序
&****************************/
int main(int argc, char **argv)
&&& signal(SIGSEGV, &deal);&& //捕捉SIGSEGV信号
&&& signal(SIGINT, &ctrl_c_func);& //捕捉SIGINT信号
//&&& ctrl_c_func_init();& //如果不用上面捕捉,调用这个函数也行
&&& while(1)
&&&&&&& if( 1 == main_status )& //如果接收到标志位,则退出
&&&&&&&&&&&& exit(0);
&&&&&&& dummy_func();& //调用产生segment fault函数
&&& return 0;
/******************************程序结束
**********************************/
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:289201次
积分:2721
积分:2721
排名:第9390名
原创:65篇
转载:24篇
评论:86条
(1)(2)(2)(15)(1)(2)(3)(2)(3)(6)(5)(2)(2)(1)(5)(1)(1)(2)(5)(1)(1)(10)(2)(11)(3)西门子信号机说明书T400-4_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
西门子信号机说明书T400-4
上传于||文档简介
&&西​门​子​信​号​机​说​明​书​T0-​4
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩32页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢}

我要回帖

更多关于 美国泰科国际有限公司 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信