「信号机制」应用—程序hang住怎么办

转载请注明出处:https://blog.csdn.net/jinixin/article/details/80384729

 

本文是信号机制三篇记录中的第三篇,介绍信号机制的一个小用法,定位hang住代码的位置。第一篇简单介绍了Linux信号机制,第二篇介绍Python中负责信号处理的signal模块,并给出了小demo。三篇组成一个系列,想起抛砖引玉的作用,希望对大家能有所帮助。

 

 

问题

 

想必大家在工作中可能遇到过这样的问题,调试和执行程序都没有问题,但在运行一段时间后,程序莫名阻塞在某处。

发生这种问题,第一反应就是头疼,茫茫码海,该如何去定位问题呢?

这时我会想通过增加日志寻找在哪处进入无限循环或是hang住了,但除非一次性加入很多日志,否则无法准确定位问题点。而一次无法定位,我只好等到第二次hang住后,针对日志反馈再继续对可疑区域增加记录,如此往复。结果服务可靠性没有了保证,而且整个人也十分受挫。

那有没有什么办法可以一下子就找到问题在哪?不打那么多没用的日志,不用使服务多次停止呢?

 

 

思路

 

这里暂且给出一种思路,做个抛砖引玉。

在程序中加入信号量机制,当程序运行一段时间hang住后,直接对进程发送对应信号量,使程序转入处理特定信号量的函数中,在此函数中打印目前程序运行的上下文内容,便可大致定位问题所在。

 

 

案例

 

下面就给出一个Python演示程序:

#!/usr/bin/env python3
# coding=utf-8

import os
import time
import signal
import traceback


def handle_SIGINT(signum, frame):
    print('handle sigint!{0}{1}'.format(os.linesep, '*' * 100))
    print(os.linesep.join(traceback.format_stack(frame)))  # 打印收到SIGINT信号时,程序执行处的上下文信息


def main():
    signal.signal(signal.SIGINT, handle_SIGINT)  # 注册SIGINT信号的处理器为handle_SIGINT函数
    while True:
        print('呀咿呀,你仰起脸,笑得香满月')
        time.sleep(60)


if __name__ == '__main__':
    main()

 

发现程序hang住后,向对应进程发送SIGINT信号:

 

程序收到SIGINT信号后,进入对应处理器,打印此时运行的上下文:

 

这时通过打印的上下文便可大致定位问题所在

 

文中如有不当之处,还望包容和指出,感谢~

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章