利用Linux信号SIGUSR1调试嵌入式程序

时间:2022-09-18 20:18:20

转自:http://blog.csdn.net/u010133805/article/details/53899667

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 ;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

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

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

针对如上的特性,我们设计了一种信号处理函数,如果收到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 ;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

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

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

if(flag)
{
debug("Thread is running!\n");
}
  • 1
  • 2
  • 3
  • 4
利用Linux信号SIGUSR1调试嵌入式程序
  • 1
  • 2
  • 3
  • 4