本文是訊號機制三篇記錄中的第三篇,介紹訊號機制的乙個小用法,定位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!'.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訊號後,進入對應處理器,列印此時執行的上下文:
這時通過列印的上下文便可大致定位問題所在
文中如有不當之處,還望包容和指出,感謝~
Android 怎麼退出整個應用程式?
我們在寫android應用程式時,經常會遇到想退出當前acitivity,或者直接退出應用程式.我之前的一般操作是按返回鍵,或者直接按home鍵直接返回,其實這兩種操作都沒有關閉當前應用程式,沒有釋放系統資源。有時跳轉的activity較多時,還需要多次按返回鍵,這樣感覺一點都不爽。後面新增了乙個選...
Windows應用程式執行機制(筆記)
windows應用程式 以 windows 作為平台執行的應用程式。api函式 api函式 windows 提供了大量可以在應用程式中呼叫的,用 c語言編寫的函式。windows api 函式的功能如下 1.視窗管理函式 實現視窗的建立 移動和修改等功能。2.圖形裝置函式 實現圖形的繪製及操作功能,...
Windows應用程式訊息處理機制
1 作業系統接收到應用程式的視窗訊息,將訊息投遞到該應用程式的訊息佇列中。2 應用程式在訊息迴圈中呼叫getmessage函式從訊息佇列中取出一條一條的訊息。取出訊息後,應用程式可以對訊息進行一些預處理,例如,放棄對某些訊息的響應,或者呼叫translatemessage產生新的訊息 3 應用程式呼...