利用Linux信号SIGUSR1调试嵌入式程序
来源:互联网 发布:ug五轴联动编程 编辑:程序博客网 时间:2024/05/16 19:30
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调试嵌入式程序
- 利用Linux信号SIGUSR1调试嵌入式程序
- SIGUSR1信号程序退出
- linux gdb调试程序 - 信号
- 信号学习 SIGUSR1信号实现
- 嵌入式linux调试程序的一个方法
- 使用eclipse进行调试嵌入式Linux程序
- 5.2嵌入式linux程序编译与调试
- 嵌入式linux程序之调试方法
- 利用linux信号机制调试段错误(Segment fault)
- Unix:用户自定义信号-SIGUSR1和SIGUSR2
- 在Linux下利用GDB调试程序
- 嵌入式程序调试方案
- 嵌入式Linux调试方法
- 嵌入式linux调试技巧
- 捕捉SIGUSR1 SIGUSR2的简单程序
- Linux 程序信号处理
- Linux下signal中SIGUSR1使用_sigqueue
- 对象作用域与Servlet事件监听器
- linux文件系统简介
- 存储管理——虚拟内存
- 748 C. Santa Claus and Robot codeforces
- C程序设计 例题5.11 译密码
- 利用Linux信号SIGUSR1调试嵌入式程序
- Linux命令行操作
- ubuntu安装jdk8
- Android之图片压缩和Uri与String类型的路径转换,获取图片,文件大小的工具类
- 关于反射的运行时机
- JavaWeb过滤器
- 群辉tomcat安装目录,群辉修改tomcat设置
- 12-10 的周末时光
- 148. Sort List leetcode list