Linux嵌入式由于诸多的限制,调试方法有限,常常出现面对Bug束手无策的情况,现在介绍一种通过信号处理对Linux嵌入式应用程序进行调试的方法。

linux中一共有32种信号,在/usr/include/bits/signum.h 头文件中可以看到,具体如下:SIGHUP ;SIGINT ;SIGQUIT ;SIGILL ;SIGTRAP ;SIGABRT ;SIGIOT ;SIGBUS ;SIGFPE ;SIGKILL ;SIGUSR1 ;SIGSEGV ;SIGUSR2 ;SIGPIPE ;SIGALRM ;SIGTERM ;SIGSTKFLT ;SIGCLD ;SIGCHLD ;SIGCONT ;SIGSTOP ;SIGTSTP ;SIGTTIN ;SIGTTOU ;SIGURG ;SIGXCPU ;SIGXFSZ ;SIGVTALRM ;SIGPROF ;SIGWINCH ;SIGPOLL ;SIGIO ;SIGPWR ;SIGSYS ;SIGUNUSED

其中SIGUSER1信号用户可以自己定义其处理行为,处理范例如下:

#include <stdio.h>
#include <signal.h>
void signal_handle(int sig_num)
{
if(sig_num == SIGUSR1)
{
printf("Capture SIGUSR1\n");
}
printf("signal_handle running ...\n");
} int main(int argc,char **argv)
{
signal(SIGUSR1, signal_handle);
while(1)
{
sleep(100);
}
return 0 ;
}

通过向上述进程发送SIGUSR1信号,即可执行signal_handle()函数:

#向指定的pid进程发送SIGUSR1信号
kill -s SIGUSR1 pid

针对如上的特性,我们设计了一种信号处理函数,如果收到SIGUSR1信号,我们应用程序中的一个标志位将会置位真,再次收到置为假,达到通过发送信号控制应用程序运行的目的,用于调试应用程序。信号处理函数设计如下:

#include <stdio.h>
#include <signal.h> //该变量可以在应用程序中使用
static bool flag = false;
void signal_handle(int sig_num)
{
if(SIGUSR1 != sig_num)
{
return;
} flag = flag ? false : true;
} int main(int argc,char **argv)
{
signal(SIGUSR1, signal_handle);
while(1)
{
if(flag)
{
printf("flag is true!\n");
}
else
{
printf("flag is false\n");
}
sleep(5);
}
return 0 ;
}

如上我们就可以在程序运行过程中控制程序运行的分支,达到控制应用程序的目的。

另外对于多线程卡死问题,线程卡死情况不明的情况下(线程运行状态无法反应真实情况),可以增加该方法,通过在线程运行路径添加打印日志的方法检测线程是否真正运行。

if(flag)
{
debug("Thread is running!\n");
}

利用Linux信号SIGUSR1调试程序的更多相关文章

  1. 利用linux信号机制调试段错误(Segment fault)

    在实际开发过程中,大家可能会遇到段错误的问题,虽然是个老问题,但是其带来的隐患是极大的,只要出现一次,程序立即崩溃中止.如果程序运行在PC中,segment fault的调试相对比较方便,因为可以通过 ...

  2. 利用linux信号机制调试段错误(Segment fault)【转】

    转自:http://blog.csdn.net/ab198604/article/details/6164517 版权声明:本文为博主原创文章,未经博主允许不得转载. 在实际开发过程中,大家可能会遇到 ...

  3. Linux的SIGUSR1和SIGUSR2信号

    SIGUSR1 用户自定义信号 默认处理:进程终止SIGUSR2 用户自定义信号 默认处理:进程终止  当一个进程调用fork时,因为子进程在开始时复制父进程的存储映像,信号捕捉函数的地址在子进程中是 ...

  4. linux 信号与多线程

    在Linux的多线程中使用信号机制,与在进程中使用信号机制有着根本的区别,可以说是完全不同.在进程环境中,对信号的处理是,先注册信号处理函数,当信号异步发生时,调用处理函数来处理信号.它完全是异步的( ...

  5. Linux信号类型说明

    说明 在Linux系统开发中经常要使用到信号来实现异步通知机制.而在Linux系统中信号有很多种,也不用全部记住,学习几种常见的信号,学会使用即可:当然也要知道用哪种方式能够发送这样的信号. 查看li ...

  6. Linux信号(signal) 机制分析

    Linux信号(signal) 机制分析 [摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核 ...

  7. Linux信号实践(2) --信号分类

    信号分类 不可靠信号 Linux信号机制基本上是从UNIX系统中继承过来的.早期UNIX系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,它的主要问题是: 1.进程每次处理信号后,就将对信号 ...

  8. 非常好的一篇对linux信号(signal)的解析 (转载)【转】

    转自:https://blog.csdn.net/return_cc/article/details/78845346 Linux信号(signal) 机制分析 转载至:https://www.cnb ...

  9. Linux 信号:signal 与 sigaction

    0.Linux下查看支持的信号列表: france@Ubuntux64:~$ kill -l ) SIGHUP ) SIGINT ) SIGQUIT ) SIGILL ) SIGTRAP ) SIGA ...

随机推荐

  1. 十六、springcloud(二)Eureka集群

    1.创建子工程spring-cloud-peer(jar) 2.创建application-peer1.properties,application-peer2.properties applicat ...

  2. Logistic Loss的简单讨论

    首先应该知道Logistic Loss和Crossing Entropy Loss本质上是一回事. 所以所谓的SoftMaxLoss就是一般二分类LogisitcLoss的推广.之所以在网络中采取这种 ...

  3. py-day2-5 python 百分号字符串拼接

    #### 字符串格式化. # %s 代替任何的元素 (数字,字符串,列表··) print('I live %s crty' %'my') print('I live %s crty' %'[6,8, ...

  4. freemarker语法介绍及其入门教程实例

    # freemarker语法介绍及其入门教程实例 # ## FreeMarker标签使用 #####一.FreeMarker模板文件主要有4个部分组成</br>####  1.文本,直接输 ...

  5. ubuntu12.04 64bit libncurses5-dev和libncurses5-dev:i386共存性问题讨论

    ubuntu12.04 64bit 编译kernel(或者make menuconfig)源码时出现如下错误: HOSTLD scripts/kconfig/mconf scripts/kconfig ...

  6. Delphi 10-10.2.2启动提示JS错误的解决办法

    HKEY_CURRENT_USER\SOFTWARE\Embarcadero\BDS\18.0\Known IDE Packages\ $(BDS)\Bin\CommunityToolbar240.b ...

  7. Python类的部分

    先来一段代码 表示互殴 class Gailun: country='demaxia' def __init__(self,name,age,life_value,att): self.name=na ...

  8. laravel表单操作

    $request->all()//获取所有参数if($request->isMethod('GET')){判断是否是GET请求}$res = $request->is('studen ...

  9. leetcode4

    public class Solution { public double FindMedianSortedArrays(int[] nums1, int[] nums2) { var nums = ...

  10. 关于div文字点击编辑的插件

    (function(w,i){ w.inputOut = new i(); })( window, function(){ var inputOut = function(){ this.into = ...