專(zhuān)利名稱(chēng):一種調(diào)試控制實(shí)現(xiàn)方法及系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)領(lǐng)域的調(diào)試器技術(shù),尤其涉及一種可用于多線(xiàn)程或 多任務(wù)的調(diào)試控制實(shí)現(xiàn)方法及系統(tǒng)。
背景技術(shù):
隨著信息技術(shù)的不斷發(fā)展,軟件的規(guī)模不斷擴(kuò)大并且復(fù)雜度也不斷提
高,對(duì)調(diào)試器在功能上有更多的需求;同時(shí)在調(diào)試效率和調(diào)試穩(wěn)定性也有 更高的要求。
目前在通用的桌面操作系統(tǒng)上己經(jīng)有很多比較成熟的集成開(kāi)發(fā)調(diào)試 環(huán)境。但目前在嵌入式系統(tǒng)上卻沒(méi)有成熟的調(diào)試器實(shí)現(xiàn)方案。主要原因在 于首先很多嵌入式系統(tǒng)的操作系統(tǒng)不支持調(diào)試,無(wú)法調(diào)試用戶(hù)程序;其 次嵌入式系統(tǒng)對(duì)調(diào)試器要求也比較高,因?yàn)樗c通用的桌面操作系統(tǒng)相比 對(duì)軟件實(shí)時(shí)性能要求高;再者,嵌入式系統(tǒng)硬件環(huán)境方面又存在很多限制, 如存儲(chǔ)空間大小、CPU性能等等。因此嵌入式系統(tǒng)的調(diào)試器要求簡(jiǎn)潔高效 且易于移植,但是目前的現(xiàn)有技術(shù)很難滿(mǎn)足這一要求。
目前,現(xiàn)有調(diào)試器在調(diào)試多線(xiàn)程或多任務(wù)時(shí)還存在效率問(wèn)題,尤其是 在調(diào)試代碼段共享的多線(xiàn)程或多任務(wù)時(shí),效率問(wèn)題更突出。在嵌入式系統(tǒng) 中的用戶(hù)程序有兩種類(lèi)型①用戶(hù)程序運(yùn)行在用戶(hù)態(tài),在這種情況下同一 進(jìn)程中多個(gè)線(xiàn)程共享相同進(jìn)程空間;②用戶(hù)程序和操作系統(tǒng)都在同一地址 空間,這種情況下用戶(hù)的多任務(wù)程序也是共享同一地址空間。前者稱(chēng)為多 線(xiàn)程,后者稱(chēng)為多任務(wù)。對(duì)于這種共享地址空間的多線(xiàn)程/多任務(wù)調(diào)試,現(xiàn) 有的調(diào)試控制方案會(huì)產(chǎn)生很多無(wú)效的調(diào)試事件,調(diào)試器對(duì)于這些無(wú)效的調(diào) 試事件的分析處理會(huì)嚴(yán)重影響被調(diào)試程序的執(zhí)行;另外目前調(diào)試控制方案 在處理有效的調(diào)試事件時(shí)也存在效率低下問(wèn)題。
以目前應(yīng)用最為廣泛的調(diào)試器(GNUgdb)為例,現(xiàn)有技術(shù)的調(diào)試過(guò) 程如下
調(diào)試需求被調(diào)試程序?yàn)橐粋€(gè)多線(xiàn)程程序,為簡(jiǎn)單起見(jiàn),假定其包括 線(xiàn)程A1、 Bl、 Cl、 Dl、 El。該多線(xiàn)程程序在運(yùn)行時(shí)都會(huì)調(diào)用一個(gè)公共函
4數(shù)fimctkml。目前用戶(hù)只希望了解到線(xiàn)程Cl在遇到這個(gè)公共函數(shù)處的情 況;在分析完成線(xiàn)程Cl停止的情況后能夠繼續(xù)使其運(yùn)行,并觀察其再次 遇到此公共函數(shù)時(shí)的情況。
針對(duì)這個(gè)調(diào)試需求,調(diào)試器需要在該公共函數(shù)處插入一個(gè)斷點(diǎn),然后 分析發(fā)生的斷點(diǎn)事件。僅將線(xiàn)程Cl遇到此斷點(diǎn)的事件作為有效事件,其 他事件都作為無(wú)效事件。這個(gè)過(guò)程在目前調(diào)試器中的處理過(guò)程如下
步驟l、插入斷點(diǎn);
步驟1.1、調(diào)試器通過(guò)操作系統(tǒng)提供的接口或信號(hào)機(jī)制將被調(diào)試的每 個(gè)線(xiàn)程都停止;
步驟1.2、分析符號(hào)表査找到待插入斷點(diǎn)的地址,并通過(guò)操作系統(tǒng)接 口將此地址的原有的正常指令保存后替換為斷點(diǎn)指令(在某些架構(gòu)上為未 定義指令)。將斷點(diǎn)地址以及此位置的正常指令以及斷點(diǎn)類(lèi)型等信息保存到 斷點(diǎn)節(jié)點(diǎn)中,以便后續(xù)分析查找;
步驟1.3、調(diào)試器再次通過(guò)操作系統(tǒng)的接口恢復(fù)被停止的線(xiàn)程;
步驟2、調(diào)試事件分析處理過(guò)程由于在進(jìn)程中五個(gè)線(xiàn)程的代碼空間 共享,因此對(duì)于此公共函數(shù)代碼段每個(gè)線(xiàn)程都會(huì)執(zhí)行到斷點(diǎn)指令處;對(duì)于 線(xiàn)程A1, Bl, Dl, El重復(fù)多次遇到這個(gè)斷點(diǎn)的調(diào)試事件就是無(wú)效的調(diào)試 事件,僅有線(xiàn)程C1遇到此斷點(diǎn)的事件才是有效的調(diào)試事件;
步驟2.1、無(wú)效斷點(diǎn)事件處理對(duì)于線(xiàn)程B1遇到此斷點(diǎn)的情況,調(diào)試 器的處理過(guò)程;
步驟2丄1、調(diào)試器獲得斷點(diǎn)事件后,通過(guò)操作系統(tǒng)接口將當(dāng)前進(jìn)程中 其他線(xiàn)程停止;
步驟2丄2、調(diào)試器匹配斷點(diǎn)地址和其維護(hù)的斷點(diǎn)節(jié)點(diǎn)中的地址;在分 析此斷點(diǎn)節(jié)點(diǎn)后,確認(rèn)此斷點(diǎn)對(duì)線(xiàn)程B1無(wú)效,需要線(xiàn)程B1繼續(xù)運(yùn)行;
步驟2丄3、調(diào)試器調(diào)用操作系統(tǒng)接口將已插入斷點(diǎn)指令的地址再恢復(fù) 為原始正常指令;
步驟2丄4、調(diào)試器調(diào)用操作系統(tǒng)接口或直接設(shè)置相關(guān)寄存器,控制線(xiàn) 程B1執(zhí)行匯編指令級(jí)單步;
步驟2丄5、當(dāng)線(xiàn)程B1單步結(jié)束后又會(huì)通過(guò)異?;蛐盘?hào)通知調(diào)試器, 此時(shí)調(diào)試器將前面恢復(fù)為正常指令的地址(fimctionl)再插入斷點(diǎn)指令,以便
繼續(xù)調(diào)試斷點(diǎn)事件;
步驟2丄6、調(diào)試器將所有線(xiàn)程都恢復(fù)運(yùn)行;
步驟2.2、有效斷點(diǎn)事件處理如果線(xiàn)程C1遇到此斷點(diǎn)的情況下,在
5步驟2丄1和步驟2丄2之后斷點(diǎn)有效,將當(dāng)前進(jìn)程中所有線(xiàn)程都停止;然 后再通過(guò)界面反饋線(xiàn)程Cl遇到斷點(diǎn)的事件;
步驟3、繼續(xù)調(diào)試如果用戶(hù)需要繼續(xù)運(yùn)行并調(diào)試,則調(diào)試器需要執(zhí) 行步驟2丄3至U2丄6的過(guò)程;
從以上步驟可以看出該調(diào)試過(guò)程效率低下并且對(duì)其他線(xiàn)程的干擾也 很大,主要原因如下
1. 調(diào)試器處理的所有調(diào)試事件中實(shí)際有效的調(diào)試事件(線(xiàn)程Cl遇到 斷點(diǎn))所占的比例比較低。如在上面例子中五個(gè)線(xiàn)程在情況均等的情況下 有效斷點(diǎn)事件僅占斷點(diǎn)事件的五分之一,如果其他線(xiàn)程(Al, Bl, Dl, El)調(diào)用公共函數(shù)代碼(fimctkml)的機(jī)會(huì)更多,發(fā)生的頻率更快,則無(wú) 效斷點(diǎn)發(fā)生更多,調(diào)試效率將更低;
2. 調(diào)試過(guò)程中無(wú)效的調(diào)試控制過(guò)程也比較多。如在上面的調(diào)試過(guò)程 中,在當(dāng)前線(xiàn)程Cl遇到斷點(diǎn)時(shí)候需要控制其他線(xiàn)程停止和運(yùn)行。這種控 制主要目的是避免遺漏斷點(diǎn)事件(如果當(dāng)前斷點(diǎn)對(duì)其它線(xiàn)程也生效,假如 在處理斷點(diǎn)事件時(shí)沒(méi)有將其他線(xiàn)程停止,則斷點(diǎn)生效的其他線(xiàn)程有可能已 經(jīng)運(yùn)行過(guò)了這個(gè)斷點(diǎn)位置,這樣就造成了漏斷點(diǎn)的情況),但這個(gè)處理卻給 其他線(xiàn)程代來(lái)了額外的干擾,而且也影響調(diào)試的效率。
綜上所述,現(xiàn)有調(diào)試器存在效率低下的問(wèn)題。而嵌入式系統(tǒng)對(duì)實(shí)時(shí)性 要求比較高,效率低下問(wèn)題可能直接導(dǎo)致邏輯錯(cuò)誤,因此在嵌入式系統(tǒng)上 需要一個(gè)更加高效而穩(wěn)定的調(diào)試器方案。
發(fā)明內(nèi)容
本發(fā)明要解決的技術(shù)問(wèn)題是提供一種高效穩(wěn)定的調(diào)試控制實(shí)現(xiàn)方法及 系統(tǒng)。
本發(fā)明的技術(shù)問(wèn)題是通過(guò)以下技術(shù)方案加以解決的
一種調(diào)試控制實(shí)現(xiàn)方法,包括斷點(diǎn)的插入和刪除過(guò)程,所述斷點(diǎn)插入 過(guò)程是通過(guò)內(nèi)核調(diào)度時(shí)插入僅對(duì)當(dāng)前切入的線(xiàn)程或任務(wù)有效的斷點(diǎn)實(shí)現(xiàn) 的;所述斷點(diǎn)刪除過(guò)程是通過(guò)內(nèi)核調(diào)度需要切出所述線(xiàn)程或任務(wù)時(shí),刪除
所述斷點(diǎn)實(shí)現(xiàn)的。
上述方法,還包括在斷點(diǎn)插入后,對(duì)所述當(dāng)前切入的線(xiàn)程或任務(wù)進(jìn)行 調(diào)試時(shí),在調(diào)試異常上下文中利用調(diào)試異常處理所述線(xiàn)程或任務(wù)中的調(diào)試 事件的過(guò)程。上述調(diào)試事件的處理過(guò)程包括利用斷點(diǎn)異常處理所述當(dāng)前調(diào)度切入的 線(xiàn)程或任務(wù)中的斷點(diǎn)事件的過(guò)程。
上述調(diào)試事件的處理過(guò)程包括利用單步異常處理所述當(dāng)前調(diào)度切入的 線(xiàn)程或任務(wù)中的單步事件的過(guò)程。
上述斷點(diǎn)的插入過(guò)程具體包括以下步驟
步驟A1、分析調(diào)度切入的線(xiàn)程或任務(wù),獲取對(duì)當(dāng)前切入的線(xiàn)程或任務(wù) 有效的斷點(diǎn);
步驟B1、將步驟A1所述的斷點(diǎn)插入到代碼段; 步驟C1、保存斷點(diǎn)插入前的原始指令。 上述斷點(diǎn)刪除過(guò)程具體包括以下步驟
步驟A2、分析調(diào)度切出的線(xiàn)程或任務(wù),獲取當(dāng)前要切出的線(xiàn)程或任務(wù) 有效的斷點(diǎn);
步驟B2、從代碼段中刪除步驟A2所述的斷點(diǎn); 步驟C2、恢復(fù)斷點(diǎn)插入前的原始指令。
一種調(diào)試控制系統(tǒng),包括調(diào)試任務(wù)處理模塊和內(nèi)核處理模塊,所述調(diào) 試任務(wù)處理模塊包括斷點(diǎn)管理單元、上報(bào)事件管理單元,所述內(nèi)核處理模 塊包括調(diào)度處理單元,用于在內(nèi)核調(diào)度時(shí),插入僅對(duì)當(dāng)前切入的線(xiàn)程或任 務(wù)有效的斷點(diǎn);還用于在內(nèi)核調(diào)度需要切出所述線(xiàn)程或任務(wù)時(shí),刪除所述 斷點(diǎn)。
上述調(diào)度處理單元還用于在內(nèi)核調(diào)度時(shí)從所述斷點(diǎn)管理單元獲得要插 入或刪除的斷點(diǎn)信息。
上述內(nèi)核處理模塊還包括調(diào)試異常處理單元,用于對(duì)所述當(dāng)前切入的 線(xiàn)程或任務(wù)進(jìn)行調(diào)試時(shí),在調(diào)試異常上下文中利用調(diào)試異常處理所述線(xiàn)程 或任務(wù)中的調(diào)試事件。
上述調(diào)試異常處理單元包括斷點(diǎn)異常處理子單元,用于斷點(diǎn)插入后, 利用斷點(diǎn)異常來(lái)處理所述當(dāng)前調(diào)度切入的線(xiàn)程或任務(wù)中的斷點(diǎn)事件。
上述調(diào)試異常處理單元還包括單步異常處理子單元,用于斷點(diǎn)插入后, 利用單步異常來(lái)處理所述當(dāng)前調(diào)度切入的線(xiàn)程或任務(wù)中的單步事件。 本發(fā)明與現(xiàn)有技術(shù)相比較的有益效果是
(1)本發(fā)明在內(nèi)核調(diào)度時(shí)對(duì)當(dāng)前切入的線(xiàn)程或任務(wù)插入對(duì)其有效的斷點(diǎn),對(duì)當(dāng)前線(xiàn)程或任務(wù)無(wú)效的斷點(diǎn)則不會(huì)插入到代碼段,這樣在調(diào)試中產(chǎn) 生的調(diào)試事件均為有效事件,避免了無(wú)效事件對(duì)調(diào)試的影響,提高了調(diào)試
效率;本發(fā)明在調(diào)度切入線(xiàn)程或任務(wù)時(shí)插入斷點(diǎn),這樣在處理當(dāng)前調(diào)試事 件時(shí)也不需要控制其它線(xiàn)程或任務(wù)停止以及恢復(fù),進(jìn)一步提高了調(diào)試效率, 也避免了漏斷點(diǎn)事件的發(fā)生;
(2) 本發(fā)明在調(diào)試異常上下文中利用斷點(diǎn)異?;騿尾疆惓L幚懋?dāng)前線(xiàn) 程或任務(wù)的斷點(diǎn)事件和單步事件等調(diào)試事件,無(wú)需通過(guò)其他機(jī)制(如信號(hào)) 將調(diào)試事件傳遞給調(diào)試器,處理效率高,還避免了在外部調(diào)試統(tǒng)一處理過(guò) 程中干擾其他的線(xiàn)程或任務(wù);
(3) 本發(fā)明對(duì)地址空間共享的多線(xiàn)程或多任務(wù),其調(diào)試效率優(yōu)勢(shì)明顯, 并能滿(mǎn)足實(shí)時(shí)性要求較高的嵌入式系統(tǒng)的調(diào)試需要。
圖1是本發(fā)明系統(tǒng)具體實(shí)施方式
結(jié)構(gòu)示意圖2是本發(fā)明具體實(shí)施方式
斷點(diǎn)數(shù)據(jù)結(jié)構(gòu)示意圖3是本發(fā)明具體實(shí)施方式
斷點(diǎn)數(shù)據(jù)結(jié)構(gòu)索引表示意圖4是本發(fā)明方法具體實(shí)施方式
斷點(diǎn)插入和刪除流程圖5是本發(fā)明方法具體實(shí)施方式
斷點(diǎn)異常處理流程圖6是本發(fā)明方法具體實(shí)施方式
單步異常處理流程圖。
具體實(shí)施例方式
下面用具體實(shí)施方式
結(jié)合附圖對(duì)本發(fā)明做進(jìn)一步詳細(xì)說(shuō)明。 本發(fā)明調(diào)試控制系統(tǒng)的一種具體實(shí)施方式
,如圖1所示,包括調(diào)試任 務(wù)處理模塊和內(nèi)核處理模塊。內(nèi)核處理模塊為本實(shí)施方式的主體部分,實(shí) 現(xiàn)被調(diào)試程序的控制以及斷點(diǎn)和單步等調(diào)試邏輯的處理;調(diào)試任務(wù)處理模 塊主要完成用戶(hù)接口部分,并配合內(nèi)核處理模塊實(shí)現(xiàn)整個(gè)調(diào)試控制系統(tǒng)。
本實(shí)施方式中,調(diào)試任務(wù)處理模塊在部署上可以采用兩種方式 一種 是將該模塊完全放在目標(biāo)機(jī)上;另一種是采用交叉調(diào)試的方式,該模塊分 為兩個(gè)部分,其中一部分設(shè)置在目標(biāo)機(jī)上,另一部分設(shè)置在調(diào)試主機(jī)上。 本實(shí)施方式中,該模塊可以以一個(gè)進(jìn)程或任務(wù)的形式存在。調(diào)試任務(wù)處理 模塊包括用戶(hù)命令處理單元、斷點(diǎn)管理單元、被調(diào)試程序管理單元和上報(bào) 事件處理單元。用戶(hù)命令處理單元用于分析用戶(hù)命令,并通過(guò)內(nèi)核處理模塊和斷點(diǎn)管理單元、被調(diào)試程序管理單元等共同完成用戶(hù)命令。斷點(diǎn)管理
單元用于維護(hù)斷點(diǎn)數(shù)據(jù)結(jié)構(gòu),如圖2、圖3所示。本實(shí)施方式提供兩種維
護(hù)方式①斷點(diǎn)地址的維護(hù)方式;②任務(wù)關(guān)聯(lián)的維護(hù)方式。被調(diào)試程序管
理單元?jiǎng)t用于維護(hù)被調(diào)試的線(xiàn)程或任務(wù),管理各個(gè)線(xiàn)程或任務(wù)狀態(tài)。上報(bào)事件管理單元用于維護(hù)被調(diào)試的程序發(fā)生的任何事件,根據(jù)調(diào)試規(guī)則反饋給用戶(hù)。
內(nèi)核處理模塊包括調(diào)度處理單元、調(diào)試異常處理單元。調(diào)度處理單元用于在內(nèi)核調(diào)度過(guò)程中分析調(diào)度切出的任務(wù),通過(guò)査詢(xún)斷點(diǎn)管理單元獲取該切出此線(xiàn)程或任務(wù)相關(guān)聯(lián)的斷點(diǎn),將這些斷點(diǎn)從代碼段中刪除并恢復(fù)為
原始指令;再分析調(diào)度切入的線(xiàn)程或任務(wù),通過(guò)斷點(diǎn)管理單元獲取此線(xiàn)程或任務(wù)相關(guān)聯(lián)的斷點(diǎn),將這些斷點(diǎn)插入到代碼段并保存原始指令。本實(shí)施方式中,內(nèi)核調(diào)度處理單元通過(guò)回調(diào)鉤子注冊(cè)在操作系統(tǒng)調(diào)度處。調(diào)試異常處理單元,用于處理當(dāng)前調(diào)度切入的線(xiàn)程或進(jìn)程中的調(diào)試事件,其進(jìn)一步包括斷點(diǎn)異常處理子單元和單步異常處理子單元。斷點(diǎn)異常處理子單元用于在斷點(diǎn)異常中處理斷點(diǎn)事件。斷點(diǎn)異常(Exceptions)為CPU的一種調(diào)試異常資源,在執(zhí)行到斷點(diǎn)指令(某些架構(gòu)下為未定義指令)時(shí)進(jìn)入此異常。斷點(diǎn)異常處理子單元在斷點(diǎn)異常中處理當(dāng)前線(xiàn)程或任務(wù)遇到的斷點(diǎn)事件,通過(guò)斷點(diǎn)管理單元査找到當(dāng)前斷點(diǎn)并按照此斷點(diǎn)節(jié)點(diǎn)定義的規(guī)則處理。如果需要停止則組織上報(bào)消息通過(guò)上報(bào)事件管理單元上報(bào)給用戶(hù)。如果需要繼續(xù)運(yùn)行首先鎖中斷,然后恢復(fù)斷點(diǎn)并控制當(dāng)前線(xiàn)程或任務(wù)進(jìn)行單步,當(dāng)單步結(jié)束后,在單步異常中重新插入斷點(diǎn)并恢復(fù)中斷,繼續(xù)運(yùn)行當(dāng)前任務(wù)。單步異常處理子單元用于在單步異常中處理單步事件。單步異常也是CPU的一種調(diào)試資源,在單步異常中可以處理各種情況下的單步事件。單步事件包括跨斷點(diǎn)的單步情況和用戶(hù)要求的單步命令。本實(shí)施方式中,用戶(hù)的單步命令處理過(guò)程如下在調(diào)試任務(wù)處理模塊中將用戶(hù)要求的源代碼單步或匯編單步轉(zhuǎn)化為單步的PC地址范圍,并設(shè)置到被調(diào)試程序管理單元中,通過(guò)系統(tǒng)調(diào)用進(jìn)行單步控制,在單步異常中判斷單步范圍是否結(jié)束,如未結(jié)束則繼續(xù)單步,直到單步遇到斷點(diǎn)或超出單步范圍后停止,通過(guò)上報(bào)事件管理單元將單步命令停止后的情況反饋給用戶(hù)。本實(shí)施方式中,斷點(diǎn)異常處理子單元和單步異常處理子單元可以通過(guò)回調(diào)鉤子注冊(cè)在
操作系統(tǒng)中,也可以直接掛接到CPU異常向量表中。
本實(shí)施方式中,調(diào)試任務(wù)處理模塊和內(nèi)核處理模塊協(xié)同完成了一種高效的調(diào)試控制實(shí)現(xiàn)方案。該方案可以
(1) 在調(diào)試過(guò)程中控制調(diào)試事件的發(fā)生只發(fā)生有效的調(diào)試事件,不發(fā)生無(wú)效的調(diào)試事件;
(2) 調(diào)試器處理調(diào)試事件時(shí)僅控制當(dāng)前遇到調(diào)試事件的線(xiàn)程或任務(wù),而不干擾其他線(xiàn)程或任務(wù),不做額外的調(diào)試控制工作;
(3) 調(diào)試器在處理調(diào)試事件過(guò)程中保證了調(diào)試邏輯的嚴(yán)謹(jǐn)性,不發(fā)生漏斷點(diǎn)的情況。
本發(fā)明調(diào)試控制實(shí)現(xiàn)方法,其一種實(shí)施方式,以多線(xiàn)程程序(包括線(xiàn)程A2, B2, C2, D2, E2)為例,在這些線(xiàn)程的公共函數(shù)flmction2中,插入一個(gè)僅對(duì)線(xiàn)程C2生效的局部斷點(diǎn)P。下面對(duì)斷點(diǎn)P的調(diào)試過(guò)程做詳述。
步驟S1、插入斷點(diǎn)P:用戶(hù)通過(guò)調(diào)試任務(wù)處理模塊設(shè)置斷點(diǎn)P。斷點(diǎn)P位置在函數(shù)flmction2中,僅對(duì)線(xiàn)程C2生效。用戶(hù)命令處理單元分解此命令后,將整理后斷點(diǎn)信息通過(guò)斷點(diǎn)管理單元保存,本實(shí)施方式的斷點(diǎn)信息數(shù)據(jù)結(jié)構(gòu)如圖2、圖3所示,為描述簡(jiǎn)單起見(jiàn),圖2中僅列出了三個(gè)線(xiàn)程;
步驟S2、線(xiàn)程C2運(yùn)行到fUnction2處;其分為子步驟S21、 S22;步驟S21、線(xiàn)程C2遇到fUnction2處斷點(diǎn)P。
內(nèi)核調(diào)度時(shí)選擇線(xiàn)程C2作為切入的任務(wù),調(diào)度處理單元進(jìn)行處理,線(xiàn)程C2獲得運(yùn)行后遇到flmcticm2處的斷點(diǎn)P,其處理過(guò)程如圖4所示,包括以下步驟
步驟401、查詢(xún)切出的任務(wù)是否存在有效斷點(diǎn),若存在轉(zhuǎn)步驟402;否則轉(zhuǎn)步驟403;
步驟402、刪除切出任務(wù)有效的斷點(diǎn),即恢復(fù)代碼段中斷點(diǎn)位置為原始指令;
步驟403、查詢(xún)切入任務(wù)(線(xiàn)程C2)是否存在有效斷點(diǎn),對(duì)于線(xiàn)程C2來(lái)說(shuō),其存在有效斷點(diǎn)P,轉(zhuǎn)步驟404;
步驟404、將切入任務(wù)(線(xiàn)程C2)關(guān)聯(lián)的斷點(diǎn)P插入到代碼段中,并
保存原始指令到斷點(diǎn)數(shù)據(jù)結(jié)構(gòu)中;
步驟405、分析切入任務(wù)(線(xiàn)程C2)是否正在跨斷點(diǎn),若存在跨斷點(diǎn)
則轉(zhuǎn)步驟406;否則調(diào)度切換返回;
步驟406、刪除當(dāng)前需要跨過(guò)的斷點(diǎn),再調(diào)度切換返回。
步驟S22、線(xiàn)程C2的斷點(diǎn)事件處理在線(xiàn)程C2遇到斷點(diǎn)P后,進(jìn)入
10斷點(diǎn)異常,其處理流程如圖5所示,包括以下步驟
步驟501、為了避免在處理斷點(diǎn)P過(guò)程中循環(huán)遇到斷點(diǎn),先將當(dāng)前線(xiàn)程關(guān)聯(lián)的斷點(diǎn)都刪除;
步驟502、禁止內(nèi)核的任務(wù)調(diào)度,保證處理當(dāng)前斷點(diǎn)事件過(guò)程不發(fā)生其它的調(diào)試事件;
步驟503、處理當(dāng)前線(xiàn)程發(fā)生的斷點(diǎn)事件,査詢(xún)分析當(dāng)前斷點(diǎn)的屬性是否應(yīng)該將線(xiàn)程C2停止,如果沒(méi)有其他的條件或忽略的斷點(diǎn)屬性,線(xiàn)程C2應(yīng)該停止,轉(zhuǎn)步驟504;否則轉(zhuǎn)步驟508;
步驟504、在斷點(diǎn)異常中組織上報(bào)數(shù)據(jù)并通過(guò)上報(bào)事件管理單元將此事件反饋給用戶(hù);
步驟505、恢復(fù)調(diào)度;
步驟506、線(xiàn)程C2在斷點(diǎn)異常中保持被掛起狀態(tài),直到用戶(hù)要求其繼續(xù)運(yùn)行或終止調(diào)試為止;
步驟507、根據(jù)用戶(hù)的命令是否終止調(diào)試,終止調(diào)試則斷點(diǎn)異常返回;繼續(xù)調(diào)試則轉(zhuǎn)步驟508;
步驟50S、設(shè)置任務(wù)跨斷點(diǎn)標(biāo)志;
步驟509、設(shè)置寄存器進(jìn)入單步異常;
斷點(diǎn)異常處理完畢,斷點(diǎn)異常返回;
步驟S3、線(xiàn)程A2運(yùn)行到fUnction2處內(nèi)核調(diào)度時(shí)選擇線(xiàn)程A2做為切入的任務(wù),其處理流程,如圖4所示,包括上述步驟401、步驟402,在步驟403處,因?yàn)閿帱c(diǎn)P對(duì)線(xiàn)程A2無(wú)效,所以,直接調(diào)度切換返回;
通過(guò)線(xiàn)程A2和線(xiàn)程C2運(yùn)行到ftmction2處的流程可以看出雖然fonction2函數(shù)每個(gè)線(xiàn)程都會(huì)調(diào)用到,但是僅有線(xiàn)程C2才有可能遇到fUnction2函數(shù)中的局部斷點(diǎn)P。這樣就避免了無(wú)效調(diào)試事件的發(fā)生,從而提高了調(diào)試控制的效率;
步驟S4、線(xiàn)程C2繼續(xù)運(yùn)行,其包括步驟S41和步驟S42;
步驟S41、線(xiàn)程C2跨斷點(diǎn)當(dāng)用戶(hù)需要繼續(xù)調(diào)試線(xiàn)程C2時(shí),在用戶(hù)命令處理單元中設(shè)置C2線(xiàn)程的跨斷點(diǎn)標(biāo)志,并通過(guò)系統(tǒng)調(diào)用設(shè)置線(xiàn)程C2的單步寄存器。內(nèi)核調(diào)度選擇線(xiàn)程C2做為切入的任務(wù),調(diào)度處理單元根據(jù)圖4所示的流程進(jìn)行處理。在步驟405中,由于線(xiàn)程C2中設(shè)置了跨斷點(diǎn)標(biāo)志,線(xiàn)程C2停在fiinction2斷點(diǎn)P處,因此刪除此處的斷點(diǎn),轉(zhuǎn)入步驟406。調(diào)度切換返回,線(xiàn)程C2獲得運(yùn)行;
li步驟S42、線(xiàn)程C2繼續(xù)運(yùn)行線(xiàn)程C2的當(dāng)前位置沒(méi)有斷點(diǎn),可以正常運(yùn)行,但是線(xiàn)程C2被設(shè)置了單步寄存器。因此在執(zhí)行一條匯編指令時(shí)進(jìn)入單步異常處理流程,如圖6所示,其包括以下步驟
步驟60K清空任務(wù)單步寄存器標(biāo)志;
步驟602、分析當(dāng)前線(xiàn)程是否在進(jìn)行匯編單步,是則轉(zhuǎn)步驟605;否則轉(zhuǎn)步驟603;
步驟603、判斷任務(wù)是否在范圍內(nèi)單步,如果是則轉(zhuǎn)步驟611;如果不是,則轉(zhuǎn)步驟604;
步驟604、判斷任務(wù)是否在跨斷點(diǎn),如果是轉(zhuǎn)步驟613;否則轉(zhuǎn)步驟
605;
步驟605、禁止任務(wù)調(diào)度;
步驟606、清空任務(wù)跨斷點(diǎn)標(biāo)記;
步驟607、清空范圍內(nèi)單步標(biāo)記和匯編單步標(biāo)記;
步驟608、上報(bào)單步停止事件;
步驟609、恢復(fù)任務(wù)調(diào)度;
步驟610、掛起當(dāng)前任務(wù),直到用戶(hù)發(fā)出繼續(xù)運(yùn)行或停止調(diào)試的命令;完成單步異常處理,返回;
步驟6U、判斷當(dāng)前PC是否仍在單步范圍內(nèi),是則轉(zhuǎn)步驟612;否則轉(zhuǎn)步驟605;
步驟612、設(shè)置繼續(xù)單步標(biāo)志,轉(zhuǎn)步驟604;
步驟613、當(dāng)前線(xiàn)程有效斷點(diǎn)(fonction2處斷點(diǎn)P)再插入到代碼段
中;
步驟614、判斷繼續(xù)單步標(biāo)志是否置位,是則轉(zhuǎn)步驟615;否則轉(zhuǎn)步驟
616;
步驟615、設(shè)置任務(wù)單步寄存器;
步驟616、判斷當(dāng)前任務(wù)是否要跨斷點(diǎn),是則轉(zhuǎn)步驟617;否則單步異常返回,線(xiàn)程C2繼續(xù)運(yùn)行;
步驟617、恢復(fù)待跨斷點(diǎn)位置的原始指令,單步異常返回;
從以上斷點(diǎn)調(diào)試流程可以看到,線(xiàn)程C2停止在對(duì)其有效的斷點(diǎn)情況下以及后續(xù)再繼續(xù)運(yùn)行調(diào)試處理流程中,都僅控制線(xiàn)程C2而無(wú)需干擾其它的線(xiàn)程運(yùn)行,使得整個(gè)處理過(guò)程簡(jiǎn)潔高效;
步驟S5、線(xiàn)程C2進(jìn)行單步調(diào)試當(dāng)線(xiàn)程C2停止在fonction2代碼處時(shí),如果用戶(hù)不是繼續(xù)運(yùn)行而是希望單步調(diào)試,則按照下面的流程進(jìn)行處
理。單步調(diào)試分為步驟S51匯編級(jí)單步和步驟S52源代碼單步;
步驟S51、匯編級(jí)單步在用戶(hù)命令處理單元中設(shè)置C2線(xiàn)程的跨斷點(diǎn)
標(biāo)志和匯編單步標(biāo)志,并通過(guò)系統(tǒng)調(diào)用設(shè)置線(xiàn)程C2的單步寄存器。在調(diào)
度處理單元中進(jìn)行步驟S41的流程后,線(xiàn)程獲得調(diào)度;
線(xiàn)程C2在運(yùn)行了一條匯編指令后進(jìn)入到單步異常中,在單步異常中
采用圖6所示的流程進(jìn)行處理清空相關(guān)標(biāo)記后,判斷線(xiàn)程C2設(shè)置了匯
編單步標(biāo)記;然后清空相關(guān)標(biāo)記后組織上報(bào)單步停止事件;在單步異常返
回后線(xiàn)程被掛起。此時(shí)用戶(hù)在界面上就可看到線(xiàn)程C2完成了一個(gè)匯編級(jí)
單步;
步驟S52、源代碼單步源代碼單步類(lèi)似與上述的匯編級(jí)單步,不同之處在于匯編單步僅執(zhí)行一條匯編指令,而源代碼單步則要執(zhí)行當(dāng)前源代碼對(duì)應(yīng)的多條匯編指令。
在用戶(hù)命令處理單元中解析需要單步的源代碼,分解為源代碼開(kāi)始的PC地址和結(jié)束的PC地址。然后設(shè)置C2線(xiàn)程的跨斷點(diǎn)標(biāo)記和范圍內(nèi)單步標(biāo)記以及范圍的開(kāi)始地址和結(jié)束地址;最后通過(guò)系統(tǒng)調(diào)用設(shè)置線(xiàn)程C2的單步寄存器。在調(diào)度處理單元中進(jìn)行步驟S41的流程后,線(xiàn)程獲得調(diào)度。
線(xiàn)程C2在運(yùn)行了一條匯編指令后進(jìn)入到單步異常中,在單步異常中采用圖6所示的流程進(jìn)行處理。清空相關(guān)標(biāo)志后,判斷線(xiàn)程C2的單步類(lèi)型。由于線(xiàn)程C2設(shè)置了范圍內(nèi)單步標(biāo)記,則進(jìn)一步分析當(dāng)前停止的PC地址是否在范圍內(nèi)。如果仍然在范圍內(nèi),則插入有效斷點(diǎn)后繼續(xù)進(jìn)行單步控制,在單步完成后重新進(jìn)入單步異常,并繼續(xù)按照?qǐng)D6所示的流程進(jìn)行處理。
如果分析到當(dāng)前停止的PC地址已經(jīng)超出了單步范圍,則清空相關(guān)標(biāo)記后,組織上報(bào)源代碼單步結(jié)束事件。此時(shí)用戶(hù)在界面上就可看到線(xiàn)程C2完成了一個(gè)源代碼單步。
如果線(xiàn)程C2仍然在此范圍內(nèi),但是遇到斷點(diǎn),則進(jìn)入斷點(diǎn)處理流程,如圖5所示。同步驟S22的處理,判斷線(xiàn)程C2是否應(yīng)該被此斷點(diǎn)停止。如果應(yīng)該停止則認(rèn)為范圍內(nèi)單步結(jié)束,并上報(bào)斷點(diǎn)事件;如果不應(yīng)該停止則設(shè)置跨斷點(diǎn)標(biāo)志并設(shè)置單步寄存器,之后重新進(jìn)入單步異常并再判斷當(dāng)前地址是否超出范圍。
通過(guò)以上單步調(diào)試的流程可以看出,單步過(guò)程僅控制線(xiàn)程C2,而沒(méi)有影響到其他的線(xiàn)程。因此單步控制過(guò)程也是邏輯嚴(yán)謹(jǐn)并且高效的。
以上內(nèi)容是結(jié)合具體的優(yōu)選實(shí)施方式對(duì)本發(fā)明所作的進(jìn)一步詳細(xì)說(shuō) 明,不能認(rèn)定本發(fā)明的具體實(shí)施只局限于這些說(shuō)明。對(duì)于本發(fā)明所屬技術(shù) 領(lǐng)域的普通技術(shù)人員來(lái)說(shuō),在不脫離本發(fā)明構(gòu)思的前提下,還可以做出若 干簡(jiǎn)單推演或替換,都應(yīng)當(dāng)視為屬于本發(fā)明的保護(hù)范圍。
權(quán)利要求
1. 一種調(diào)試控制實(shí)現(xiàn)方法,包括斷點(diǎn)的插入和刪除過(guò)程,其特征在于所述斷點(diǎn)插入過(guò)程是通過(guò)內(nèi)核調(diào)度時(shí)插入僅對(duì)當(dāng)前切入的線(xiàn)程或任務(wù)有效的斷點(diǎn)實(shí)現(xiàn)的;所述斷點(diǎn)刪除過(guò)程是通過(guò)內(nèi)核調(diào)度需要切出所述線(xiàn)程或任務(wù)時(shí),刪除所述斷點(diǎn)實(shí)現(xiàn)的。
2. 根據(jù)權(quán)利要求1所述的方法,其特征在于還包括在斷點(diǎn)插入后, 對(duì)所述當(dāng)前切入的線(xiàn)程或任務(wù)進(jìn)行調(diào)試時(shí),在調(diào)試異常上下文中利用調(diào)試 異常處理所述線(xiàn)程或任務(wù)中的調(diào)試事件的過(guò)程。
3. 根據(jù)權(quán)利要求2所述的方法,其特征在于所述調(diào)試事件的處理過(guò) 程包括利用斷點(diǎn)異常處理所述當(dāng)前調(diào)度切入的線(xiàn)程或任務(wù)中的斷點(diǎn)事件的 過(guò)程。
4. 根據(jù)權(quán)利要求2所述的方法,其特征在于所述調(diào)試事件的處理過(guò) 程包括利用單步異常處理所述當(dāng)前調(diào)度切入的線(xiàn)程或任務(wù)中的單步事件的 過(guò)程。
5. 根據(jù)權(quán)利要求1至4任一所述的方法,其特征在于所述斷點(diǎn)的插 入過(guò)程具體包括以下步驟步驟A1、分析調(diào)度切入的線(xiàn)程或任務(wù),獲取對(duì)當(dāng)前切入的線(xiàn)程或任務(wù) 有效的斷點(diǎn);步驟B1、將步驟A1所述的斷點(diǎn)插入到代碼段; 步驟C1、保存斷點(diǎn)插入前的原始指令。
6. 根據(jù)權(quán)利要求5所述的方法,其特征在于所述斷點(diǎn)刪除過(guò)程具體 包括以下步驟步驟A2、分析調(diào)度切出的線(xiàn)程或任務(wù),獲取對(duì)當(dāng)前要切出線(xiàn)程或任務(wù) 有效的的斷點(diǎn);步驟B2、從代碼段中刪除步驟A2所述的斷點(diǎn); 步驟C2、恢復(fù)斷點(diǎn)插入前的原始指令。
7. —種調(diào)試控制系統(tǒng),包括調(diào)試任務(wù)處理模塊和內(nèi)核處理模塊,所述 調(diào)試任務(wù)處理模塊包括斷點(diǎn)管理單元、上報(bào)事件管理單元,其特征在于-所述內(nèi)核處理模塊包括調(diào)度處理單元,用于在內(nèi)核調(diào)度時(shí),插入僅對(duì)當(dāng)前切入的線(xiàn)程或任務(wù)有效的斷點(diǎn);還用于在內(nèi)核調(diào)度需要切出所述線(xiàn)程或任 務(wù)時(shí),刪除所述斷點(diǎn)。
8. 根據(jù)權(quán)利要求7所述的系統(tǒng),其特征在于所述調(diào)度處理單元還用 于在內(nèi)核調(diào)度時(shí)從所述斷點(diǎn)管理單元獲得要插入或刪除的斷點(diǎn)信息。
9. 根據(jù)權(quán)利要求7所述的系統(tǒng),其特征在于所述內(nèi)核處理模塊還包 括調(diào)試異常處理單元,用于對(duì)所述當(dāng)前切入的線(xiàn)程或任務(wù)進(jìn)行調(diào)試時(shí),在 調(diào)試異常上下文中利用調(diào)試異常處理所述線(xiàn)程或任務(wù)中的調(diào)試事件。
10. 根據(jù)權(quán)利要求9所述的系統(tǒng),其特征在于所述調(diào)試異常處理單 元包括斷點(diǎn)異常處理子單元,用于斷點(diǎn)插入后,利用斷點(diǎn)異常來(lái)處理所述 當(dāng)前調(diào)度切入的線(xiàn)程或任務(wù)中的斷點(diǎn)事件。
11. 根據(jù)權(quán)利要求9所述的系統(tǒng),其特征在于所述調(diào)試異常處理單 元還包括單步異常處理子單元,用于斷點(diǎn)插入后,利用單步異常來(lái)處理所 述當(dāng)前調(diào)度切入的線(xiàn)程或任務(wù)中的單步事件。
全文摘要
本發(fā)明公開(kāi)了一種調(diào)試控制實(shí)現(xiàn)方法,包括斷點(diǎn)的插入和刪除過(guò)程,所述斷點(diǎn)插入過(guò)程是通過(guò)內(nèi)核調(diào)度時(shí)插入僅對(duì)當(dāng)前切入的線(xiàn)程或任務(wù)有效的斷點(diǎn)實(shí)現(xiàn)的;所述斷點(diǎn)刪除過(guò)程是通過(guò)內(nèi)核調(diào)度需要切出所述線(xiàn)程或任務(wù)時(shí),刪除所述斷點(diǎn)實(shí)現(xiàn)的。本發(fā)明還公開(kāi)了一種調(diào)試控制系統(tǒng)。本發(fā)明在內(nèi)核調(diào)度時(shí)對(duì)當(dāng)前切入的線(xiàn)程或任務(wù)插入對(duì)其有效的斷點(diǎn),對(duì)當(dāng)前線(xiàn)程或任務(wù)無(wú)效的斷點(diǎn)則不會(huì)插入代碼段,這樣在調(diào)試中產(chǎn)生的調(diào)試事件均為有效事件,避免了無(wú)效事件對(duì)調(diào)試的影響,提高了調(diào)試效率;本發(fā)明在調(diào)度切入線(xiàn)程或任務(wù)時(shí)插入斷點(diǎn),這樣在處理當(dāng)前調(diào)試事件時(shí)也不需要控制其它線(xiàn)程或任務(wù)停止以及恢復(fù),進(jìn)一步提高了調(diào)試效率,也避免了漏斷點(diǎn)事件的發(fā)生。
文檔編號(hào)G06F11/36GK101504626SQ20091010584
公開(kāi)日2009年8月12日 申請(qǐng)日期2009年3月6日 優(yōu)先權(quán)日2009年3月6日
發(fā)明者東 劉, 紅 向, 崔云峰, 毅 張, 程圣宇 申請(qǐng)人:中興通訊股份有限公司