转载请注明出处: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信号后,进入对应处理器,打印此时运行的上下文:
这时通过打印的上下文便可大致定位问题所在
文中如有不当之处,还望包容和指出,感谢~