利用Linux信号SIGUSR1调试程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

利⽤Linux信号SIGUSR1调试程序
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");
}。

相关文档
最新文档