版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
目錄緒論研究背景及意義調(diào)試器能檢查程序的運(yùn)行情況,發(fā)現(xiàn)程序中的錯(cuò)誤,并提供幫助解決這些錯(cuò)誤。調(diào)試器還可以幫助開發(fā)人員理解程序的工作原理,并進(jìn)行代碼調(diào)試和優(yōu)化。而GDB則是Linux下的一種用于調(diào)試C語言程序的開源調(diào)試器。GDB具有著檢查程序運(yùn)行中的情況(如:變量以及內(nèi)存中的值)、設(shè)置斷點(diǎn)、查看程序堆棧信息以及查看程序匯編代碼等功能。開發(fā)人員通過對(duì)這些功能的靈活運(yùn)用,能快速地定位并解決開發(fā)過程中的錯(cuò)誤,大大提升了開發(fā)的效率。雖然GDB的功能很強(qiáng)大,但GDB存在著一定的缺陷,比如GDB是使用命令行進(jìn)行調(diào)試的,面對(duì)一些較為復(fù)雜的調(diào)試則需要輸入復(fù)雜且多余的調(diào)試命令,因此使用GDB可能需要大量的時(shí)間以及精力去學(xué)習(xí)掌握,對(duì)新手很不友好。此外GDB沒有圖形化界面,調(diào)試的過程以及結(jié)果不夠直觀,這無疑是提高了GDB的調(diào)試難度并拔高了GDB的使用門檻。由此可見可視化GDB的使用前景非常廣泛,它可以幫助開發(fā)人員更快速、更高效地調(diào)試代碼,提高生產(chǎn)力和代碼質(zhì)量。下面詳細(xì)介紹可視化GDB的使用前景。首先,可視化GDB可以用于代碼調(diào)試。通過可視化GDB,程序員可以輕松設(shè)置斷點(diǎn)、單步執(zhí)行代碼、查看變量值等操作,從而快速定位代碼中的錯(cuò)誤。相比于命令行界面,可視化GDB提供了更友好的用戶界面和各種實(shí)用的特性,如代碼窗口、變量窗口、調(diào)用棧、內(nèi)存查看器等等,使得調(diào)試過程更加容易和高效。其次,可視化GDB可以用于內(nèi)存調(diào)試??梢暬疓DB可以顯示程序運(yùn)行時(shí)的內(nèi)存分配情況,有助于程序員檢測內(nèi)存泄漏和越界訪問等問題。通過可視化GDB提供的內(nèi)存查看器,程序員可以方便地追蹤內(nèi)存的分配和釋放,找出內(nèi)存泄漏和越界訪問等問題,從而提高代碼的健壯性和穩(wěn)定性。第三,可視化GDB可以用于性能分析??梢暬疓DB可以跟蹤代碼執(zhí)行時(shí)間、函數(shù)調(diào)用次數(shù)、內(nèi)存占用等信息,有助于程序員優(yōu)化代碼性能。通過可視化GDB提供的性能分析器,程序員可以清晰地了解程序的運(yùn)行情況,找出影響程序性能的瓶頸所在,進(jìn)行優(yōu)化。第四,可視化GDB可以用于多線程調(diào)試。多線程編程是一個(gè)復(fù)雜的過程,可視化GDB可以幫助程序員追蹤不同線程的調(diào)用棧、鎖狀態(tài)、線程間通信等信息,從而更容易地調(diào)試多線程代碼。通過可視化GDB提供的多線程調(diào)試器,程序員可以方便地在多個(gè)線程之間切換,查看線程的執(zhí)行情況,定位多線程編程中的問題。最后,可視化GDB可以用于跨平臺(tái)調(diào)試。可視化GDB支持在不同平臺(tái)上進(jìn)行調(diào)試,比如Windows、Linux、macOS等系統(tǒng),這使得開發(fā)人員可以在不同平臺(tái)上共享調(diào)試會(huì)話,提高團(tuán)隊(duì)協(xié)作效率。通過可視化GDB提供的跨平臺(tái)調(diào)試功能,程序員可以方便地在不同平臺(tái)上調(diào)試代碼,避免由于平臺(tái)差異導(dǎo)致的問題,提高開發(fā)效率和代碼質(zhì)量。本次課題正是為了解決上述的問題,優(yōu)化GDB的使用而對(duì)GDB進(jìn)行可視化開發(fā)。GDB可視化后可以提高它的易用性,有了直觀的圖形化界面后人們可以更加容易了解程序的運(yùn)行狀態(tài)。其次通過圖形化界面用戶能更加快捷執(zhí)行的設(shè)置斷點(diǎn)、查看堆棧信息、修改變量等操作,不但提高了調(diào)試效率,還使得新手更易上手。還能同時(shí)看到程序的各種信息,比如函數(shù)的調(diào)用關(guān)系、變量的值等,避免了以往重復(fù)查詢的操作,使得開發(fā)人員更快更好的理解程序。國內(nèi)外研究現(xiàn)狀可視化開發(fā)的應(yīng)用可視化開發(fā)是一種無需編寫代碼的開發(fā)方式,它通過圖形化界面來幫助用戶快速構(gòu)建應(yīng)用程序。在國內(nèi)外,可視化開發(fā)已經(jīng)被廣泛使用,特別是隨著人工智能和大數(shù)據(jù)技術(shù)的不斷發(fā)展,更多的企業(yè)也開始嘗試可視化開發(fā),以提高效率和降低成本在國外,可視化開發(fā)已經(jīng)得到了廣泛的應(yīng)用。目前,市場上流行的可視化開發(fā)平臺(tái)有很多,其中最著名的是MicrosoftPowerBI、Tableau、QlikView等等。這些平臺(tái)都提供了豐富的可視化組件和交互式界面,可以方便地實(shí)現(xiàn)數(shù)據(jù)分析和報(bào)表制作。在美國,可視化開發(fā)被廣泛應(yīng)用于商業(yè)領(lǐng)域,特別是營銷和品牌推廣。例如,零售業(yè)、電子商務(wù)、醫(yī)藥業(yè)等行業(yè)都在使用可視化開發(fā)工具來分析數(shù)據(jù),以便更好地了解客戶需求和市場趨勢。此外,許多政府機(jī)構(gòu)和非盈利組織也開始使用可視化開發(fā)工具來處理大規(guī)模數(shù)據(jù)集,以便更好地管理資源和服務(wù)社區(qū)。在國內(nèi),可視化開發(fā)的發(fā)展還比較緩慢,但是隨著大數(shù)據(jù)和人工智能技術(shù)的不斷發(fā)展,越來越多的企業(yè)開始關(guān)注可視化開發(fā)。目前,國內(nèi)市場上也有不少可視化開發(fā)平臺(tái),其中最著名的是Tableau、FineBI等。近幾年來,中國政府逐漸加強(qiáng)對(duì)數(shù)據(jù)的管理和開放,并將數(shù)據(jù)開放作為重要的政策措施之一。因此,在以下幾個(gè)領(lǐng)域可視化開發(fā)顯得尤為突出:數(shù)據(jù)分析和商業(yè)智能可視化開發(fā)在數(shù)據(jù)分析和商業(yè)智能領(lǐng)域得到了廣泛應(yīng)用。例如,在電子商務(wù)行業(yè)中,企業(yè)可以利用可視化工具來分析銷售數(shù)據(jù)、用戶行為等信息,以便更好地了解市場動(dòng)態(tài)和客戶需求,從而作出更合理的營銷策略。在金融領(lǐng)域,銀行和保險(xiǎn)公司也廣泛使用可視化工具來管理風(fēng)險(xiǎn)、分析投資組合、預(yù)測市場走向等。政府?dāng)?shù)據(jù)開放和公共服務(wù)隨著政府?dāng)?shù)據(jù)開放政策的推進(jìn),越來越多的政府機(jī)構(gòu)開始利用可視化工具來處理和呈現(xiàn)數(shù)據(jù)。例如,在城市規(guī)劃和交通管理方面,政府可以利用可視化工具來顯示交通流量、公交線路等信息,以便更好地規(guī)劃城市交通。在公共服務(wù)方面,可視化工具也可以被用于醫(yī)療、教育等領(lǐng)域,幫助政府和機(jī)構(gòu)更好地了解社會(huì)需求和資源分布情況,從而提供更好的公共服務(wù)。企業(yè)信息化建設(shè)隨著企業(yè)信息化的不斷推進(jìn),越來越多的企業(yè)開始使用可視化工具來構(gòu)建各種應(yīng)用程序,包括數(shù)據(jù)儀表盤、報(bào)告、監(jiān)控系統(tǒng)等。例如,在制造業(yè)中,企業(yè)可以利用可視化工具來實(shí)現(xiàn)生產(chǎn)線管控、物流管理等功能。在電信、互聯(lián)網(wǎng)行業(yè)中,可視化工具也可以被用于網(wǎng)絡(luò)監(jiān)控、客戶運(yùn)營等方面。教育和科研在教育和科研領(lǐng)域,可視化工具也得到了廣泛應(yīng)用。例如,在科學(xué)研究中,研究人員可以利用可視化工具來呈現(xiàn)實(shí)驗(yàn)數(shù)據(jù)、模擬結(jié)果等信息。在教育中,可視化工具可以被用于課程設(shè)計(jì)、學(xué)習(xí)資源管理等方面,以便更好地支持學(xué)生學(xué)習(xí)和教師教學(xué)??梢娍梢暬_發(fā)是一種非常有前景的開發(fā)方式。無論是在國內(nèi)還是國外,都有許多企業(yè)和機(jī)構(gòu)開始嘗試使用可視化開發(fā)工具來提高效率和降低成本。隨著未來技術(shù)的不斷發(fā)展和應(yīng)用場景的不斷擴(kuò)大,可視化開發(fā)將會(huì)成為越來越重要的開發(fā)方式之一。GDB國內(nèi)外的使用現(xiàn)狀在國內(nèi)外GDB是一個(gè)功能強(qiáng)大的開源調(diào)試器,被廣泛應(yīng)用于Linux、Unix等操作系統(tǒng)平臺(tái)的C/C++程序的調(diào)試。通過其豐富的調(diào)試功能和可擴(kuò)展性,能夠幫助開發(fā)人員更快速、高效地進(jìn)行程序調(diào)試和修復(fù)問題。此外,由于GDB具有良好的穩(wěn)定性、靈活性和可擴(kuò)展性,因此在國內(nèi)外都有著廣泛的使用。在過去的幾十年里,隨著計(jì)算機(jī)科學(xué)和技術(shù)的飛速發(fā)展,軟件調(diào)試工具也取得了不小的進(jìn)步[1],不但在開發(fā)也在教學(xué)中都取得了舉足輕重的地位[2]。在Linux平臺(tái)上,GDB是一個(gè)廣泛使用的調(diào)試工具,它能夠幫助開發(fā)人員在程序運(yùn)行時(shí)查找和修復(fù)代碼問題。GDB(GNUDebugger)是類Unix(如Linux)操作系統(tǒng)下的一款開源的C/C++程序調(diào)試器。最初是在1988年由理查德·馬修·斯托曼(RichardStallman)所撰寫,之后以GNU通用公共許可證(GNUGeneralPublicLicense,GNUGPL)的許可方式將軟件發(fā)布。GDB具有著檢查程序運(yùn)行中的情況(如:變量以及內(nèi)存中的值)、設(shè)置斷點(diǎn)、查看程序堆棧信息以及查看程序匯編代碼等功能[3],通過對(duì)這些功能的靈活使用,開發(fā)人員能夠方便快捷的定位并解決開發(fā)過中出現(xiàn)的各種錯(cuò)誤。幾十年內(nèi)GDB更是在應(yīng)用程序開發(fā)(包括桌面應(yīng)用、Web應(yīng)用、移動(dòng)應(yīng)用等)、系統(tǒng)編程(包括內(nèi)核模塊、驅(qū)動(dòng)程序等)[4]、嵌入式系統(tǒng)開發(fā)(包括控制器[5]、微處理器[6]等)以及游戲開發(fā)中大放異彩。在國內(nèi),由于近年來計(jì)算機(jī)科學(xué)和技術(shù)領(lǐng)域的不斷發(fā)展壯大,越來越多的公司和個(gè)人開始在各種不同的領(lǐng)域和項(xiàng)目中使用GDB進(jìn)行調(diào)試。在Linux服務(wù)器管理、嵌入式開發(fā)、游戲開發(fā)、移動(dòng)應(yīng)用開發(fā)等行業(yè)和領(lǐng)域,GDB都有著較為廣泛的應(yīng)用。在國外,GDB也是一款非常流行的調(diào)試器,它被廣泛運(yùn)用于各個(gè)領(lǐng)域的程序開發(fā)、測試和維護(hù)工作中。GDB不僅支持多種編程語言,還可以實(shí)現(xiàn)多種調(diào)試方式,包括遠(yuǎn)程調(diào)試、核心轉(zhuǎn)儲(chǔ)分析、動(dòng)態(tài)符號(hào)加載等,這些特性使得GDB成為了許多程序員的首選調(diào)試器之一。QT技術(shù)的應(yīng)用QT是一種跨平臺(tái)、成熟、穩(wěn)定、高效的C++應(yīng)用程序開發(fā)框架,由QTCompany開發(fā)并維護(hù)。它提供了一整套工具和庫,允許開發(fā)人員使用一種統(tǒng)一的API在多種操作系統(tǒng)、平臺(tái)和設(shè)備上創(chuàng)建高質(zhì)量的應(yīng)用程序。QT最初被設(shè)計(jì)用于開發(fā)GUI(圖形用戶界面)應(yīng)用程序,但現(xiàn)在已經(jīng)發(fā)展為一種全面的應(yīng)用程序開發(fā)框架,支持面向?qū)ο缶幊毯褪录?qū)動(dòng)編程模型。QT提供了豐富的類庫,包括圖形、網(wǎng)絡(luò)、數(shù)據(jù)庫、XML、OpenGL等模塊,還包含了一個(gè)集成開發(fā)環(huán)境(IDE)-QTCreator,使得開發(fā)者可以方便地進(jìn)行開發(fā)和調(diào)試。QT經(jīng)常被應(yīng)用于一些需要圖形用戶界面的項(xiàng)目,尤其是需要跨平臺(tái)支持的項(xiàng)目。QT常見的應(yīng)用領(lǐng)域有:操作系統(tǒng):被用于開發(fā)多個(gè)操作系統(tǒng)的圖形用戶界面(GUI),如KDE、LXDE、Jolla和Tizen等軟件開發(fā)工具:QTCreator是一個(gè)基于QT框架的集成開發(fā)環(huán)境(IDE),被廣泛用于開發(fā)QT應(yīng)用程序游戲開發(fā):QT提供了豐富的圖形和多媒體處理能力嵌入式系統(tǒng):由于QT的輕量級(jí)特性,它被廣泛用于嵌入式設(shè)備的開發(fā),如智能家居控制器、機(jī)器人和醫(yī)療設(shè)備等。電子商務(wù):被用于開發(fā)各種電子商務(wù)應(yīng)用程序,如支付系統(tǒng)、在線商店和客戶端等。制造業(yè):被用于開發(fā)各種制造業(yè)應(yīng)用程序,如自動(dòng)化生產(chǎn)線控制系統(tǒng)、CAD/CAM軟件和PLM系統(tǒng)等。研究目的及內(nèi)容GDB無疑是一款功能強(qiáng)大的調(diào)試工具。但作為一款命令行工具,面對(duì)一些較為復(fù)雜的調(diào)試則需要輸入復(fù)雜且多余的調(diào)試命令[7],因此要想靈活使用GDB可能需要大量的時(shí)間以及精力去學(xué)習(xí)掌握,同時(shí)由于沒有圖形化的界面,在進(jìn)行調(diào)試時(shí)需要不斷的輸入重復(fù)的命令來查看變量、堆棧以及斷點(diǎn)等信息。這些缺陷不但提高了GDB的上手難度還降低了開發(fā)效率。為此大量的開發(fā)者以及研究人員為調(diào)試器的開發(fā)投入了大量的精力,南京大學(xué)的劉業(yè)在2012年,針對(duì)在靜態(tài)數(shù)組的越界訪問檢測方面不理想的問題,提出了根據(jù)程序內(nèi)存分布的不同,采用不同的方法抓取程序中的內(nèi)存分配信息方法,實(shí)現(xiàn)了支持內(nèi)存錯(cuò)誤檢測的改進(jìn)gdb調(diào)試器[8];電子科技大學(xué)的龔偉為方便嵌入式平臺(tái)的開發(fā)工作,對(duì)GDB進(jìn)功能行了整合,設(shè)計(jì)了一款基于GDB的嵌入式平臺(tái)下的調(diào)試器[9];倪曉波、李彧基于VSCode,通過設(shè)計(jì)開發(fā)新型前端UI擴(kuò)展和后端全平臺(tái)通用調(diào)試適配器相結(jié)合,底層設(shè)計(jì)開發(fā)了一種可擴(kuò)展性強(qiáng)的GDB調(diào)試代理[10];2020年李鵬華在電子制作的基于GDB的逆向調(diào)試方法探究一文中,以GDB為基礎(chǔ),創(chuàng)新調(diào)試方法,探究可逆調(diào)試的應(yīng)用方法[11];文獻(xiàn)[12]則是一款基于GDB名為DDD的可視化調(diào)試工具,該工具在具有較為完整的可視化界面,使用者可以直觀的從界面中看到調(diào)試過程中的各種信息。通過對(duì)這些研究成果的分析,我們可以發(fā)現(xiàn),基于GDB的可視化工具具有很多優(yōu)點(diǎn)。首先,這些工具能夠提高用戶體驗(yàn),使用戶能夠更方便地查看程序的執(zhí)行情況和調(diào)試信息。其次,這些工具能夠提供更豐富的調(diào)試信息,包括程序運(yùn)行時(shí)的狀態(tài)、斷點(diǎn)信息、變量值等。最后,這些工具能夠提供更多的調(diào)試功能,包括控制程序運(yùn)行、設(shè)置斷點(diǎn)、查看堆棧等。但是部分開發(fā)工具仍存在著不小的缺陷,上文中介紹的DDD就存在著操作界面不是很友好,不能為用戶提供一些更加貼合自身的自定義選項(xiàng)的問題;還有一些可視化工具則功能較為有限,只能提供GDB的一些基礎(chǔ)功能,缺少一些調(diào)試過程中的高級(jí)功能選項(xiàng),不能滿足開發(fā)者深層次的使用需求。本課題為了優(yōu)化GDB的使用體驗(yàn),針對(duì)上述問題進(jìn)行研究,最終得出了使用QT框架對(duì)GDB進(jìn)行可視化開發(fā)的設(shè)計(jì)方案。該方案包括對(duì)GDB一些基礎(chǔ)功能的集成,如:單步調(diào)試、打斷點(diǎn)等;簡化部分調(diào)試過程中的重復(fù)操作,如:實(shí)時(shí)查看調(diào)試源代碼、實(shí)時(shí)查看調(diào)試過程中參數(shù)變化等;以及一些高級(jí)操作選項(xiàng),如:腳本自動(dòng)化調(diào)試、終端模塊實(shí)時(shí)模擬終端等。論文的組織結(jié)構(gòu)第一部分的主要內(nèi)容是對(duì)本課題的研究背景、國內(nèi)外的研究現(xiàn)狀、Linux平臺(tái)下的GDB可視化工具的使用前景。第二部分主要是對(duì)項(xiàng)目進(jìn)行了整體分析,包括項(xiàng)目的需求、整體架構(gòu)以及開發(fā)過程中涉及到的主要技術(shù)。第三部分主要是概括性的介紹了項(xiàng)目的大致框架以及功能模塊的拆解節(jié)分析第四部分對(duì)各功能模塊的設(shè)計(jì)思路進(jìn)行了詳細(xì)介紹。第五部分則是結(jié)合源碼對(duì)項(xiàng)目的實(shí)現(xiàn)進(jìn)行了介紹。第六部分是對(duì)已完成的可視化進(jìn)行測試,并對(duì)測試結(jié)果進(jìn)行分析。第七部分是對(duì)本課題的最終總結(jié)。
第2章項(xiàng)目需求分析項(xiàng)目需求分析業(yè)務(wù)分析該項(xiàng)目主要服務(wù)于對(duì)GDB接觸不多的新手用戶,這些用戶往往希望操作更加的簡明,避免一些重復(fù)的操作。主要包括:文件新建、保存、文件結(jié)構(gòu)展示、代碼修改、代碼調(diào)試、斷點(diǎn)信息展示、參數(shù)信息展示、線程信息展示等。用例圖如下圖所示:圖STYLEREF1\s2.SEQ圖\*ARABIC\s11用戶操作用例圖需求分析本課題主要是為了實(shí)現(xiàn)Linux系統(tǒng)下GDB調(diào)試器的一些基礎(chǔ)功能的可視化,以及調(diào)試過程的一些操作上的優(yōu)化。功能需求分析文件模塊:項(xiàng)目或文件(腳本或待測文件)的創(chuàng)建、打開以及刪除文本模塊:查看文件內(nèi)容,修改文件內(nèi)容視圖模塊:調(diào)整界面布局,顯示或隱藏界面調(diào)試模塊:切換調(diào)試模式(單步調(diào)試、腳本調(diào)試)、中斷調(diào)試、結(jié)束調(diào)試輸出模塊:打印調(diào)試時(shí)間、打印調(diào)試過程中的輸出信息變量模塊:監(jiān)測變量的值、顯示變量信息以及變量信息的修改斷點(diǎn)模塊:斷點(diǎn)設(shè)置(添加、刪除、啟用、禁用)線程模塊:顯示線程信息、切換線程堆棧進(jìn)程模塊:監(jiān)視調(diào)試過程中的內(nèi)存信息、顯示進(jìn)程信息終端模塊:模擬終端的大部分功能:用戶切換、查詢文件、代碼調(diào)試等。非功能需求分析性能分析該課題項(xiàng)目主要服務(wù)于新手GDB用戶,在功能的需求量上不會(huì)太高,主要都是單一化的操作。主要應(yīng)保證項(xiàng)目的穩(wěn)定性以及可靠性。開發(fā)環(huán)境分析該可視化工具主要通過QT框架在Linux下進(jìn)行開發(fā)。在界面發(fā)生響應(yīng)后調(diào)用起對(duì)應(yīng)的Shelll腳本或命令,以實(shí)現(xiàn)對(duì)應(yīng)的功能,并將獲取到的信息進(jìn)行處理,接著反饋到界面中。技術(shù)分析由于該項(xiàng)目基于Linux系統(tǒng),經(jīng)過比對(duì)發(fā)現(xiàn)QT框架在Linux下的可視化開發(fā)中較為常見,且QT下存在對(duì)進(jìn)程操作的相關(guān)類,結(jié)合Shell腳本能較大程度的模擬終端的整體實(shí)現(xiàn)流程,且方便對(duì)輸出的數(shù)據(jù)進(jìn)行整理。故該項(xiàng)目主要通過QT框架設(shè)計(jì)界面,在界面對(duì)應(yīng)功能塊被觸發(fā)后通過信號(hào)與槽功能,實(shí)現(xiàn)對(duì)應(yīng)事件的響應(yīng),主體功能的實(shí)現(xiàn)主要使用Shell對(duì)命令行以及GDB命令進(jìn)行整合,并使用QT中的QProcess類來進(jìn)行調(diào)用。QT簡介為實(shí)現(xiàn)gdb的可視化,QT是一個(gè)不可或缺的工具。由于QT良好的跨平臺(tái)性,我們可以方便的使用QT在Linux環(huán)境下進(jìn)行開發(fā)以及常規(guī)的調(diào)試工作,也能在開發(fā)的過程中直觀的看到調(diào)試結(jié)果。此外,QT提供了一套完整的GUI編程工具和類庫,可以快速地構(gòu)建高性能、可擴(kuò)展、易于維護(hù)的GUI應(yīng)用程序。QT提供了一套圖形界面設(shè)計(jì)工具和開發(fā)環(huán)境,如QTDesigner和QTCreator等,使得UI設(shè)計(jì)和編碼變得簡單和直觀。在GDB可視化開發(fā)過程中,使用QTGUI框架可以大大簡化UI開發(fā)的過程,提高開發(fā)效率。QT還支持多種編程語言REF_Ref22990\r\h[13],并具有良好的可移植性REF_Ref23026\r\h[14]和開源特性REF_Ref23055\r\h[15],此外,QT與Linux有著較好的相性,即使是在Linux平臺(tái),QT也能進(jìn)行較為完善的開發(fā)工作REF_Ref23081\r\h[16]。為了實(shí)現(xiàn)可視化開發(fā),需要通過GDB調(diào)試器接口與GDB進(jìn)行通信。QT提供了Gdbmi插件,可以實(shí)現(xiàn)與GDB之間的通信,并將GDB輸出以文本格式顯示在QT應(yīng)用程序中。同時(shí),也可以使用QProcess類調(diào)用GDB進(jìn)程,并將其輸出轉(zhuǎn)換成文本格式。借助GDB調(diào)試器接口,可以輕松地獲取GDB的輸出并進(jìn)行解析處理,從而實(shí)現(xiàn)GUI控件與GDB命令之間的交互。QT中的信號(hào)與槽機(jī)制是實(shí)現(xiàn)對(duì)象間通信的重要方式。在GDB可視化開發(fā)過程中,可以利用信號(hào)與槽機(jī)制來實(shí)現(xiàn)GUI控件與GDB命令之間的交互。例如,在用戶點(diǎn)擊“運(yùn)行”按鈕時(shí),會(huì)向GDB發(fā)送相應(yīng)的命令,而當(dāng)GDB有輸出時(shí),會(huì)發(fā)送信號(hào)通知QT應(yīng)用程序更新UI界面。通過信號(hào)與槽機(jī)制的運(yùn)用,可以實(shí)現(xiàn)GUI和GDB之間的松耦合通信,提高程序的可維護(hù)性和擴(kuò)展性。除了QT提供的標(biāo)準(zhǔn)GUI控件外,還可以根據(jù)需要開發(fā)自定義控件。例如,在GDB可視化開發(fā)過程中,可以開發(fā)一個(gè)自定義控件用于顯示GDB命令行輸出,并支持滾動(dòng)、拖拽等操作。自定義控件的開發(fā)需要熟練掌握QT的基本GUI編程知識(shí)和C++語言特性,同時(shí)需要考慮控件的性能、可維護(hù)性和用戶體驗(yàn)等方面。通過自定義控件的開發(fā),可以滿足具體項(xiàng)目的需求,使程序更加靈活和定制化。GDB調(diào)試過程介紹GDB(GNUDebugger)是類Unix(如Linux)操作系統(tǒng)下的一款開源的C/C++程序調(diào)試器。最初是在1988年由理查德·馬修·斯托曼(RichardStallman)所撰寫,之后以GNU通用公共許可證(GNUGeneralPublicLicense,GNUGPL)的許可方式將軟件發(fā)布。GDB支持多種編程語言,包括C、C++、匯編等,并且可以用于本地程序調(diào)試或遠(yuǎn)程程序調(diào)試。GDB還支持許多高級(jí)調(diào)試功能,如斷點(diǎn)、單步執(zhí)行、變量查看、棧跟蹤、內(nèi)存檢查等。使用GDB,程序員可以逐行執(zhí)行程序,了解程序運(yùn)行狀態(tài),并能夠根據(jù)需要在代碼中設(shè)置斷點(diǎn),修改變量的值,甚至能夠動(dòng)態(tài)地加載新的代碼。通過對(duì)這些功能的靈活使用,開發(fā)人員能夠方便快捷的定位并解決開發(fā)過中出現(xiàn)的各種錯(cuò)誤。GDB的調(diào)試流程如下:編譯可執(zhí)行文件時(shí)使用-g選項(xiàng)啟用調(diào)試信息。啟動(dòng)GDB并加載可執(zhí)行文件。設(shè)置斷點(diǎn)以停止程序執(zhí)行。運(yùn)行程序并等待斷點(diǎn)被觸發(fā)。使用命令來檢查變量、堆棧和內(nèi)存中的值。單步執(zhí)行程序并檢查當(dāng)前狀態(tài)。重復(fù)以上步驟,直到找到問題并修復(fù)它。退出GDB并重新編譯可執(zhí)行文件以將更改保存回源代碼。以下是一些常用的GDB命令及其功能:run:運(yùn)行程序,可帶參數(shù)。break:設(shè)置斷點(diǎn),可以在指定行或函數(shù)處設(shè)置斷點(diǎn),也可以設(shè)置條件斷點(diǎn)。continue:繼續(xù)執(zhí)行程序直到下一個(gè)斷點(diǎn)或程序結(jié)束。step:單步執(zhí)行程序,并進(jìn)入函數(shù)內(nèi)部。next:單步執(zhí)行程序,但不進(jìn)入函數(shù)內(nèi)部。finish:執(zhí)行程序直到當(dāng)前函數(shù)返回。backtrace或bt:查看函數(shù)調(diào)用棧。frame:切換當(dāng)前活動(dòng)幀。print或p:打印變量的值。info:顯示程序狀態(tài)信息,如斷點(diǎn)、寄存器、線程等。watch:監(jiān)視變量的值,當(dāng)其被修改時(shí)自動(dòng)停下來。set:改變變量的值。display:每次停下來時(shí)顯示表達(dá)式的值。uninstall:刪除指定的斷點(diǎn)。help或h:查詢GDB幫助文檔。Shell腳本介紹shell是一種命令解釋器,它解釋和執(zhí)行用戶輸入的命令。shell是操作系統(tǒng)的外殼,它提供了一個(gè)交互界面,用于和操作系統(tǒng)進(jìn)行交互REF_Ref23783\r\h[17]。用戶通過輸入命令來操作操作系統(tǒng),例如復(fù)制文件、查看文件內(nèi)容、管理進(jìn)程等REF_Ref23757\r\h[18]。此外,使用Shell腳本可以幫助開發(fā)人員自動(dòng)化任務(wù)、批處理處理以及快速執(zhí)行命令,尤其適合處理大量數(shù)據(jù)或需要頻繁執(zhí)行命令。Shell腳本可以在終端或其他命令行界面上運(yùn)行,也可以通過定時(shí)任務(wù)來定期執(zhí)行。它通常用于Unix操作系統(tǒng)和類Unix操作系統(tǒng)中,但現(xiàn)在也被廣泛應(yīng)用于其他操作系統(tǒng)。Shell腳本編程語言非常簡單易學(xué),學(xué)習(xí)曲線較低,有著開源免費(fèi)、系統(tǒng)穩(wěn)定、性能優(yōu)異和多語言支持等優(yōu)勢REF_Ref23705\r\h[19]。它可以輕松地處理文件、目錄和文本數(shù)據(jù)。同時(shí),Shell腳本還支持各種常見編程語言的基本結(jié)構(gòu),如循環(huán)、條件判斷、變量定義和函數(shù)等。這些特性使得Shell腳本編程成為許多自動(dòng)化任務(wù)和批處理處理任務(wù)的首選工具。此外,Shell腳本的使用還可以提高工作效率和質(zhì)量。通過編寫腳本程序,可以避免手動(dòng)重復(fù)進(jìn)行一些繁瑣的操作。這不僅可以提高工作效率,也可以減少錯(cuò)誤發(fā)生的機(jī)會(huì)。本章小結(jié)本章主要對(duì)該項(xiàng)目的業(yè)務(wù)邏輯以及需求進(jìn)行了分析,并詳盡的介紹了本課題開發(fā)過程中所依賴的三大技術(shù):QT、GDB調(diào)試以及Shell腳本編程,并分別對(duì)這三大技術(shù)在Linux下實(shí)現(xiàn)GDB可視化工具進(jìn)行了可行性分析。
第3章項(xiàng)目概要設(shè)計(jì)項(xiàng)目概要設(shè)計(jì)架構(gòu)設(shè)計(jì)本課題的界面開發(fā)由QT框架實(shí)現(xiàn),整體采用QTCreator的控件與代碼結(jié)合來進(jìn)行設(shè)計(jì),用shell腳本以及Linux下的命令行對(duì)GDB的一些常用功能(調(diào)試、運(yùn)行、添加斷點(diǎn)、刪除斷點(diǎn)、禁用斷點(diǎn)、啟用斷點(diǎn)等)進(jìn)行整合并開發(fā)一些實(shí)用功能(如腳本編寫、腳本調(diào)試、參數(shù)信息實(shí)時(shí)獲取等),最后QT中的信號(hào)與槽將界面和功能綁定。功能模塊設(shè)計(jì)這次開發(fā)主要分為四個(gè)大模塊:文件文本模塊、調(diào)試模塊、信息模塊、管理模塊。文件文本模塊:文件模塊、文本模塊;調(diào)試模塊:調(diào)試模塊、斷點(diǎn)模塊;信息模塊:輸出模塊、變量模塊、線程信息模塊以及進(jìn)程監(jiān)視模塊;管理模塊:視圖模塊、腳本管理模塊、終端模塊系統(tǒng)功能。其中前三個(gè)模塊是用戶能直接感知到的部分,管理模塊則是本項(xiàng)目的主要實(shí)現(xiàn)模塊以及功能優(yōu)化模塊,整個(gè)項(xiàng)目主要依托于管理模塊中的腳本管理模塊來運(yùn)行。系統(tǒng)功能模塊圖如圖4.1所示:圖STYLEREF1\s3.SEQ圖\*ARABIC\s11系統(tǒng)功能模塊圖主界面設(shè)計(jì)整個(gè)主界面由QT進(jìn)行創(chuàng)建,主要分為以下幾個(gè)模塊:文件結(jié)構(gòu)、菜單欄、工具欄、文本編輯、下邊欄、斷點(diǎn)信息界面、參數(shù)信息界面、內(nèi)存信息界面、進(jìn)程信息界面。概要設(shè)計(jì)文件文本模塊該模塊主要細(xì)化為文件模塊、文本模塊。文件模塊該模塊主要是為了實(shí)現(xiàn)項(xiàng)目、文件的創(chuàng)建、打開、刪除、重命名、保存、另存為、項(xiàng)目結(jié)構(gòu)展示等功能。文本模塊該模塊主要實(shí)現(xiàn)的是文件內(nèi)容查看、還有一些常見的文本修改。文件結(jié)構(gòu)模塊該模塊主要實(shí)現(xiàn)的是文件、項(xiàng)目結(jié)構(gòu)展示,能通過用戶鼠標(biāo)的操作實(shí)現(xiàn)文件的相關(guān)操作。由于文件結(jié)構(gòu)的展示采用樹狀結(jié)構(gòu)比較明晰,這邊的設(shè)計(jì)主要使用QTreeWidget。通過對(duì)QTreeWidget的item的增加、刪除、獲取索引值等操作實(shí)現(xiàn),對(duì)應(yīng)文件的展示、創(chuàng)建、刪除以及獲取文件路徑,此外通過對(duì)鼠標(biāo)事件的監(jiān)測,比如雙擊事件,再通過與文本模塊的連接,實(shí)現(xiàn)了雙擊在文本模塊顯示文本內(nèi)容的功能。調(diào)試模塊該模塊主要細(xì)化為調(diào)試模塊、斷點(diǎn)模塊。調(diào)試模塊該模塊是用以實(shí)現(xiàn)調(diào)試模式的切換以及調(diào)試方式。調(diào)試模式可分為:單步調(diào)試、腳本自動(dòng)化調(diào)試。調(diào)試方式可分為:繼續(xù)運(yùn)行直到程序結(jié)束、單步運(yùn)行、以及中斷調(diào)試等。斷點(diǎn)模塊該模塊需要實(shí)現(xiàn)斷點(diǎn)的添加與刪除、斷點(diǎn)的禁用與啟用、設(shè)置臨時(shí)斷點(diǎn)等功能。信息模塊該模塊主要細(xì)化為輸出模塊、變量模塊、線程信息模塊、進(jìn)程監(jiān)視模塊。輸出模塊該模塊主要負(fù)責(zé)調(diào)試信息的顯示以及信息的處理,調(diào)試信息主要包括調(diào)試的時(shí)間,調(diào)試過程中輸出的信息(異常輸出);信息處理包括信息內(nèi)容的復(fù)制以及輸出框的清空等。變量模塊該模塊需要實(shí)現(xiàn)對(duì)變量賦值或者修改變量的值,實(shí)時(shí)顯示變量信息的功能,變量的信息主要包括:變量的名稱、值、變量類型、內(nèi)存地址等。該模塊的實(shí)現(xiàn)也主要依托于腳本的調(diào)用,QT設(shè)計(jì)方面也與斷點(diǎn)模塊類似單獨(dú)設(shè)計(jì)一個(gè)界面,同樣通過QTreeWidget來折疊變量的詳細(xì)信息。線程信息模塊該模塊需要實(shí)現(xiàn)查看當(dāng)前線程調(diào)用堆棧、切換當(dāng)前線程到指定堆棧的功能。進(jìn)程監(jiān)視模塊該模塊需要實(shí)現(xiàn)監(jiān)視當(dāng)前調(diào)試中進(jìn)行的內(nèi)存信息、進(jìn)程id、信號(hào)等功能。管理模塊該模塊主要細(xì)化為視圖模塊、腳本管理模塊、終端模塊。視圖模塊該模塊需要實(shí)現(xiàn)界面布局的調(diào)整,通過模塊的選擇來顯示或隱藏部分功能界面以及恢復(fù)默認(rèn)配置的功能。腳本管理模塊該模塊主要實(shí)現(xiàn)腳本的調(diào)用與禁用以及不同腳本的調(diào)用規(guī)則設(shè)計(jì)。此處的腳本主要服務(wù)于部分模塊的功能實(shí)現(xiàn),比如調(diào)試模塊以及信息模塊這兩大塊與GDB聯(lián)系緊密的模塊。終端模塊該模塊需要實(shí)現(xiàn)了新建終端、關(guān)閉當(dāng)前終端、清空終端等功能。本章小結(jié)該小結(jié)主要分析了整個(gè)項(xiàng)目框架,并對(duì)項(xiàng)目的模塊進(jìn)行了細(xì)化拆分。
第4章項(xiàng)目詳細(xì)設(shè)計(jì)項(xiàng)目詳細(xì)設(shè)計(jì)詳細(xì)設(shè)計(jì)文件文本模塊該模塊主要細(xì)化為文件模塊、文本模塊。文件模塊該模塊主要是為了實(shí)現(xiàn)項(xiàng)目、文件的創(chuàng)建、打開、刪除、重命名、保存、另存為、項(xiàng)目結(jié)構(gòu)展示等功能。這里的項(xiàng)目主要包含待測程序、編譯出的可執(zhí)行文件以及測試腳本(該腳本用于調(diào)試時(shí)的自動(dòng)化調(diào)試,來滿足開發(fā)人員的深層次的開發(fā)需求。),這里需要注意的是各類文件所符合的文件類型,比如待測文件只能是.c以及.cpp的格式。部分功能流程圖如下:圖STYLEREF1\s4.SEQ圖\*ARABIC\s11創(chuàng)建文件流程圖這是創(chuàng)建文件的流程圖,在該項(xiàng)目中文件有三種存在形式:1)待測源程序(一般為.c.cpp型的程序);2)可執(zhí)行程序,即單個(gè)文件或多個(gè)文件編譯出來的直接作用于GDB調(diào)試的程序;3)腳本文件,該文件主要服務(wù)于調(diào)試模塊中的腳本調(diào)試選項(xiàng)。文件的創(chuàng)建一般是在項(xiàng)目結(jié)構(gòu)已經(jīng)創(chuàng)建成功的情況下進(jìn)行的,所以文件路徑的創(chuàng)建依照項(xiàng)目位置而定。在觸發(fā)創(chuàng)建文件流程后,首先要選擇并確定文件的格式,這一步主要用以區(qū)分文件的類型(可執(zhí)行文件程序一般不予以創(chuàng)建),并以此來確定每個(gè)文件的用途。接著輸入自定義的文件名,如果文件名以及文件類型的組合在項(xiàng)目路徑中存在,則判定創(chuàng)建失敗,重新提示輸入文件名,否則在單擊確認(rèn)按鈕后成功創(chuàng)建文件。圖STYLEREF1\s4.SEQ圖\*ARABIC\s12創(chuàng)建項(xiàng)目流程圖這是創(chuàng)建項(xiàng)目的流程圖,由上可知文件有著三種存在形式,這三種類型的文件構(gòu)成了一個(gè)完整的項(xiàng)目。在項(xiàng)目創(chuàng)建之初,應(yīng)當(dāng)先確定項(xiàng)目創(chuàng)建的路徑,接著對(duì)路徑的是否存在進(jìn)行判斷,若項(xiàng)目不存在,則提示重新輸入項(xiàng)目路徑,接著輸入項(xiàng)目名,依照項(xiàng)目名創(chuàng)建對(duì)應(yīng)的項(xiàng)目目錄,若該路徑下項(xiàng)目目錄存在則提示重新輸入項(xiàng)目名。前兩步無誤則可以選取項(xiàng)目內(nèi)容(一般區(qū)分為有腳本和無腳本,腳本如上文所說主要服務(wù)于腳本調(diào)試功能,故前者更適合功能要求較多的開發(fā)者,后者更適合新手。)以及項(xiàng)目的調(diào)試等級(jí)(調(diào)試等級(jí)越高,調(diào)試過程中獲取的信息越多),最后點(diǎn)擊確認(rèn)按鈕創(chuàng)建項(xiàng)目成功。圖STYLEREF1\s4.SEQ圖\*ARABIC\s13文件另存為流程圖這是文件另存為的流程圖,再選中文件另存為功能后,首先判斷選中的文件是否存在,確認(rèn)文件存在后輸入存儲(chǔ)路徑,對(duì)另存為的路徑進(jìn)行判斷。當(dāng)確認(rèn)另存為的路徑存在后選擇文件的存儲(chǔ)格式,根據(jù)文件名以及文件格式判斷該存儲(chǔ)路徑下是否存在同名文件,一旦判斷另存為路徑不存在后,則可點(diǎn)擊確認(rèn)另存為按鈕,實(shí)現(xiàn)文件的另存為功能。文本模塊該模塊主要實(shí)現(xiàn)的是文件內(nèi)容查看、還有一些常見的文本修改。文本內(nèi)容的查看主要依靠的是QT的QTextEdit控件,通過我們對(duì)文件的選中發(fā)送信號(hào)來發(fā)送文件地址,在文本展示的類接受到這一信號(hào)時(shí)打開對(duì)應(yīng)的文件,并按行讀取并同時(shí)將文件內(nèi)容寫入QTextEdit中。由于QTextEdit本身就是一個(gè)支持文本編輯的控件,我們一些常規(guī)的文本操作均可采用QTextEdit自帶的方法來優(yōu)化實(shí)現(xiàn)。其中一些在QT中實(shí)現(xiàn)較為復(fù)雜的文本操作,我們也可以采用shell腳本來簡化文本操作流程。文件結(jié)構(gòu)模塊該模塊主要實(shí)現(xiàn)的是文件、項(xiàng)目結(jié)構(gòu)展示,能通過用戶鼠標(biāo)的操作實(shí)現(xiàn)文件的相關(guān)操作。由于文件結(jié)構(gòu)的展示采用樹狀結(jié)構(gòu)比較明晰,這邊的設(shè)計(jì)主要使用QTreeWidget。通過對(duì)QTreeWidget的item的增加、刪除、獲取索引值等操作實(shí)現(xiàn),對(duì)應(yīng)文件的展示、創(chuàng)建、刪除以及獲取文件路徑,此外通過對(duì)鼠標(biāo)事件的監(jiān)測,比如雙擊事件,再通過與文本模塊的連接,實(shí)現(xiàn)了雙擊在文本模塊顯示文本內(nèi)容的功能。調(diào)試模塊該模塊主要細(xì)化為調(diào)試模塊、斷點(diǎn)模塊。調(diào)試模塊該模塊是用以實(shí)現(xiàn)調(diào)試模式的切換以及調(diào)試方式。調(diào)試模式可分為:單步調(diào)試、腳本自動(dòng)化調(diào)試。調(diào)試方式可分為:繼續(xù)運(yùn)行直到程序結(jié)束、單步運(yùn)行、以及中斷調(diào)試等。斷點(diǎn)模塊該模塊需要實(shí)現(xiàn)斷點(diǎn)的添加與刪除、斷點(diǎn)的禁用與啟用、設(shè)置臨時(shí)斷點(diǎn)等功能。這些功能的也是通過腳本實(shí)現(xiàn),在QT方面需要單獨(dú)設(shè)計(jì)一個(gè)窗體,可以使用QT中的QTreeWidget控件來收縮每一個(gè)斷點(diǎn)的信息使得界面看起來更加的美觀,當(dāng)需要對(duì)斷點(diǎn)進(jìn)行調(diào)整或查看斷點(diǎn)信息時(shí)只要點(diǎn)擊展開按鈕即可顯示詳細(xì)信息與操作。斷點(diǎn)添加功能則需要嵌入到上文提到的文本模塊中提到的自定義窗體類中,在該類中需要設(shè)計(jì)一個(gè)添加斷點(diǎn)的槽函數(shù),當(dāng)在每一行前單機(jī)或者雙擊時(shí),就會(huì)發(fā)出信號(hào)。一旦接收到信號(hào),立即觸發(fā)槽函數(shù),為了讓斷點(diǎn)的位置更易辨識(shí),可以在每一行前添加一個(gè)標(biāo)志來指明斷點(diǎn),對(duì)于斷點(diǎn)的不同狀態(tài)可以通過顏色加以區(qū)分,比如:紅色代表普通斷點(diǎn),綠色代表臨時(shí)斷點(diǎn),灰色則表示當(dāng)前斷點(diǎn)處于禁用的狀態(tài)。信息模塊該模塊主要細(xì)化為輸出模塊、變量模塊、線程信息模塊、進(jìn)程監(jiān)視模塊。輸出模塊該模塊主要負(fù)責(zé)調(diào)試信息的顯示以及信息的處理,調(diào)試信息主要包括調(diào)試的時(shí)間,調(diào)試過程中輸出的信息(異常輸出);信息處理包括信息內(nèi)容的復(fù)制以及輸出框的清空等。變量模塊該模塊需要實(shí)現(xiàn)對(duì)變量賦值或者修改變量的值,實(shí)時(shí)顯示變量信息的功能,變量的信息主要包括:變量的名稱、值、變量類型、內(nèi)存地址等。該模塊的實(shí)現(xiàn)也主要依托于腳本的調(diào)用,QT設(shè)計(jì)方面也與斷點(diǎn)模塊類似單獨(dú)設(shè)計(jì)一個(gè)界面,同樣通過QTreeWidget來折疊變量的詳細(xì)信息。線程信息模塊該模塊需要實(shí)現(xiàn)查看當(dāng)前線程調(diào)用堆棧、切換當(dāng)前線程到指定堆棧的功能。該模塊與變量模塊的設(shè)計(jì)思路一致。進(jìn)程監(jiān)視模塊該模塊需要實(shí)現(xiàn)監(jiān)視當(dāng)前調(diào)試中進(jìn)行的內(nèi)存信息、進(jìn)程id、信號(hào)等功能。該模塊的功能實(shí)現(xiàn)需要使用Linux下的命令,在調(diào)試可執(zhí)行文件時(shí)使用ps、top等命令查詢進(jìn)程信息,并通過grep、awk等命令通過可執(zhí)行文件名(即進(jìn)程名)對(duì)進(jìn)程信息進(jìn)行篩選。管理模塊該模塊主要細(xì)化為視圖模塊、腳本管理模塊、終端模塊。視圖模塊該模塊需要實(shí)現(xiàn)界面布局的調(diào)整,通過模塊的選擇來顯示或隱藏部分功能界面以及恢復(fù)默認(rèn)配置的功能。腳本管理模塊該模塊主要實(shí)現(xiàn)腳本的調(diào)用與禁用以及不同腳本的調(diào)用規(guī)則設(shè)計(jì)。此處的腳本主要服務(wù)于部分模塊的功能實(shí)現(xiàn),比如調(diào)試模塊以及信息模塊這兩大塊與GDB聯(lián)系緊密的模塊。終端模塊該模塊實(shí)際上是一個(gè)簡易的終端,開發(fā)者可以通過輸入Linux下的命令對(duì)終端進(jìn)行控制,返回的內(nèi)容與常規(guī)終端下一至。該模塊與其他模塊的配合使用,會(huì)使得該工具的功能更加的強(qiáng)大,比如通過進(jìn)程監(jiān)視模塊下我們獲取到了進(jìn)程的一些基本信息,此時(shí)就可以利用這基本信息使用Linux下的命令進(jìn)行更深層次的探索。該模塊實(shí)現(xiàn)了新建終端、關(guān)閉當(dāng)前終端、清空終端等功能。本章小結(jié)該小結(jié)主要分析了每個(gè)模塊所包含的小模塊,并對(duì)每個(gè)小模塊的設(shè)計(jì)進(jìn)行了介紹。 第4章項(xiàng)目具體實(shí)現(xiàn)項(xiàng)目具體實(shí)現(xiàn)項(xiàng)目實(shí)現(xiàn)文件文本模塊該模塊主要細(xì)化為文件模塊、文本模塊。文本模塊圖STYLEREF1\s5.SEQ圖\*ARABIC\s11文件模塊該模塊主要實(shí)現(xiàn)的是文件內(nèi)容查看、還有一些常見的文本修改。文本內(nèi)容的查看主要依靠的是QT的QTextEdit控件,通過我們對(duì)文件的選中發(fā)送信號(hào)來發(fā)送文件地址,在文本展示的類接受到這一信號(hào)時(shí)打開對(duì)應(yīng)的文件,并按行讀取并同時(shí)將文件內(nèi)容寫入QTextEdit中。由于QTextEdit本身就是一個(gè)支持文本編輯的控件,我們一些常規(guī)的文本操作均可采用QTextEdit自帶的方法來優(yōu)化實(shí)現(xiàn)。其中一些在QT中實(shí)現(xiàn)較為復(fù)雜的文本操作,我們也可以采用shell腳本來簡化文本操作流程。以下腳本就實(shí)現(xiàn)了對(duì)文件行的替換:#!/bin/basharray=($*)if[$#-eq2];then sed-i"$1{x;p;x}"$2elif[$#-le1];then echo"error:Insufficientnumberofparameters"else content=$2 i=3 while[$i-lt$#] do content=$content''${array[$i-1]} leti++ done echo$content sed-i"$1c$content"${array[$#-1]}fi腳本使用sed命令來對(duì)文件內(nèi)容進(jìn)行操作。該腳本需要傳入至少兩個(gè)參數(shù),第一個(gè)參數(shù)用來尋找待修改的行,第二個(gè)即后續(xù)參數(shù)參數(shù)則指定了待修改的文件內(nèi)容,最后一個(gè)參數(shù)用于指定待修改的文件。文件結(jié)構(gòu)模塊圖STYLEREF1\s5.SEQ圖\*ARABIC\s12文件結(jié)構(gòu)欄圖STYLEREF1\s5.SEQ圖\*ARABIC\s13文件結(jié)構(gòu)菜單圖STYLEREF1\s5.SEQ圖\*ARABIC\s14顯示項(xiàng)目結(jié)構(gòu)部分代碼如下:這部分代碼對(duì)項(xiàng)目結(jié)構(gòu)導(dǎo)入時(shí)進(jìn)行了初始化的操作,通過對(duì)項(xiàng)目配置文件信息的讀取來創(chuàng)建對(duì)應(yīng)的項(xiàng)目結(jié)構(gòu)。當(dāng)獲取到新項(xiàng)目時(shí),該模塊會(huì)首先讀取項(xiàng)目下以.txt為后綴的項(xiàng)目配置文件,并讀取文件中的項(xiàng)目路徑、是否攜帶腳本、腳本路徑以及源文件路徑下的文件名等信息。每當(dāng)讀取到對(duì)應(yīng)的文件名,便初始化一個(gè)item并將文件名賦值給這個(gè)item。//初始化樹voidProjectStructure::treeInit(QStringfilepath){if(filepath==""){qDebug()<<"未導(dǎo)入文件";return;}qDebug()<<"初始化樹";TextManagetext;FileManagefile;//獲取項(xiàng)目名QStringprojectname=file.readForRow(filepath,1);QStringprojectpath=file.readForRow(filepath,3);qDebug()<<projectpath;//獲取配置文件名QStringconfigname=projectname+".txt";//獲取項(xiàng)目結(jié)構(gòu)QStringprojectstruct=file.readForRow(filepath,7);//根據(jù)項(xiàng)目結(jié)構(gòu)模式生成對(duì)應(yīng)的樹QTreeWidgetItem*projecttree=newQTreeWidgetItem(ui->tree);projecttree->setText(0,projectpath);QTreeWidgetItem*config=newQTreeWidgetItem(projecttree);config->setText(0,configname);QTreeWidgetItem*source=newQTreeWidgetItem(projecttree);source->setText(0,"source");if(projectstruct=="0"){//不創(chuàng)建腳本目錄//讀取配置文件中各目錄下信息QStringsourcefiles=file.readForRow(filepath,9);QStringListsourcelist=text.strSplit(sourcefiles,"");foreach(QStringsourcefile,sourcelist){QTreeWidgetItem*srcfile=newQTreeWidgetItem(source);srcfile->setText(0,sourcefile);}}elseif(projectstruct=="1"){//創(chuàng)建腳本目錄QTreeWidgetItem*script=newQTreeWidgetItem(projecttree);script->setText(0,"script");//讀取配置文件中各目錄下信息QStringsourcefiles=file.readForRow(filepath,9);QStringListsourcelist=text.strSplit(sourcefiles,"");foreach(QStringsourcefile,sourcelist){QTreeWidgetItem*srcfile=newQTreeWidgetItem(source);srcfile->setText(0,sourcefile);}//讀取配置文件中各目錄下信息QStringscriptfiles=file.readForRow(filepath,11);QStringListscriptlist=text.strSplit(scriptfiles,"");foreach(QStringscriptfile,scriptlist){QTreeWidgetItem*scrfile=newQTreeWidgetItem(script);scrfile->setText(0,scriptfile);}}else{//異常報(bào)錯(cuò)}}右鍵菜單的相關(guān)操作所對(duì)應(yīng)的菜單事件,新建項(xiàng)目會(huì)調(diào)用自定義的創(chuàng)建項(xiàng)目類打開創(chuàng)建項(xiàng)目的界面執(zhí)行對(duì)應(yīng)操作;導(dǎo)入項(xiàng)目則是調(diào)用文件資源管理器,打開對(duì)應(yīng)的項(xiàng)目配置文件,讀取信息導(dǎo)入文件結(jié)構(gòu);關(guān)閉所有項(xiàng)目則是清空文件結(jié)構(gòu)樹下的所有節(jié)點(diǎn)。//右擊界面的菜單//新建項(xiàng)目voidProjectStructure::createProject(){//調(diào)用創(chuàng)建項(xiàng)目對(duì)應(yīng)的類ProjectCreate*newproject=newProjectCreate();newproject->setWindowModality(Qt::ApplicationModal);newproject->show();connect(newproject,SIGNAL(initTree(QString)),this,SLOT(treeInit(QString)));}//導(dǎo)入項(xiàng)目voidProjectStructure::importProject(){//打開資源管理器//獲取文件路徑并在其中查詢文件QStringfilepath=QFileDialog::getOpenFileName(this,tr("導(dǎo)入項(xiàng)目"),"/home",tr("Images(*.txt)"));//文件格式未定qDebug()<<filepath;//通過該文件來讀取項(xiàng)目的配置文件//根據(jù)配置文件信息生成對(duì)應(yīng)的樹treeInit(filepath);}//關(guān)閉所有項(xiàng)目voidProjectStructure::closeAllProject(){//刪除treewidget中的所有節(jié)點(diǎn)deleteAll();}以下是菜單事件響應(yīng)的設(shè)計(jì),首先自定義菜單的基本內(nèi)容,根據(jù)右擊后的pos來判斷選中的菜單級(jí)別(若當(dāng)前item為空則調(diào)起主界面菜單,下層則根據(jù)對(duì)item父節(jié)點(diǎn)判斷層級(jí),調(diào)用不同的菜單),再利用信號(hào)與槽,將信號(hào)與事件一一綁定。……//顯示菜單voidProjectStructure::showMenu(constQPoint&pos){QMenu*menu=newQMenu(ui->tree);//獲取當(dāng)前被選中的itemQTreeWidgetItem*item=ui->tree->itemAt(pos);if(item==nullptr){//空白處點(diǎn)擊,調(diào)用主界面菜單mainMenuInit(menu);}else{//根據(jù)父節(jié)點(diǎn)判斷層級(jí),調(diào)用不同的菜單QTreeWidgetItem*parentitem=item->parent();if(parentitem==nullptr){//頂層文件夾,調(diào)用項(xiàng)目菜單projectMenuInit(menu);}elseif(parentitem->parent()==nullptr){//第二層文件夾,調(diào)用目錄菜單folderMenuInit(menu);}else{//調(diào)用文件菜單fileMenuInit(menu);}}menu->exec(QCursor::pos());//執(zhí)行完畢刪除菜單deletemenu;}//右鍵菜單(主界面項(xiàng)目功能文件)//主界面菜單//選項(xiàng):載入項(xiàng)目、新建項(xiàng)目、關(guān)閉所有項(xiàng)目voidProjectStructure::mainMenuInit(QMenu*menu){QAction*action1=newQAction("載入項(xiàng)目");QAction*action2=newQAction("新建項(xiàng)目");QAction*action3=newQAction("關(guān)閉所有項(xiàng)目");menu->addAction(action1);menu->addAction(action2);menu->addAction(action3);//綁定事件connect(action1,SIGNAL(triggered()),this,SLOT(importProject()));connect(action2,SIGNAL(triggered()),this,SLOT(createProject()));connect(action3,SIGNAL(triggered()),this,SLOT(closeAllProject()));}……調(diào)試模塊該模塊主要細(xì)化為調(diào)試模塊、斷點(diǎn)模塊。調(diào)試模塊以下是調(diào)試文件的一些常規(guī)操作,包括:編譯文件、進(jìn)入調(diào)試、開始調(diào)試、腳本調(diào)試等。編譯文件是采用自定義的腳本類調(diào)用對(duì)應(yīng)的編譯文件腳本,根據(jù)輸入的信息,生成對(duì)應(yīng)的Makefile文件,再使用make命令調(diào)用Makefile生成待調(diào)試信息的可執(zhí)行文件,最后使用makeclean以及rm命令對(duì)中間文件執(zhí)行刪除操作。其他操作均是采用QProcess下的write接口將gdb命令寫入當(dāng)前的調(diào)試進(jìn)程,并監(jiān)控調(diào)試過程中的輸出。//編譯文件voidMyDebug::compileFiles(QStringprojectpath,QStringconfigpath){FileManagemanage;QStringListcommand;command.append(projectpath);command.append(manage.readForRow(configpath,1));command.append(manage.readForRow(configpath,15));command.append(manage.readForRow(configpath,9));Shellshell;shell.doShell("../Shell/make.sh",command);}//進(jìn)入調(diào)試voidMyDebug::debugStart(QStringconfigpath){FileManagemanage;QStringcommand;//進(jìn)入調(diào)試command="gdb"+manage.readForRow(configpath,3)+"/source/"+manage.readForRow(configpath,1);debug_process->write(command.toUtf8()+'\n');}//開始調(diào)試voidMyDebug::runDebug(){QStringrun_cmd;run_cmd="run";debug_process->write(run_cmd.toUtf8()+'\n');}//單步調(diào)試voidMyDebug::stepDebug(){QStringcommand;//進(jìn)入調(diào)試command="next";debug_process->write(command.toUtf8()+'\n');}//腳本調(diào)試voidMyDebug::scriptDebug(QStringscriptpath){QStringscript=QDir(scriptpath).absolutePath();QStringcommand;//進(jìn)入調(diào)試command="source"+script;debug_process->write(command.toUtf8()+'\n');}//結(jié)束調(diào)試voidMyDebug::debugOver(){QStringcommand;//結(jié)束調(diào)試command="quit";debug_process->write(command.toUtf8()+'\n');}斷點(diǎn)模塊該模塊需要實(shí)現(xiàn)斷點(diǎn)的添加與刪除、斷點(diǎn)的禁用與啟用、設(shè)置臨時(shí)斷點(diǎn)等功能。以下是一些斷點(diǎn)操作的代碼:該部分與調(diào)試過程中的主體功能實(shí)現(xiàn)相同,也是通過調(diào)用QProcess下的write接口將gdb命令寫入當(dāng)前的調(diào)試進(jìn)程,并監(jiān)控調(diào)試過程中的輸出的方式來實(shí)現(xiàn)。//打斷點(diǎn)voidMyDebug::breakPoint(QStringfilepath,QStringrow){//編寫命令QStringcommand;command="break"+filepath+":"+row;qDebug()<<__FILE__<<":"<<__FUNCTION__<<":"<<__LINE__<<""<<filepath;qDebug()<<command.toUtf8();//調(diào)用命令debug_process->write(command.toUtf8()+'\n');}//刪除斷點(diǎn)voidMyDebug::deletePoint(QStringnum){//編寫命令QStringcommand;command="delete"+num;//調(diào)用命令debug_process->write(command.toUtf8()+'\n');}//刪除所有斷點(diǎn)voidMyDebug::deleteAllPoints(){//編寫命令QStringcommand;command="delete";//調(diào)用命令debug_process->write(command.toUtf8()+'\n');}//禁用斷點(diǎn)voidMyDebug::disablePoint(QStringnum){//編寫命令QStringcommand;command="disable"+num;//調(diào)用命令debug_process->write(command.toUtf8()+'\n');}//啟用斷點(diǎn)voidMyDebug::enablePoint(QStringnum){//編寫命令QStringcommand;command="enable"+num;//調(diào)用命令debug_process->write(command.toUtf8()+'\n');}信息模塊該模塊主要細(xì)化為輸出模塊、變量模塊、線程信息模塊、進(jìn)程監(jiān)視模塊。輸出模塊圖STYLEREF1\s5.SEQ圖\*ARABIC\s15輸出模塊這一塊的實(shí)現(xiàn)較為簡單,較為有難度的是信息的獲取,可以通過QT的信號(hào)與槽功能,使用readProcess以及finishedProcess兩個(gè)槽函數(shù)進(jìn)行監(jiān)測,一旦調(diào)試結(jié)束即可獲取調(diào)試輸出信息。至于信息的復(fù)制與清空通過QTextEdit自帶的方法即可實(shí)現(xiàn)。這一模塊的顯示主要靠QT中的QTextEdit控件,通過不同的信號(hào)與槽獲取到不同的信息,并將信息寫入QTextEdit中。變量模塊該模塊需要實(shí)現(xiàn)對(duì)變量賦值或者修改變量的值,實(shí)時(shí)顯示變量信息的功能,變量的信息主要包括:變量的名稱、值、變量類型、內(nèi)存地址等。該模塊的實(shí)現(xiàn)也主要依托于腳本的調(diào)用,QT設(shè)計(jì)方面也與斷點(diǎn)模塊類似單獨(dú)設(shè)計(jì)一個(gè)界面,同樣通過QTreeWidget來折疊變量的詳細(xì)信息。線程信息模塊該模塊需要實(shí)現(xiàn)查看當(dāng)前線程調(diào)用堆棧、切換當(dāng)前線程到指定堆棧的功能。該模塊與變量模塊的設(shè)計(jì)思路一致。進(jìn)程監(jiān)視模塊該模塊需要實(shí)現(xiàn)監(jiān)視當(dāng)前調(diào)試中進(jìn)行的內(nèi)存信息、進(jìn)程id、信號(hào)等功能。該模塊的功能實(shí)現(xiàn)需要使用Linux下的命令,在調(diào)試可執(zhí)行文件時(shí)使用ps、top等命令查詢進(jìn)程信息,并通過grep、awk等命令通過可執(zhí)行文件名(即進(jìn)程名)對(duì)進(jìn)程信息進(jìn)行篩選。管理模塊該模塊主要細(xì)化為視圖模塊、腳本管理模塊、終端模塊。視圖模塊要實(shí)現(xiàn)這一模塊需要一個(gè)初始化文件記錄基礎(chǔ)的配置模式,還需要以一個(gè)界面配置文件來記錄或修改用戶的界面配置規(guī)則。在QT中讀入文件信息,使用布局類對(duì)界面進(jìn)行重新布局。由于每一個(gè)每一個(gè)模塊的功能都是獨(dú)立的只需要一個(gè)文件記錄每一模塊的顯示情況,在工具打開時(shí)讀取文件,對(duì)每一模塊的窗體按照文件內(nèi)容分別顯示或隱藏即可。腳本管理模塊該模塊將自定義一個(gè)腳本類,所有的功能腳本將從此處引入,在該類中可以將所有的功能腳本定義為該類的成員變量,并針對(duì)各模塊的不同的功能特性設(shè)計(jì)與之對(duì)應(yīng)的功能函數(shù),這樣不但加強(qiáng)了對(duì)腳本的管理,減少了腳本問題對(duì)程序主體產(chǎn)生的影響,還方便各模塊腳本的引用,使各模塊功能的實(shí)現(xiàn)更加的豐富。這個(gè)腳本類還細(xì)化為了調(diào)試腳本類和終端腳本類。這兩個(gè)腳本類主要都是通過QProcess對(duì)命令進(jìn)行調(diào)用,調(diào)試腳本類中主要調(diào)用的是GDB中的命令,調(diào)用時(shí)通過信號(hào)與槽來連接,而終端腳本主要服務(wù)于文件編譯以及進(jìn)入調(diào)試這一步驟,實(shí)現(xiàn)的過程與調(diào)試腳本類似。該模塊的主體實(shí)現(xiàn)代碼如下:……//無需參數(shù)直接依靠腳本文件位置調(diào)用腳本boolShell::doShell(QStringshellPath){intret=true;splitName(shellPath);process->setWorkingDirectory(dirname);QStringpath="bash./"+filename;process->start(path);process->waitForFinished();qDebug()<<process->readAllStandardOutput();returnret;}//重載一個(gè)帶參的shell腳本函數(shù),第暫不考慮使用root權(quán)限的情況boolShell::doShell(QStringshellPath,QStringListcommand){intret=true;qDebug()<<ispathExist(shellPath);splitName(shellPath);process->setWorkingDirectory(dirname);QStringpath="bash./"+filename;QStringstr=command.join("");qDebug()<<"shell.cpp37:"<<str<<""<<path;process->start(path+""+str);process->waitForFinished();returnret;}……上述代碼首先會(huì)對(duì)傳入的路徑進(jìn)行切割處理,接著設(shè)置對(duì)應(yīng)的工作路徑并通過字符串的拼接組裝出腳本運(yùn)行命令,最后使用QProcess下的start接口調(diào)用該命令實(shí)現(xiàn)腳本的調(diào)用。需要注意的是工作路徑的變化,前期由于沒有考慮到工作路徑的變化導(dǎo)致無法獲取到對(duì)應(yīng)的調(diào)試文件。終端模塊圖STYLEREF1\s5.SEQ圖\*ARABIC\s16終端菜單圖STYLEREF1\s5.SEQ圖\*ARABIC\s17創(chuàng)建新終端要該模塊功能,我們需要使用QTabWidget類創(chuàng)建一個(gè)終端類,他的新建以及關(guān)閉當(dāng)前終端的操作分別對(duì)應(yīng)QTabWidget中新建頁以及刪除頁的操作,而每個(gè)頁所顯示的內(nèi)容就是單獨(dú)的終端界面類。終端界面是由一個(gè)QTextBrowser以及一個(gè)QLineEdit控件組成,其中QTextBrowser用于顯示終端的內(nèi)容輸出,QLineEdit則用于用戶輸入命令,這兩個(gè)控件終端界面類中通過信號(hào)與槽進(jìn)行連接,在接收到QLineEdit處按下回車后清空QLineEdit,并將其中的內(nèi)容使用QProcess進(jìn)行調(diào)用,由一個(gè)監(jiān)測輸出的槽函數(shù)在接收到輸出后打印到QTextBrowser之中。這一模塊的設(shè)計(jì)思路腳本管理模塊基本一致。內(nèi)容方面的讀取均是通過信號(hào)與槽讀取readProcess以及finishProcess信息。但是細(xì)節(jié)方面的注意點(diǎn)比較多,比如用戶以及狀態(tài)的切換需要注意標(biāo)識(shí)符的變化,此處采用了兩個(gè)標(biāo)識(shí)符form以及l(fā)astform對(duì)當(dāng)前模式和上一模式進(jìn)行記錄,當(dāng)用戶模式切換時(shí)對(duì)form進(jìn)行更新,當(dāng)使用在終端模式下使用exit命令或gdb模式下使用quit命令退出當(dāng)前模式時(shí)讀取lastform并賦值給form,主要代碼設(shè)計(jì)如下:……connect(clearwidget,SIGNAL(triggered()),this,SLOT(clearTerminal()));connect(create,SIGNAL(triggered()),this,SLOT(createTerminal()));connect(closewidget,SIGNAL(triggered()),this,SLOT(closeTerminal()));……voidTerminalWidget::on_lineEdit_returnPressed(){QStringstr=ui->lineEdit->text();qDebug()<<"form="<<form;//根據(jù)模式初始化內(nèi)容if(form==0){//普通用戶模式ui->textBrowser->append("<fontcolor=\"green\">Linux:~$</font>"+str);}elseif(form==1){//root用戶模式ui->textBrowser->append("<fontcolor=\"red\">Linux:~#</font>"+str);}elseif(form==2){ui->textBrowser->append("(gdb)"+str);}else{//類型異常qDebug()<<"formerror";}if(!QString::compare(str,"clear")){//調(diào)用清空終端函數(shù)clearTerminal();qDebug()<<"命令行清空終端";}if(form==0&&(QString::compare(str,"exit")==0)){//不執(zhí)行該操作ui->lineEdit->clear();ui->textBrowser->append("<fontcolor=\"red\">Disabledinnormalusermode!</font>");return;}QStringcommand=getCommand(str);if(!QString::compare(command,"gdb")){//調(diào)試模式//只在切入調(diào)試模式前記錄上一模式lastform=form;form=2;}elseif(!QString::compare(command,"su")){//切入root用戶模式form=1;}elseif(form==1&&(QString::compare(str,"exit")==0)){//退出root模式切入普通用戶form=0;}elseif(form==2&&(QString::compare(str,"quit")==0)){//退出調(diào)試form=lastform;}m_process->write(ui->lineEdit->text().toLocal8Bit()+'\n');ui->lineEdit->clear();}voidTerminalWidget::readBashStandardOutputInfo(){QByteArrayout=m_process->readAllStandardOutput();if(!out.isEmpty())ui->textBrowser->append(QString::fromLocal8Bit(out));}voidTerminalWidget::readBashStandardErrorInfo(){QByteArrayout=m_process->readAllStandardError();if(!out.isEmpty())ui->textBrowser->append(QString::fromLocal8Bit(out));}本章小結(jié)這一章節(jié)主要介紹了Linux下的GDB可視化工具各功能模塊的實(shí)現(xiàn)過程,以及設(shè)計(jì)過程中遇到的問題以及解決方式。 第5章項(xiàng)目測試項(xiàng)目測試在上一章中主要介紹了系統(tǒng)的詳細(xì)設(shè)計(jì)過程。在本章內(nèi)容中主要對(duì)系統(tǒng)程序進(jìn)行測試與驗(yàn)證。測試目的為了驗(yàn)證項(xiàng)目能夠按照規(guī)格說明書的要求正常工作,確保該項(xiàng)目達(dá)到預(yù)期的質(zhì)量標(biāo)準(zhǔn),并滿足用戶的需求和期望,同時(shí)通過測試發(fā)現(xiàn)項(xiàng)目中存在的缺陷和問題,即時(shí)修正并提高軟件質(zhì)量,將對(duì)本次的可視化工具項(xiàng)目進(jìn)行項(xiàng)目測試。測試計(jì)劃本次將采用黑盒測試的方式對(duì)該可視化工具的測試進(jìn)行檢測,將會(huì)對(duì)該可視化工具的主界面、文件文本模塊、調(diào)試模塊、信息模塊這幾個(gè)主要模塊及其細(xì)化的小模塊進(jìn)行功能測試。同時(shí)為了項(xiàng)目的健壯性以及穩(wěn)定性,同時(shí)還進(jìn)行了對(duì)應(yīng)的非功能性測試。由于本項(xiàng)目是Linux平臺(tái)下的GDB可視化工具,所以本次測試選取的測試環(huán)境為Ubuntu20.04.項(xiàng)目測試功能性測試主界面功能測試本節(jié)主要對(duì)主界面的UI進(jìn)行測試。測試該可視化工具工具打開后是否能正常顯示,菜單欄、按鈕等控件等是否能正常響應(yīng)。表STYLEREF1\s6.SEQ表\*ARABIC\s11主界面功能測試表測試用例標(biāo)記cs001項(xiàng)目名稱基于Linux平臺(tái)的GDB可視化工具測定模塊名主界面測試用例描述測試主界面交互是否異常測試要求前置條件無測試樣例如下:表STYLEREF1\s6.SEQ表\*ARABIC\s12主界面功能測試樣例編號(hào)測試項(xiàng)測試操作測試預(yù)期結(jié)果測試具體操作所得實(shí)際結(jié)果1主界面打開該項(xiàng)目,看初始界面是否符合顯示標(biāo)準(zhǔn),以及按鈕、菜單欄等是否能正常響應(yīng)。界面所有模塊均顯示正常。菜單欄、按鈕均能正常響應(yīng)。打開可視化工具文件結(jié)構(gòu)、菜單欄、工具欄、文本編輯、下邊欄等模塊均正常顯示單擊菜單欄或按鈕菜單欄能正常展開菜單項(xiàng),按鈕均能正常響應(yīng)。文件文本模塊功能測試本節(jié)主要對(duì)文本文件模塊的主要功能進(jìn)行測試,包括文件結(jié)構(gòu)的顯示、文件的打開、保存等。確保文件結(jié)構(gòu)和文件內(nèi)容的正常顯示,以及文件相關(guān)操作的正常響應(yīng)。表STYLEREF1\s6.SEQ表\*ARABIC\s13文件文本模塊測試表測試用例標(biāo)記cs002項(xiàng)目名稱基于Linux平臺(tái)的GDB可視化工具測定模塊名文件文本模塊測試用例描述測試文件模塊以及文本模塊測試要求前置條件用戶進(jìn)入該可視化工具并能正常操作該工具測試樣例如下:表STYLEREF1\s6.SEQ表\*ARABIC\s14文件文本模塊測試樣例編號(hào)測試項(xiàng)測試操作測試預(yù)期結(jié)果測試具體操作所得實(shí)際結(jié)果1文件模塊右鍵文件結(jié)構(gòu)模塊,嘗試菜單中的各項(xiàng)操作,確保菜單中的各項(xiàng)均能正常使用。單擊菜單中的創(chuàng)建項(xiàng)目菜單項(xiàng)后能打開創(chuàng)建項(xiàng)目界面。輸入項(xiàng)目名、項(xiàng)目路徑等后,創(chuàng)建項(xiàng)目,并在文件結(jié)構(gòu)模塊中顯示。單擊打開項(xiàng)目菜單項(xiàng)后,打開資源管理器,選中項(xiàng)目配置文件后,項(xiàng)目能正常顯示在文件結(jié)構(gòu)模塊中。單擊關(guān)閉所有項(xiàng)目后,清空文件結(jié)構(gòu)模塊的所有內(nèi)容。單擊文件另存為菜單項(xiàng),輸入另存為路徑以及文件格式后,在對(duì)應(yīng)路徑下創(chuàng)建該文件。右擊打開文件編輯模塊的菜單后,選中創(chuàng)建項(xiàng)目選項(xiàng),打開創(chuàng)建項(xiàng)目界面。輸入正確的項(xiàng)目名以及項(xiàng)目路徑,若需添加腳本文件,勾選添加腳本文件選項(xiàng)并輸入腳本文件名。點(diǎn)擊確認(rèn)按鈕,創(chuàng)建項(xiàng)目。輸入的文件路徑下創(chuàng)建了對(duì)應(yīng)的項(xiàng)目路徑,且項(xiàng)目的結(jié)構(gòu)與創(chuàng)建的過程一致。此外,文件結(jié)構(gòu)模塊處顯示該文件的項(xiàng)目結(jié)構(gòu)。續(xù)表6.4編號(hào)測試項(xiàng)測試操作測試預(yù)期結(jié)果測試具體操作所得實(shí)際結(jié)果右擊打開文件編輯模塊的菜單后,選中打開項(xiàng)目選項(xiàng),在文件資源管理器中選擇所需打開項(xiàng)目的配置文件。文件結(jié)構(gòu)模塊處顯示該文件的項(xiàng)目結(jié)構(gòu)。右擊打開文件編輯模塊的菜單后,選中關(guān)閉所有項(xiàng)目。文件結(jié)構(gòu)模塊處顯示的項(xiàng)目結(jié)構(gòu)內(nèi)容全部清除。點(diǎn)擊菜單欄選中另存為選項(xiàng),選擇文件路徑后選擇文件的格式,點(diǎn)擊確認(rèn)按鈕。選中的路徑下存在該文件,且該文件的格式與另存為操作過程中選擇的一致。2文本模塊代碼編輯器模塊能正常的顯示文件的內(nèi)容。在左側(cè)文件結(jié)構(gòu)模塊任選一個(gè)文件,雙擊打開,看代碼編輯模塊是否顯示文件內(nèi)容,且文件內(nèi)容是否與源文件的內(nèi)容一致。在文件結(jié)構(gòu)模塊打開一個(gè)項(xiàng)目,選中該項(xiàng)目中的任意一個(gè)文件,雙擊,打開源文件進(jìn)行比對(duì)。切換另一個(gè)文件再次嘗試。每個(gè)文件的內(nèi)容可以正常顯示,且每個(gè)文件的內(nèi)容均與源文件一致。調(diào)試模塊功能
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年度寧國市事業(yè)單位統(tǒng)一公開招聘工作人員16名參考考試題庫及答案解析
- 2026年江西生物科技職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測試備考試題及答案詳細(xì)解析
- 2026年貴州食品工程職業(yè)學(xué)院單招綜合素質(zhì)考試備考試題含詳細(xì)答案解析
- 2026年武漢城市職業(yè)學(xué)院單招綜合素質(zhì)考試參考題庫含詳細(xì)答案解析
- 2026年河南檢察職業(yè)學(xué)院單招綜合素質(zhì)筆試備考題庫含詳細(xì)答案解析
- 2026年江蘇商貿(mào)職業(yè)學(xué)院單招職業(yè)技能考試備考題庫含詳細(xì)答案解析
- 2026年云南現(xiàn)代職業(yè)技術(shù)學(xué)院單招職業(yè)技能考試模擬試題含詳細(xì)答案解析
- 2026年廣西自然資源職業(yè)技術(shù)學(xué)院單招職業(yè)技能考試備考試題含詳細(xì)答案解析
- 2026年棗莊科技職業(yè)學(xué)院單招綜合素質(zhì)筆試備考題庫含詳細(xì)答案解析
- 2026年湖南汽車工程職業(yè)學(xué)院單招職業(yè)技能考試備考試題含詳細(xì)答案解析
- 《人民調(diào)解員培訓(xùn)》課件
- 出租車春節(jié)應(yīng)急預(yù)案
- 華羅庚數(shù)學(xué)課本六年級(jí)
- DB12-T885-2019-植物提取物中原花青素的測定紫外-可見分光光度法-天津市
- 董氏奇穴針灸學(xué)(楊維杰)
- 日間手術(shù)病人術(shù)前的護(hù)理
- 1000張隱患辨識(shí)圖
- 智能水務(wù)管理基礎(chǔ)知識(shí)單選題100道及答案
- 《職業(yè)院校與本科高校對(duì)口貫通分段培養(yǎng)協(xié)議書》
- 危巖帶治理工程初步設(shè)計(jì)計(jì)算書
- 精神病學(xué)考試重點(diǎn)第七版
評(píng)論
0/150
提交評(píng)論