專利名稱:一種獲取進(jìn)程阻塞信息的方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)領(lǐng)域,特別涉及一種獲取進(jìn)程阻塞信息的方法及裝置。
背景技術(shù):
進(jìn)程是應(yīng)用程序在計(jì)算機(jī)上的一次執(zhí)行活動(dòng),運(yùn)行一個(gè)應(yīng)用程序即為啟動(dòng)一個(gè)進(jìn) 程。進(jìn)程可以劃分為運(yùn)行、阻塞、就緒三種狀態(tài),并隨一定條件而相互轉(zhuǎn)化,包括就緒轉(zhuǎn)化 為運(yùn)行,運(yùn)行轉(zhuǎn)化為阻塞,阻塞轉(zhuǎn)化為就緒。其中,進(jìn)程的阻塞是指進(jìn)程因等待某一資源(如等待I/O (input/output,輸入輸 出端口 )設(shè)備)而暫時(shí)不能運(yùn)行的狀態(tài),而此時(shí)即使處理機(jī)空閑,進(jìn)程也無(wú)法使用處理機(jī)。 而程序員可以根據(jù)進(jìn)程阻塞信息,分析出進(jìn)程發(fā)生阻塞的原因。在實(shí)現(xiàn)本發(fā)明的過(guò)程中,發(fā)明人發(fā)現(xiàn)現(xiàn)有技術(shù)至少存在以下問(wèn)題目前,現(xiàn)有技術(shù)無(wú)法判斷進(jìn)程是否發(fā)生阻塞,另外,當(dāng)操作系統(tǒng)中的進(jìn)程發(fā)生阻塞 時(shí),現(xiàn)有技術(shù)無(wú)法獲取進(jìn)程的阻塞信息。
發(fā)明內(nèi)容
為了能夠判斷進(jìn)程是否發(fā)生阻塞以及當(dāng)判斷出進(jìn)程發(fā)生阻塞時(shí)獲取進(jìn)程的阻塞 信息,本發(fā)明提供了一種獲取進(jìn)程阻塞信息的方法及裝置。所述技術(shù)方案如下—種獲取進(jìn)程阻塞信息的方法,所述方法包括接收被監(jiān)控進(jìn)程;通過(guò)實(shí)時(shí)監(jiān)控所述被監(jiān)控進(jìn)程收發(fā)消息的過(guò)程,判斷所述被監(jiān)控進(jìn)程是否發(fā)生阻 塞;如果發(fā)生阻塞,則實(shí)時(shí)獲取所述被監(jiān)控進(jìn)程的阻塞信息。所述通過(guò)實(shí)時(shí)監(jiān)控所述被監(jiān)控進(jìn)程收發(fā)消息的過(guò)程,判斷所述被監(jiān)控進(jìn)程是否發(fā) 生阻塞,具體包括實(shí)時(shí)監(jiān)控所述被監(jiān)控進(jìn)程是否發(fā)送消息;如果監(jiān)控出所述被監(jiān)控進(jìn)程發(fā)送消息,則在發(fā)送消息的時(shí)刻起,從零開(kāi)始計(jì)時(shí),并 實(shí)時(shí)監(jiān)控所述被監(jiān)控進(jìn)程是否接收消息;如果所述計(jì)時(shí)的時(shí)間在零到預(yù)設(shè)的閾值之內(nèi),未監(jiān)控出所述被監(jiān)控進(jìn)程接收消 息,則所述被監(jiān)控進(jìn)程發(fā)生阻塞,記錄所述計(jì)時(shí)的時(shí)間超過(guò)所述預(yù)設(shè)的閾值的時(shí)刻為阻塞 開(kāi)始時(shí)刻;如果所述計(jì)時(shí)的時(shí)間在零到所述預(yù)設(shè)的閾值之內(nèi),監(jiān)控出所述被監(jiān)控進(jìn)程接收消 息,則將所述計(jì)時(shí)的時(shí)間清零。所述實(shí)時(shí)獲取所述被監(jiān)控進(jìn)程的阻塞信息,具體包括根據(jù)當(dāng)前時(shí)刻和所述阻塞開(kāi)始時(shí)刻,獲取當(dāng)前阻塞時(shí)間;獲取所述被監(jiān)控進(jìn)程調(diào)用的堆棧以及所述被監(jiān)控進(jìn)程在所述堆棧中訪問(wèn)的區(qū)域 范圍;
獲取所述堆棧中的所述區(qū)域范圍內(nèi)存儲(chǔ)的函數(shù)返回地址;其中,將所述當(dāng)前阻塞時(shí)間和所述函數(shù)返回地址作為所述被監(jiān)控進(jìn)程的阻塞信 肩、ο所述實(shí)時(shí)獲取所述被監(jiān)控進(jìn)程的阻塞信息,還包括根據(jù)所述被監(jiān)控進(jìn)程未占用CPU的時(shí)間獲取所述被監(jiān)控進(jìn)程的CPU占用率,將所 述被監(jiān)控進(jìn)程的CPU占用率作為所述被監(jiān)控進(jìn)程的阻塞信息。所述通過(guò)實(shí)時(shí)監(jiān)控所述被監(jiān)控進(jìn)程收發(fā)消息的過(guò)程,判斷所述被監(jiān)控進(jìn)程是否發(fā) 生阻塞之前,還包括將監(jiān)控程序注入所述被監(jiān)控進(jìn)程中,在所述被監(jiān)控進(jìn)程中創(chuàng)建監(jiān)控線程,所述監(jiān) 控線程用于實(shí)時(shí)監(jiān)控所述被監(jiān)控進(jìn)程。如果所述被監(jiān)控進(jìn)程發(fā)生阻塞,所述方法還包括實(shí)時(shí)監(jiān)控所述被監(jiān)控進(jìn)程是否接收消息,如果監(jiān)控出所述被監(jiān)控進(jìn)程接收消息 時(shí),停止獲取所述被監(jiān)控進(jìn)程的阻塞信息,清除所述阻塞開(kāi)始時(shí)刻。—種獲取進(jìn)程阻塞信息的裝置,所述裝置包括接收模塊,用于接收被監(jiān)控進(jìn)程;第一實(shí)時(shí)監(jiān)控模塊,用于通過(guò)實(shí)時(shí)監(jiān)控所述被監(jiān)控進(jìn)程收發(fā)消息的過(guò)程,判斷實(shí) 時(shí)監(jiān)控所述被監(jiān)控進(jìn)程是否發(fā)生阻塞;實(shí)時(shí)獲取模塊,用于如果發(fā)生阻塞,則實(shí)時(shí)獲取所述被監(jiān)控進(jìn)程的阻塞信息。所述第一實(shí)時(shí)監(jiān)控模塊具體包括實(shí)時(shí)監(jiān)控單元,用于實(shí)時(shí)監(jiān)控所述被監(jiān)控進(jìn)程是否發(fā)送消息;計(jì)時(shí)單元,用于如果監(jiān)控出所述被監(jiān)控進(jìn)程發(fā)送消息,則在發(fā)送消息的時(shí)刻起,從 零開(kāi)始計(jì)時(shí),并實(shí)時(shí)監(jiān)控所述被監(jiān)控進(jìn)程是否接收消息;記錄單元,用于如果所述計(jì)時(shí)的時(shí)間在零到預(yù)設(shè)的閾值之內(nèi),未監(jiān)控出所述被監(jiān) 控進(jìn)程接收消息,則所述被監(jiān)控進(jìn)程發(fā)生阻塞,記錄所述計(jì)時(shí)的時(shí)間超過(guò)所述預(yù)設(shè)的閾值 的時(shí)刻為阻塞開(kāi)始時(shí)刻;清零單元,用于如果所述計(jì)時(shí)的時(shí)間在零到所述預(yù)設(shè)的閾值之前,監(jiān)控出所述被 監(jiān)控進(jìn)程接收消息,則將所述計(jì)時(shí)的時(shí)間清零。所述實(shí)時(shí)獲取模塊具體包括第一獲取單元,用于根據(jù)當(dāng)前時(shí)刻和所述阻塞開(kāi)始時(shí)刻,獲取當(dāng)前阻塞時(shí)間;第二獲取單元,用于獲取所述被監(jiān)控進(jìn)程調(diào)用的堆棧以及所述被監(jiān)控進(jìn)程在所述 堆棧中訪問(wèn)的區(qū)域范圍;第三獲取單元,用于獲取所述堆棧中的所述區(qū)域范圍內(nèi)存儲(chǔ)的函數(shù)返回地址;其中,將所述當(dāng)前阻塞時(shí)間和所述函數(shù)返回地址作為所述被監(jiān)控進(jìn)程的阻塞信 肩、ο所述實(shí)時(shí)獲取模塊還包括獲取單元,用于根據(jù)所述被監(jiān)控進(jìn)程未占用CPU的時(shí)間獲取所述被監(jiān)控進(jìn)程的 CPU占用率,將所述被監(jiān)控進(jìn)程的CPU占用率作為所述被監(jiān)控進(jìn)程的阻塞信息。所述裝置還包括創(chuàng)建模塊,用于將監(jiān)控程序注入所述被監(jiān)控進(jìn)程中,在所述被監(jiān)控進(jìn)程中創(chuàng)建監(jiān)控線程,所述監(jiān)控線程用于實(shí)時(shí)監(jiān)控所述被監(jiān)控進(jìn)程。所述裝置還包括第二實(shí)時(shí)監(jiān)控模塊,用于如果所述被監(jiān)控進(jìn)程發(fā)生阻塞,實(shí)時(shí)監(jiān)控所述被監(jiān)控進(jìn) 程是否接收消息,如果監(jiān)控出所述被監(jiān)控進(jìn)程接收消息時(shí),停止獲取所述被監(jiān)控進(jìn)程的阻 塞信息,清除所述阻塞開(kāi)始時(shí)刻。通過(guò)實(shí)時(shí)監(jiān)控被監(jiān)控進(jìn)程收發(fā)消息的過(guò)程,判斷被監(jiān)控進(jìn)程是否發(fā)生阻塞,如果 發(fā)生阻塞,實(shí)時(shí)獲取被監(jiān)控進(jìn)程的阻塞信息。從而克服了現(xiàn)有技術(shù)不能判斷進(jìn)程發(fā)生阻塞 以及獲取進(jìn)程阻塞信息的缺陷;另外,獲取的阻塞信息可以用于分析出被監(jiān)控進(jìn)程發(fā)生阻 塞的原因。
圖1是本發(fā)明實(shí)施例1提供的一種獲取進(jìn)程阻塞信息的方法流程;圖2是本發(fā)明實(shí)施例2提供的一種獲取進(jìn)程阻塞信息的方法流程圖;圖3是本發(fā)明實(shí)施例3提供的一種獲取進(jìn)程阻塞信息的方法流程圖;圖4是本發(fā)明實(shí)施例4提供的一種獲取進(jìn)程阻塞信息的裝置示意圖。
具體實(shí)施例方式為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合附圖對(duì)本發(fā)明實(shí)施方 式作進(jìn)一步地詳細(xì)描述。實(shí)施例1如圖1所示,本發(fā)明實(shí)施例提供了一種獲取進(jìn)程阻塞信息的方法,包括步驟101 接收被監(jiān)控進(jìn)程;步驟102 通過(guò)實(shí)時(shí)監(jiān)控被監(jiān)控進(jìn)程收發(fā)消息的過(guò)程,判斷被監(jiān)控進(jìn)程是否發(fā)生 阻塞,如果發(fā)生阻塞,則執(zhí)行步驟103 ;步驟103 實(shí)時(shí)獲取被監(jiān)控進(jìn)程的阻塞信息。其中,程序員可以根據(jù)獲取的阻塞信息分析出被監(jiān)控進(jìn)程發(fā)生阻塞的原因。在本發(fā)明實(shí)施例中,通過(guò)實(shí)時(shí)監(jiān)控被監(jiān)控進(jìn)程收發(fā)消息的過(guò)程,判斷被監(jiān)控進(jìn)程 是否發(fā)生阻塞,如果發(fā)生阻塞,實(shí)時(shí)獲取被監(jiān)控進(jìn)程的阻塞信息;從而克服了現(xiàn)有技術(shù)不能 判斷進(jìn)程發(fā)生阻塞以及獲取進(jìn)程阻塞信息的缺陷;另外,獲取的阻塞信息可以用于分析出 被監(jiān)控進(jìn)程發(fā)生阻塞的原因。實(shí)施例2如圖2所示,本實(shí)施例提供了一種獲取進(jìn)程阻塞信息的方法,包括步驟201 接收用戶選擇的需要被監(jiān)控的進(jìn)程;其中,在操作系統(tǒng)中可以同時(shí)啟動(dòng)多個(gè)進(jìn)程,操作系統(tǒng)將應(yīng)用程序放入到一 個(gè)進(jìn)程中,由該進(jìn)程運(yùn)行該應(yīng)用程序。將操作系統(tǒng)中的所有已經(jīng)啟動(dòng)的進(jìn)程都放置在 ⑶KGraphical User hterface,圖形用戶接口)界面中,用戶從⑶I界面選擇需要被監(jiān)控 的進(jìn)程。步驟202 獲取被監(jiān)控進(jìn)程的Handle (句柄);其中,每個(gè)進(jìn)程都有自身的Handle,只有通過(guò)進(jìn)程的Handle才能對(duì)進(jìn)程進(jìn)行各種 操作,所以在本實(shí)施例中需要先獲取的被監(jiān)控進(jìn)程的Handle,然后才能通過(guò)被監(jiān)控進(jìn)程的Handle,從被監(jiān)控進(jìn)程中執(zhí)行獲取阻塞信息的操作。另外,操作系統(tǒng)中存儲(chǔ)每個(gè)進(jìn)程的 Handle,所以從操作系統(tǒng)中獲取存儲(chǔ)的被監(jiān)控進(jìn)程的Handle。其中,在本實(shí)施例中通過(guò)調(diào)用獲取進(jìn)程句柄的函數(shù)來(lái)獲取被監(jiān)控進(jìn)程的Handle。 另外,在操作系統(tǒng)中,通過(guò)進(jìn)程運(yùn)行應(yīng)用程序,進(jìn)程包括多個(gè)線程,進(jìn)程利用其自身包括的 線程分工運(yùn)行應(yīng)用程序。在利用進(jìn)程運(yùn)行應(yīng)用程序時(shí),應(yīng)用程序被分成多個(gè)DLL (Dynamic Link Library,動(dòng)態(tài)鏈接庫(kù))文件,而DLL文件為線程運(yùn)行程序的基本單位,所以通過(guò)線程 調(diào)用并運(yùn)行各個(gè)DLL文件來(lái)分工完成運(yùn)行應(yīng)用程序。步驟203 通過(guò)被監(jiān)控進(jìn)程的Handle,將存儲(chǔ)監(jiān)控程序的DLL文件注入被監(jiān)控進(jìn)程 中;具體地,通過(guò)被監(jiān)控進(jìn)程的Handle,在被監(jiān)控進(jìn)程中為存儲(chǔ)監(jiān)控程序的DLL文件 分配內(nèi)存,將該DLL文件的全路徑寫到分配的內(nèi)存中,根據(jù)該DLL文件的全路徑將該DLL文 件注入到分配的內(nèi)存中。其中,在本實(shí)施例中可以通過(guò)調(diào)用內(nèi)存分配函數(shù)在被監(jiān)控進(jìn)程中分配內(nèi)存,可以 通過(guò)調(diào)用字符串寫入函數(shù)將存儲(chǔ)監(jiān)控程序的DLL文件的全路徑寫入分配的內(nèi)存中,可以通 過(guò)調(diào)用DLL文件加載函數(shù)將該DLL文件注入到分配的內(nèi)存中。步驟204:在被監(jiān)控進(jìn)程中,創(chuàng)建監(jiān)控線程,其中,該監(jiān)控線程用于運(yùn)行注入的監(jiān) 控程序;其中,監(jiān)控線程用于實(shí)時(shí)監(jiān)控被監(jiān)控進(jìn)程;監(jiān)控線程通過(guò)運(yùn)行監(jiān)控程序來(lái)實(shí)現(xiàn)實(shí) 時(shí)監(jiān)控被監(jiān)控進(jìn)程??梢酝ㄟ^(guò)調(diào)用創(chuàng)建遠(yuǎn)程線程函數(shù)創(chuàng)建監(jiān)控線程。另外,只有將監(jiān)控程 序注入到被監(jiān)控進(jìn)程中,才能創(chuàng)建監(jiān)控線程,創(chuàng)建完監(jiān)控線程后,監(jiān)控線程自動(dòng)地運(yùn)行監(jiān)控 程序來(lái)實(shí)現(xiàn)實(shí)時(shí)監(jiān)控被監(jiān)控進(jìn)程。步驟205 通過(guò)監(jiān)控線程實(shí)時(shí)監(jiān)控被監(jiān)控進(jìn)程是否發(fā)生阻塞,如果被監(jiān)控進(jìn)程發(fā) 生阻塞,則執(zhí)行步驟206 ;步驟206 在被監(jiān)控進(jìn)程阻塞期間,實(shí)時(shí)獲取被監(jiān)控進(jìn)程的阻塞信息;其中,當(dāng)監(jiān)控出被監(jiān)控進(jìn)程發(fā)生阻塞之時(shí),獲取被監(jiān)控進(jìn)程的阻塞信息,然后定時(shí) 的每隔一段時(shí)間獲取一次阻塞信息。而每次獲取阻塞信息的過(guò)程,具體為從操作系統(tǒng)中, 獲取當(dāng)前時(shí)刻,并將當(dāng)前時(shí)刻與記錄的阻塞開(kāi)始時(shí)刻做差運(yùn)算得到當(dāng)前阻塞時(shí)間;獲取被 監(jiān)控進(jìn)程包括的每個(gè)線程的線程基本信息(THREAD-BASIC-INFORMATION),從每個(gè)線程基本 信息中,獲取線程調(diào)用的堆棧以及線程在該堆棧中訪問(wèn)的區(qū)域范圍,遍歷獲取的每個(gè)堆棧, 并獲取每個(gè)堆棧中的區(qū)域范圍內(nèi)存儲(chǔ)的函數(shù)返回地址,將該獲取的當(dāng)前阻塞時(shí)間和函數(shù)返 回地址作為被監(jiān)控進(jìn)程的阻塞信息,并存儲(chǔ)被監(jiān)控進(jìn)程的阻塞信息。其中,被監(jiān)控進(jìn)程包括的每個(gè)線程在運(yùn)行應(yīng)用程序時(shí),當(dāng)某個(gè)線程運(yùn)行到應(yīng)用程 序中的調(diào)用函數(shù)的語(yǔ)句時(shí),該線程調(diào)用一個(gè)堆棧,將該語(yǔ)句所在位置的地址作為調(diào)用的函 數(shù)的返回地址壓入到該堆棧中暫時(shí)存儲(chǔ),同時(shí)該線程也將調(diào)用的堆棧以及在該堆棧中存儲(chǔ) 函數(shù)返回地址的位置記錄在線程基本信息中;當(dāng)該線程執(zhí)行完調(diào)用的函數(shù)并需要返應(yīng)用程 序時(shí),從線程的基本信息中記錄的堆棧以及在該堆棧的位置處讀取函數(shù)返回地址,根據(jù)該 函數(shù)返回地址返回到應(yīng)用程序中繼續(xù)運(yùn)行。其中,被監(jiān)控進(jìn)程包括的每個(gè)線程調(diào)用的堆棧即為被監(jiān)控進(jìn)程調(diào)用的堆棧,被監(jiān) 控進(jìn)程包括的每個(gè)線程在堆棧中訪問(wèn)的區(qū)域范圍即為被監(jiān)控進(jìn)程在堆棧中訪問(wèn)的區(qū)域范圍。進(jìn)一步地,在本實(shí)施例中,當(dāng)被監(jiān)控進(jìn)程阻塞時(shí),在每次開(kāi)始獲取阻塞信息起的一 段時(shí)間內(nèi),為了便于說(shuō)明將該段時(shí)間稱為系統(tǒng)時(shí)間SystemTime,在系統(tǒng)時(shí)間SystemTime 內(nèi),獲取被監(jiān)控進(jìn)程未占用CPU的時(shí)間IdleTime,根據(jù)系統(tǒng)時(shí)間SystemTime和被監(jiān)控 進(jìn)程未占用CPU的時(shí)間IdleTime按如下的公式(1)計(jì)算出被監(jiān)控進(jìn)程的CPU空閑率 CurrentCpuIdle ;CurrentCpuIdle = dbIdleTime/dbSystemTime......(1)再根據(jù)被監(jiān)控進(jìn)程的CPU空閑率按如下的公式(2)計(jì)算出被監(jiān)控進(jìn)程的CPU占用 率,還可以將被監(jiān)控進(jìn)程的CPU占用率作為被監(jiān)控進(jìn)程的阻塞信息。CPU 占用率=100-(CurrentCpuIdle*100)/NumberOfProcessors......(2)其中,系統(tǒng)時(shí)間SystemTime是事先設(shè)置的一段時(shí)間,系統(tǒng)時(shí)間SystemTime不 超過(guò)任意相鄰兩次獲取阻塞信息的間隔,NumberOfProcessors為CPU包括的內(nèi)核數(shù)目, NumberOfProcessors 是常數(shù)。其中,程序員可以根據(jù)阻塞信息中的函數(shù)返回地址分析出被監(jiān)控進(jìn)程發(fā)生阻塞的 原因。由于在被監(jiān)控進(jìn)程阻塞期間,定時(shí)地獲取不同時(shí)刻的阻塞信息,從而程序員可以根據(jù) 阻塞信息中的不同時(shí)刻的函數(shù)返回地址分析出被監(jiān)控進(jìn)程在不同時(shí)刻發(fā)生阻塞的原因。步驟207 在監(jiān)控出被監(jiān)控進(jìn)程發(fā)生阻塞時(shí),通過(guò)監(jiān)控線程實(shí)時(shí)監(jiān)控被監(jiān)控進(jìn)程 是否接收信息,如果監(jiān)控出被監(jiān)控進(jìn)程接收消息,則被監(jiān)控進(jìn)程發(fā)生的阻塞結(jié)束,立即停止 獲取被監(jiān)控進(jìn)程的阻塞信息并消除記錄的阻塞開(kāi)始時(shí)刻,然后返回步驟205。其中,在監(jiān)控出被監(jiān)控進(jìn)程發(fā)生阻塞時(shí),步驟206和步驟207同步發(fā)生,并在整個(gè) 被監(jiān)控進(jìn)程阻塞期間,步驟206和步驟207可以相互獨(dú)立地發(fā)生或同步地發(fā)生。其中,在本實(shí)施例中還可以將操作系統(tǒng)中已經(jīng)啟動(dòng)的每個(gè)進(jìn)程作為被監(jiān)控進(jìn)程, 并對(duì)每個(gè)被監(jiān)控進(jìn)程進(jìn)行實(shí)時(shí)監(jiān)控,當(dāng)某個(gè)被監(jiān)控進(jìn)程發(fā)生阻塞時(shí),獲取該被監(jiān)控進(jìn)程的 阻塞信息。其中,在本實(shí)施例中,當(dāng)被監(jiān)控進(jìn)程結(jié)束時(shí),則將創(chuàng)建的監(jiān)控線程從被監(jiān)控進(jìn)程中 卸載掉,同時(shí)從被監(jiān)控進(jìn)程中將為監(jiān)控程序分配的內(nèi)存收回。其中,可以通過(guò)調(diào)用卸載動(dòng)態(tài) 鏈接庫(kù)函數(shù)將監(jiān)控線程從被監(jiān)控進(jìn)程中卸載掉,可以通過(guò)調(diào)用內(nèi)存釋放函數(shù)將分配的內(nèi)存 收回。其中,在本實(shí)施例中,如果操作系統(tǒng)為Windows系統(tǒng),則獲取進(jìn)程句柄的函數(shù)可以 為OperJrocess函數(shù)、內(nèi)存分配函數(shù)可以為VirtualAllocEx函數(shù)、字符串寫入函數(shù)可以 為WriteProcessMemory函數(shù)、DLL文件加載函數(shù)可以為L(zhǎng)oadLibrary函數(shù)、創(chuàng)建遠(yuǎn)程線程 函數(shù)可以為CreateRemoteThread函數(shù)、卸載動(dòng)態(tài)鏈接庫(kù)函數(shù)可以為RemoteThread函數(shù)和 FreeLibrary函數(shù)、內(nèi)存釋放函數(shù)可以為VirtualFreeEx0在本發(fā)明實(shí)施例中,通過(guò)實(shí)時(shí)監(jiān)控被監(jiān)控進(jìn)程是否發(fā)生阻塞,如果發(fā)生阻塞,實(shí)時(shí) 獲取被監(jiān)控進(jìn)程的阻塞信息;從而克服了現(xiàn)有技術(shù)不能判斷進(jìn)程發(fā)生阻塞以及獲取進(jìn)程阻 塞信息的缺陷;另外,獲取的阻塞信息可以用于分析出被監(jiān)控進(jìn)程發(fā)生阻塞的原因。實(shí)施例3如圖3所示,本發(fā)明實(shí)施例提供了一種獲取阻塞信息的方法,包括步驟301 接收用戶選擇的需要被監(jiān)控的進(jìn)程;
其中,將操作系統(tǒng)中的所有已經(jīng)啟動(dòng)的進(jìn)程都放置在GUI界面中,用戶從GUI界面 選擇需要被監(jiān)控的進(jìn)程。步驟302 獲取被監(jiān)控進(jìn)程的Handle ;其中,可以通過(guò)調(diào)用獲取進(jìn)程句柄的函數(shù)來(lái)獲取被監(jiān)控進(jìn)程的Handle。步驟303 通過(guò)被監(jiān)控進(jìn)程的Handle,在被監(jiān)控進(jìn)程中創(chuàng)建監(jiān)控線程,其中,監(jiān)控 線程用于實(shí)時(shí)監(jiān)控被監(jiān)控進(jìn)程;其中,可以通過(guò)調(diào)用創(chuàng)建遠(yuǎn)程線程函數(shù)在被監(jiān)控進(jìn)程中創(chuàng)建監(jiān)控線程。步驟304 通過(guò)監(jiān)控線程實(shí)時(shí)監(jiān)控被監(jiān)控進(jìn)程是否發(fā)送消息,如果監(jiān)控出被監(jiān)控 進(jìn)程發(fā)送消息,則執(zhí)行步驟305 ;步驟305 在零到預(yù)設(shè)的閾值的這段時(shí)間內(nèi),實(shí)時(shí)監(jiān)控被監(jiān)控進(jìn)程是否接收消息, 如果被監(jiān)控進(jìn)程沒(méi)有接收消息,則被監(jiān)控進(jìn)程發(fā)生阻塞,執(zhí)行步驟306 ;如果監(jiān)控進(jìn)程接收 消息,則執(zhí)行步驟307;具體地,從被監(jiān)控進(jìn)程發(fā)送消息的時(shí)刻起,從零開(kāi)始計(jì)時(shí),實(shí)時(shí)判斷計(jì)時(shí)的時(shí)間是 否超過(guò)預(yù)設(shè)的閾值和實(shí)時(shí)監(jiān)控被監(jiān)控進(jìn)程是否接收消息;如果計(jì)時(shí)的時(shí)間超過(guò)預(yù)設(shè)的閾 值,并在零到預(yù)設(shè)的閾值的這段時(shí)間之內(nèi)沒(méi)有監(jiān)控出被監(jiān)控進(jìn)程接收消息,則被監(jiān)控進(jìn)程 發(fā)生阻塞,執(zhí)行306 ;如果在計(jì)時(shí)的時(shí)間超過(guò)預(yù)設(shè)的閾值之前即在零到預(yù)設(shè)和閾值的這段 時(shí)間之內(nèi),監(jiān)控出被監(jiān)控進(jìn)程接收消息,則執(zhí)行步驟307 ;步驟306 從操作系統(tǒng)中獲取計(jì)時(shí)的時(shí)間超過(guò)預(yù)設(shè)的閾值的時(shí)刻為阻塞開(kāi)始時(shí) 刻,并記錄阻塞開(kāi)始時(shí)刻,立即執(zhí)行步驟308 ;步驟307 將計(jì)時(shí)的時(shí)間清零,并返回304,重新實(shí)時(shí)監(jiān)控被監(jiān)控進(jìn)程是否發(fā)送消 息;步驟308 在被監(jiān)控進(jìn)程阻塞期間,實(shí)時(shí)獲取被監(jiān)控進(jìn)程的阻塞信息;其中,當(dāng)監(jiān)控出被監(jiān)控進(jìn)程發(fā)生阻塞之時(shí),獲取被監(jiān)控進(jìn)程的阻塞信息,然后定時(shí) 的每隔一段時(shí)間獲取一次阻塞信息。而每次獲取阻塞信息的過(guò)程與實(shí)施例2的步驟206中 的內(nèi)容相同,在此不再贅述。其中,程序員可以根據(jù)阻塞信息中的函數(shù)返回地址分析出被監(jiān)控進(jìn)程發(fā)生阻塞的 原因。由于在被監(jiān)控進(jìn)程阻塞期間,定時(shí)地獲取不同時(shí)刻的阻塞信息,從而程序員可以根據(jù) 阻塞信息中的不同時(shí)刻的函數(shù)返回地址分析出被監(jiān)控進(jìn)程在不同時(shí)刻發(fā)生阻塞的原因。步驟309 在監(jiān)控出被監(jiān)控進(jìn)程發(fā)生阻塞時(shí),通過(guò)監(jiān)控線程實(shí)時(shí)監(jiān)控被監(jiān)控進(jìn)程 是否接收信息,如果監(jiān)控出被監(jiān)控進(jìn)程接收消息,則被監(jiān)控進(jìn)程發(fā)生的阻塞結(jié)束,立即停止 獲取被監(jiān)控進(jìn)程的阻塞信息并消除記錄的阻塞開(kāi)始時(shí)刻,然后返回步驟304。其中,在監(jiān)控出被監(jiān)控進(jìn)程發(fā)生阻塞時(shí),步驟308和步驟309同步發(fā)生,并在整個(gè) 被監(jiān)控進(jìn)程阻塞期間,步驟308和步驟309可以相互獨(dú)立地發(fā)生或同步地發(fā)生。在本發(fā)明實(shí)施例中,通過(guò)實(shí)時(shí)監(jiān)控被監(jiān)控進(jìn)程是否發(fā)生阻塞,如果發(fā)生阻塞,實(shí)時(shí) 獲取被監(jiān)控進(jìn)程的阻塞信息;從而克服了現(xiàn)有技術(shù)不能判斷進(jìn)程發(fā)生阻塞以及獲取進(jìn)程阻 塞信息的缺陷;另外,獲取的阻塞信息可以用于分析出被監(jiān)控進(jìn)程發(fā)生阻塞的原因。實(shí)施例4如圖4所示,一種獲取進(jìn)程阻塞信息的裝置,包括接收模塊401,用于接收被監(jiān)控進(jìn)程;
第一實(shí)時(shí)監(jiān)控模塊402,用于通過(guò)監(jiān)控被監(jiān)控進(jìn)程是否發(fā)送消息或接收消息來(lái)實(shí) 時(shí)監(jiān)控被監(jiān)控進(jìn)程是否發(fā)生阻塞;實(shí)時(shí)獲取模塊403,用于如果發(fā)生阻塞,則實(shí)時(shí)獲取被監(jiān)控進(jìn)程的阻塞信息。其中,第一實(shí)時(shí)監(jiān)控模塊402具體包括實(shí)時(shí)監(jiān)控單元,用于實(shí)時(shí)監(jiān)控被監(jiān)控進(jìn)程是否發(fā)送消息;計(jì)時(shí)單元,用于如果監(jiān)控出被監(jiān)控進(jìn)程發(fā)送消息,則在發(fā)送消息的時(shí)刻起,從零開(kāi) 始計(jì)時(shí),并實(shí)時(shí)監(jiān)控被監(jiān)控進(jìn)程是否接收消息;記錄單元,用于如果計(jì)時(shí)的時(shí)間在零到預(yù)設(shè)的閾值之內(nèi),未監(jiān)控出被監(jiān)控進(jìn)程接 收消息,則被監(jiān)控進(jìn)程發(fā)生阻塞,記錄計(jì)時(shí)的時(shí)間超過(guò)預(yù)設(shè)的閾值的時(shí)刻為阻塞開(kāi)始時(shí) 刻;清零單元,用于如果計(jì)時(shí)的時(shí)間在零到預(yù)設(shè)的閾值之內(nèi),監(jiān)控出被監(jiān)控進(jìn)程接收 消息,則將計(jì)時(shí)的時(shí)間清零;實(shí)時(shí)獲取模塊403具體包括第一獲取單元,用于根據(jù)當(dāng)前時(shí)刻和阻塞開(kāi)始時(shí)刻,獲取當(dāng)前阻塞時(shí)間;第二獲取單元,用于獲取被監(jiān)控進(jìn)程調(diào)用的堆棧以及被監(jiān)控進(jìn)程在該堆棧中訪問(wèn) 的區(qū)域范圍;第三獲取單元,用于獲取該堆棧中的該區(qū)域范圍內(nèi)存儲(chǔ)的函數(shù)返回地址;其中,將獲取的當(dāng)前阻塞時(shí)間和獲取的函數(shù)返回地址作為被監(jiān)控進(jìn)程的阻塞信 息;所述實(shí)時(shí)獲取模塊還包括獲取單元,用于根據(jù)被監(jiān)控進(jìn)程未占用CPU的時(shí)間獲取被監(jiān)控進(jìn)程的CPU占用率, 將被監(jiān)控進(jìn)程的CPU占用率作為被監(jiān)控進(jìn)程的阻塞信息。該裝置還包括創(chuàng)建模塊,用于將監(jiān)控程序注入被監(jiān)控進(jìn)程中,在被監(jiān)控進(jìn)程中創(chuàng)建監(jiān)控線程,該 監(jiān)控線程用于實(shí)時(shí)監(jiān)控被監(jiān)控進(jìn)程;該裝置還包括第二實(shí)時(shí)監(jiān)控模塊,用于如果被監(jiān)控進(jìn)程發(fā)生阻塞,實(shí)時(shí)監(jiān)控被監(jiān)控進(jìn)程是否接 收消息,如果監(jiān)控出被監(jiān)控進(jìn)程接收消息時(shí),停止獲取被監(jiān)控進(jìn)程的阻塞信息,清除阻塞開(kāi) 始時(shí)刻。在本發(fā)明實(shí)施例中,通過(guò)監(jiān)控被監(jiān)控進(jìn)程收發(fā)消息的過(guò)程,判斷被監(jiān)控進(jìn)程是否 發(fā)生阻塞,如果發(fā)生阻塞,實(shí)時(shí)獲取被監(jiān)控進(jìn)程的阻塞信息;從而克服了現(xiàn)有技術(shù)不能判斷 進(jìn)程發(fā)生阻塞以及獲取進(jìn)程阻塞信息的缺陷;另外,獲取的阻塞信息可以用于分析出被監(jiān) 控進(jìn)程發(fā)生阻塞的原因。以上實(shí)施例提供的技術(shù)方案中的全部或部分內(nèi)容可以通過(guò)軟件編程實(shí)現(xiàn),其軟件 程序存儲(chǔ)在可讀取的存儲(chǔ)介質(zhì)中,存儲(chǔ)介質(zhì)例如計(jì)算機(jī)中的硬盤、光盤或軟盤。以上所述僅為本發(fā)明的較佳實(shí)施例,并不用以限制本發(fā)明,凡在本發(fā)明的精神和 原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
1.一種獲取進(jìn)程阻塞信息的方法,其特征在于,所述方法包括接收被監(jiān)控進(jìn)程;通過(guò)實(shí)時(shí)監(jiān)控所述被監(jiān)控進(jìn)程收發(fā)消息的過(guò)程,判斷所述被監(jiān)控進(jìn)程是否發(fā)生阻塞;如果發(fā)生阻塞,則實(shí)時(shí)獲取所述被監(jiān)控進(jìn)程的阻塞信息。
2.如權(quán)利要求1所述的方法,其特征在于,所述通過(guò)實(shí)時(shí)監(jiān)控所述被監(jiān)控進(jìn)程收發(fā)消 息的過(guò)程,判斷所述被監(jiān)控進(jìn)程是否發(fā)生阻塞,具體包括實(shí)時(shí)監(jiān)控所述被監(jiān)控進(jìn)程是否發(fā)送消息;如果監(jiān)控出所述被監(jiān)控進(jìn)程發(fā)送消息,則在發(fā)送消息的時(shí)刻起,從零開(kāi)始計(jì)時(shí),并實(shí)時(shí) 監(jiān)控所述被監(jiān)控進(jìn)程是否接收消息;如果所述計(jì)時(shí)的時(shí)間在零到預(yù)設(shè)的閾值之內(nèi),未監(jiān)控出所述被監(jiān)控進(jìn)程接收消息,則 所述被監(jiān)控進(jìn)程發(fā)生阻塞,記錄所述計(jì)時(shí)的時(shí)間超過(guò)所述預(yù)設(shè)的閾值的時(shí)刻為阻塞開(kāi)始時(shí) 刻;如果所述計(jì)時(shí)的時(shí)間在零到所述預(yù)設(shè)的閾值之內(nèi),監(jiān)控出所述被監(jiān)控進(jìn)程接收消息, 則將所述計(jì)時(shí)的時(shí)間清零。
3.如權(quán)利要求2所述的方法,其特征在于,所述實(shí)時(shí)獲取所述被監(jiān)控進(jìn)程的阻塞信息, 具體包括根據(jù)當(dāng)前時(shí)刻和所述阻塞開(kāi)始時(shí)刻,獲取當(dāng)前阻塞時(shí)間;獲取所述被監(jiān)控進(jìn)程調(diào)用的堆棧以及所述被監(jiān)控進(jìn)程在所述堆棧中訪問(wèn)的區(qū)域范圍;獲取所述堆棧中的所述區(qū)域范圍內(nèi)存儲(chǔ)的函數(shù)返回地址;其中,將所述當(dāng)前阻塞時(shí)間和所述函數(shù)返回地址作為所述被監(jiān)控進(jìn)程的阻塞信息。
4.如權(quán)利要求1所述的方法,其特征在于,所述實(shí)時(shí)獲取所述被監(jiān)控進(jìn)程的阻塞信息, 還包括根據(jù)所述被監(jiān)控進(jìn)程未占用CPU的時(shí)間獲取所述被監(jiān)控進(jìn)程的CPU占用率,將所述被 監(jiān)控進(jìn)程的CPU占用率作為所述被監(jiān)控進(jìn)程的阻塞信息。
5.如權(quán)利要求1所述的方法,其特征在于,所述通過(guò)實(shí)時(shí)監(jiān)控所述被監(jiān)控進(jìn)程收發(fā)消 息的過(guò)程,判斷所述被監(jiān)控進(jìn)程是否發(fā)生阻塞之前,還包括將監(jiān)控程序注入所述被監(jiān)控進(jìn)程中,在所述被監(jiān)控進(jìn)程中創(chuàng)建監(jiān)控線程,所述監(jiān)控線 程用于實(shí)時(shí)監(jiān)控所述被監(jiān)控進(jìn)程。
6.如權(quán)利要求1所述的方法,其特征在于,如果所述被監(jiān)控進(jìn)程發(fā)生阻塞,所述方法還 包括實(shí)時(shí)監(jiān)控所述被監(jiān)控進(jìn)程是否接收消息,如果監(jiān)控出所述被監(jiān)控進(jìn)程接收消息時(shí),停 止獲取所述被監(jiān)控進(jìn)程的阻塞信息,清除所述阻塞開(kāi)始時(shí)刻。
7.一種獲取進(jìn)程阻塞信息的裝置,其特征在于,所述裝置包括接收模塊,用于接收被監(jiān)控進(jìn)程;第一實(shí)時(shí)監(jiān)控模塊,用于通過(guò)實(shí)時(shí)監(jiān)控所述被監(jiān)控進(jìn)程收發(fā)消息的過(guò)程,判斷所述被 監(jiān)控進(jìn)程是否發(fā)生阻塞;實(shí)時(shí)獲取模塊,用于如果發(fā)生阻塞,則實(shí)時(shí)獲取所述被監(jiān)控進(jìn)程的阻塞信息。
8.如權(quán)利要求7所述的裝置,其特征在于,所述第一實(shí)時(shí)監(jiān)控模塊具體包括實(shí)時(shí)監(jiān)控單元,用于實(shí)時(shí)監(jiān)控所述被監(jiān)控進(jìn)程是否發(fā)送消息;計(jì)時(shí)單元,用于如果監(jiān)控出所述被監(jiān)控進(jìn)程發(fā)送消息,則在發(fā)送消息的時(shí)刻起,從零開(kāi) 始計(jì)時(shí),并實(shí)時(shí)監(jiān)控所述被監(jiān)控進(jìn)程是否接收消息;記錄單元,用于如果所述計(jì)時(shí)的時(shí)間在零到預(yù)設(shè)的閾值之內(nèi),未監(jiān)控出所述被監(jiān)控進(jìn) 程接收消息,則所述被監(jiān)控進(jìn)程發(fā)生阻塞,記錄所述計(jì)時(shí)的時(shí)間超過(guò)所述預(yù)設(shè)的閾值的時(shí) 刻為阻塞開(kāi)始時(shí)刻;清零單元,用于如果所述計(jì)時(shí)的時(shí)間在零到所述預(yù)設(shè)的閾值之內(nèi),監(jiān)控出所述被監(jiān)控 進(jìn)程接收消息,則將所述計(jì)時(shí)的時(shí)間清零。
9.如權(quán)利要求8所述的裝置,其特征在于,所述實(shí)時(shí)獲取模塊具體包括第一獲取單元,用于根據(jù)當(dāng)前時(shí)刻和所述阻塞開(kāi)始時(shí)刻,獲取當(dāng)前阻塞時(shí)間;第二獲取單元,用于獲取所述被監(jiān)控進(jìn)程調(diào)用的堆棧以及所述被監(jiān)控進(jìn)程在所述堆棧 中訪問(wèn)的區(qū)域范圍;第三獲取單元,用于獲取所述堆棧中的所述區(qū)域范圍內(nèi)存儲(chǔ)的函數(shù)返回地址;其中,將所述當(dāng)前阻塞時(shí)間和所述函數(shù)返回地址作為所述被監(jiān)控進(jìn)程的阻塞信息。
10.如權(quán)利要求7所述的裝置,其特征在于,所述實(shí)時(shí)獲取模塊還包括獲取單元,用于根據(jù)所述被監(jiān)控進(jìn)程未占用CPU的時(shí)間獲取所述被監(jiān)控進(jìn)程的CPU占 用率,將所述被監(jiān)控進(jìn)程的CPU占用率作為所述被監(jiān)控進(jìn)程的阻塞信息。
11.如權(quán)利要求7所述的裝置,其特征在于,所述裝置還包括創(chuàng)建模塊,用于將監(jiān)控程序注入所述被監(jiān)控進(jìn)程中,在所述被監(jiān)控進(jìn)程中創(chuàng)建監(jiān)控線 程,所述監(jiān)控線程用于實(shí)時(shí)監(jiān)控所述被監(jiān)控進(jìn)程。
12.如權(quán)利要求7所述的裝置,其特征在于,所述裝置還包括第二實(shí)時(shí)監(jiān)控模塊,用于如果所述被監(jiān)控進(jìn)程發(fā)生阻塞,實(shí)時(shí)監(jiān)控所述被監(jiān)控進(jìn)程是 否接收消息,如果監(jiān)控出所述被監(jiān)控進(jìn)程接收消息時(shí),停止獲取所述被監(jiān)控進(jìn)程的阻塞信 息,清除所述阻塞開(kāi)始時(shí)刻。
全文摘要
本發(fā)明公開(kāi)了一種獲取進(jìn)程阻塞信息的方法及裝置,屬于計(jì)算機(jī)領(lǐng)域。所述方法包括接收被監(jiān)控進(jìn)程;通過(guò)實(shí)時(shí)監(jiān)控所述被監(jiān)控進(jìn)程收發(fā)消息的過(guò)程,判斷所述被監(jiān)控進(jìn)程是否發(fā)生阻塞;如果發(fā)生阻塞,則實(shí)時(shí)獲取所述被監(jiān)控進(jìn)程的阻塞信息。所述裝置包括接收模塊、第一實(shí)時(shí)監(jiān)控模塊和實(shí)時(shí)獲取模塊。本發(fā)明能夠判斷出進(jìn)程是否發(fā)生阻塞以及獲取進(jìn)程的阻塞信息。
文檔編號(hào)G06F11/30GK102117240SQ200910265799
公開(kāi)日2011年7月6日 申請(qǐng)日期2009年12月31日 優(yōu)先權(quán)日2009年12月31日
發(fā)明者鄧立波 申請(qǐng)人:騰訊科技(深圳)有限公司