转自: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信号用户可以自己定义其处理行为,处理范例如下:
- 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()函数:
- 1
- 2
- 1
- 2
针对如上的特性,我们设计了一种信号处理函数,如果收到SIGUSR1信号,我们应用程序中的一个标志位将会置位真,再次收到置为假,达到通过发送信号控制应用程序运行的目的,用于调试应用程序。信号处理函数设计如下:
- 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
如上我们就可以在程序运行过程中控制程序运行的分支,达到控制应用程序的目的。
另外对于多线程卡死问题,线程卡死情况不明的情况下(线程运行状态无法反应真实情况),可以增加该方法,通过在线程运行路径添加打印日志的方法检测线程是否真正运行。
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4