999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于國產(chǎn)平臺(tái)的智能跟蹤調(diào)試技術(shù)①

2019-08-22 02:30:40張大方胡先浪王立杰
關(guān)鍵詞:調(diào)試程序

張大方, 胡先浪, 王立杰

(江蘇自動(dòng)化研究所,連云港 222006)

引言

軟件調(diào)試是軟件開發(fā)流程中不可或缺的重要環(huán)節(jié),是為了能在開發(fā)階段及時(shí)發(fā)現(xiàn)程序中的錯(cuò)誤并修正.根據(jù)國內(nèi)外研發(fā)人員的經(jīng)驗(yàn),軟件的調(diào)試時(shí)間一般能夠占到研發(fā)時(shí)間總量的一半以上[1]. 正所謂“工欲善其事,必先利其器”,集成開發(fā)環(huán)境便是軟件調(diào)試的“利器”[2]. “利器”的易用性及功能的全面性不僅僅會(huì)影響國產(chǎn)平臺(tái)下軟件調(diào)試的效率,同時(shí)也會(huì)在一定程度上影響國產(chǎn)軟硬件的規(guī)模化應(yīng)用進(jìn)程.

Eclipse是一個(gè)開源的、可擴(kuò)展的、用Java語言實(shí)現(xiàn)的開發(fā)平臺(tái),就其本身而言,它不是一個(gè)一整塊的程序,而是一個(gè)包含了插件載入器、被數(shù)百個(gè)甚至更多的插件所包圍的小內(nèi)核[3]. 該內(nèi)核為插件的加載和運(yùn)行提供了環(huán)境,每個(gè)插件則以結(jié)構(gòu)化的方式在整體中提供服務(wù). 因此,只需要通過增刪插件,就可以根據(jù)需求定制所需的調(diào)試環(huán)境[4].

CDT(C/C ++ Development Toolkit)是Eclipse平臺(tái)下一組用來開發(fā)、調(diào)試C/C++程序的插件,使用CDT插件可以開發(fā)、調(diào)試用C/C++編程語言實(shí)現(xiàn)的應(yīng)用程序[5]. 但是以該插件為代表的傳統(tǒng)調(diào)試方式尚存在一些不足,例如:

(1) 對(duì)遠(yuǎn)程調(diào)試等常見的調(diào)試方式支持有限,在發(fā)起調(diào)試時(shí)往往需要開發(fā)人員手動(dòng)完成填寫IP地址和端口號(hào)、上傳待調(diào)試程序、啟動(dòng)調(diào)試服務(wù)器等工作,調(diào)試準(zhǔn)備工作繁瑣;

(2) 對(duì)多平臺(tái)編譯工具鏈的支持有限,當(dāng)開發(fā)環(huán)境下存在多個(gè)編譯工具鏈時(shí),需要開發(fā)人員手動(dòng)選擇與該工具鏈對(duì)應(yīng)的調(diào)試工具和動(dòng)態(tài)鏈接庫的搜索路徑等,不支持一鍵式調(diào)試;

(3) 對(duì)錯(cuò)誤定位的支持有限,開發(fā)人員為提高調(diào)試效率往往會(huì)設(shè)置斷點(diǎn)并讓一部分代碼自動(dòng)執(zhí)行,在傳統(tǒng)的調(diào)試方式下如果這部分代碼在自動(dòng)執(zhí)行的過程出現(xiàn)異常,則需要重新設(shè)置斷點(diǎn)并再次發(fā)起調(diào)試,嚴(yán)重遲滯了調(diào)試進(jìn)度;

(4) 對(duì)國產(chǎn)軟硬件平臺(tái)的支持有限,社區(qū)開源的Eclipse集成開發(fā)環(huán)境僅對(duì)X86平臺(tái)提供支持,國產(chǎn)系統(tǒng)廠商默認(rèn)提供的集成開發(fā)環(huán)境則綁定了各自的軟硬平臺(tái),對(duì)其它國產(chǎn)平臺(tái)的支持力度不足,不具備通用性和易用性.

因此,針對(duì)國產(chǎn)平臺(tái)飛速發(fā)展的現(xiàn)狀和CDT插件的上述不足之處,本文面向龍芯、申威等國產(chǎn)處理器以及中標(biāo)麒麟、深度、JARI-Works等國產(chǎn)操作系統(tǒng),設(shè)計(jì)開發(fā)了一個(gè)支持國產(chǎn)平臺(tái)并提供智能跟蹤調(diào)試功能的功能插件,增強(qiáng)了國產(chǎn)平臺(tái)下的調(diào)試功能,大大提高了調(diào)試效率.

1 反向調(diào)試技術(shù)

反向調(diào)試技術(shù)[6]是實(shí)現(xiàn)程序智能跟蹤與調(diào)試的基礎(chǔ),只有具備了能在程序執(zhí)行的整個(gè)歷史中來回穿梭的能力,才有可能精確定位到程序故障發(fā)生的位置.

目前的主流調(diào)試器GDB除了提供傳統(tǒng)的單步執(zhí)行調(diào)試的方式以外,在GDB 7版本之后,也提供了反向調(diào)試的功能,能夠通過reverse-next、reverse-nexti等指令對(duì)程序指令執(zhí)行歷史進(jìn)行保存與回溯[7]. GDB的反向調(diào)試功能原理如圖1所示.

圖1 GDB反向調(diào)試示意圖

在圖1中可以看到GDB對(duì)每條指令都加入了斷點(diǎn)(int 3),然后在斷點(diǎn)發(fā)生時(shí)差分保存被調(diào)試應(yīng)用程序的寄存器與內(nèi)存狀態(tài). 由于對(duì)每條指令都加入了斷點(diǎn),并在斷點(diǎn)處保存程序的運(yùn)行狀態(tài),因此可以保證最高的歷史調(diào)試精度. 但是,GDB實(shí)現(xiàn)反向調(diào)試功能的代價(jià)就是數(shù)據(jù)記錄將嚴(yán)重影響被調(diào)試程序的性能,極端情況下會(huì)使該程序的執(zhí)行速度下降數(shù)個(gè)數(shù)量級(jí),同時(shí)將導(dǎo)致記錄數(shù)據(jù)占用較大的磁盤空間.

2 Eclipse插件結(jié)構(gòu)

“萬物皆插件”是Eclipse平臺(tái)的基本設(shè)計(jì)理念.Eclipse的主要功能便是提供了一套明確定義了接口、類、方法的插件機(jī)制,使各種定制化的插件能夠無縫集成到該平臺(tái)中,方便了功能組件的研發(fā)[3].

插件(Plug-in)是該平臺(tái)中最小的功能單元,平臺(tái)下的每項(xiàng)功能都由一個(gè)或多個(gè)插件完成. 每個(gè)插件的行為由具體的代碼實(shí)現(xiàn)定義,依賴項(xiàng)和提供的服務(wù)則由MANIFEST.MF、plugin.xml等插件清單文件定義.這種架構(gòu)保證了插件僅在需要的時(shí)候被Eclipse載入,可以減少平臺(tái)啟動(dòng)時(shí)間和內(nèi)存消耗. 圖2展示了Eclipse平臺(tái)架構(gòu)的組織形式,可以看到該平臺(tái)提供的絕大多數(shù)功能(如Java開發(fā)、C/C++開發(fā)等)均以外圍插件(如JDT、CDT等)的形式予以實(shí)現(xiàn).

在開發(fā)人員啟動(dòng)Eclipse之后,平臺(tái)運(yùn)行時(shí)系統(tǒng)(Platform Runtime)將掃描默認(rèn)插件的存放目錄plugins和鏈接文件的存放目錄links,在注冊(cè)表中添加插件的相關(guān)信息,并緩存各個(gè)插件的數(shù)據(jù)信息. 在開發(fā)人員使用某個(gè)插件提供的功能服務(wù)時(shí),該插件才會(huì)被平臺(tái)運(yùn)行時(shí)系統(tǒng)激活并調(diào)入內(nèi)存,最后在使用結(jié)束的某個(gè)合適時(shí)機(jī)被清理. 擴(kuò)展點(diǎn)在Eclipse中作為一個(gè)松耦合的功能模塊廣泛使用,插件在插件清單中聲明擴(kuò)展點(diǎn),提供接口和相關(guān)類的最小集合供他人使用. 其他插件聲明該擴(kuò)展點(diǎn)的擴(kuò)展項(xiàng),實(shí)現(xiàn)合適的接口,并引用提供的類或基于提供的類進(jìn)行創(chuàng)建. CDT提供了許多擴(kuò)展點(diǎn)使用戶可以添加自定義功能,以符合用戶的需求[8].

圖2 Eclipse平臺(tái)架構(gòu)

3 智能跟蹤調(diào)試方案設(shè)計(jì)

在國產(chǎn)平臺(tái)上,由于GDB反向調(diào)試的架構(gòu)特定性[9],以及單指令中斷跟蹤的方式[10],導(dǎo)致其移植工作量巨大,而且性能開銷極大,因此不適合在國產(chǎn)平臺(tái)進(jìn)行直接移植使用. 有鑒于此,本文借鑒Visual Studio的IntelliTrace功能[11],提出了基于事件的反向調(diào)試的技術(shù)方案.

在基于事件的反向調(diào)試技術(shù)中,調(diào)試器不再維護(hù)一個(gè)連續(xù)執(zhí)行、連續(xù)變化的程序執(zhí)行歷史. 亦即不再提供單步后退、單步前進(jìn)等功能,而僅在程序運(yùn)行過程中對(duì)程序的運(yùn)行狀態(tài)在關(guān)鍵點(diǎn)進(jìn)行快照,提供對(duì)快照的管理以輔助開發(fā)人員定位程序錯(cuò)誤,開發(fā)人員無法對(duì)快照進(jìn)行單步后退或者單步前進(jìn)以查看單條指令或單行源碼執(zhí)行前后的程序狀態(tài),而只能跳躍式地在離散的快照之間穿梭. 這些快照的管理包括快照的存儲(chǔ)、快照的載入、在快照中前進(jìn)與后退,以及讀取快照存儲(chǔ)下來的程序狀態(tài),以確定程序的故障. 在功能上,這種方式類似于IntelliTrace的反向調(diào)試,其總體架構(gòu)如圖3所示. 在圖3中,插件首先通過通信模塊和本地或遠(yuǎn)程的調(diào)試服務(wù)器取得聯(lián)系,隨后實(shí)時(shí)獲取堆棧、系統(tǒng)調(diào)用、信號(hào)、事件等調(diào)試信息,最后通過UI視圖和GDB、CDT等后臺(tái)工具插件以圖形化的方式向開發(fā)人員顯示調(diào)試信息.

3.1 事件跟蹤模塊

在Linux操作系統(tǒng)下,應(yīng)用程序與系統(tǒng)環(huán)境之間的交互主要是通過系統(tǒng)調(diào)用與信號(hào),它們均會(huì)以超出應(yīng)用程序指令預(yù)期的方式改變程序的行為. 其中信號(hào)對(duì)應(yīng)了大部分程序運(yùn)行時(shí)的錯(cuò)誤,包括最常見的段錯(cuò)誤. 因此,記錄下相應(yīng)的事件,即可對(duì)相當(dāng)部分難以調(diào)試的軟件故障進(jìn)行回放調(diào)試,從而協(xié)助快速定位與解決故障. 基于事件的反向調(diào)試技術(shù)支持的事件如表1所示.

圖3 智能跟蹤調(diào)試工具總體架構(gòu)

表1 支持的事件列表

監(jiān)聽程序的系統(tǒng)調(diào)用與信號(hào),可以通過ptrace的PTRACE_SYSCALL以及PTRACE_GETSIGINFO等功能實(shí)現(xiàn). 一旦發(fā)生了對(duì)應(yīng)的系統(tǒng)調(diào)用與信號(hào),調(diào)試器即可獲取對(duì)應(yīng)的系統(tǒng)調(diào)用與信號(hào)的信息,并同時(shí)獲得被調(diào)試程序的狀態(tài),包括寄存器、堆、各個(gè)線程的調(diào)用棧與線程局部存儲(chǔ)等信息,并將其保存下來. 針對(duì)X11事件的監(jiān)控,由于XServer從硬件那里接收到所有輸入事件都會(huì)通知XRecord,因此當(dāng)需要監(jiān)控X事件時(shí),調(diào)試器只需把對(duì)應(yīng)的代碼掛到XRecord循環(huán)中. 只有系統(tǒng)一有輸入事件產(chǎn)生,XRecord接著就通過事件循環(huán)告訴調(diào)試器,調(diào)試器再利用實(shí)時(shí)截獲到的輸入事件進(jìn)行處理. 對(duì)于d-bus事件的監(jiān)控,由于所有的消息接口都來源于libdbus,調(diào)試器只要對(duì)d-bus收發(fā)函數(shù)通過PRELOAD的方式接管,即可對(duì)被調(diào)試程序的dbus事件進(jìn)行跟蹤調(diào)試.

3.2 運(yùn)行時(shí)內(nèi)存快照設(shè)計(jì)

在發(fā)生特定事件,收到信號(hào)和發(fā)起系統(tǒng)調(diào)用的時(shí)候,只有記錄完整的堆棧信息才能對(duì)程序進(jìn)行回溯. 考慮到性能開銷,本文設(shè)置了兩種記錄模式:

1) 轉(zhuǎn)儲(chǔ)模式:每個(gè)事件點(diǎn)發(fā)生的時(shí)候自動(dòng)暫停所有運(yùn)行的線程,記錄所有線程的調(diào)用棧信息,同時(shí)使用minidump方式轉(zhuǎn)儲(chǔ)指定的內(nèi)存數(shù)據(jù),記錄完成后自動(dòng)恢復(fù)所有線程(用戶基本感受不到程序被暫停過). 由于每次轉(zhuǎn)儲(chǔ)都有進(jìn)程切換,并且記錄的內(nèi)存數(shù)據(jù)跟程序的復(fù)雜性和設(shè)置的轉(zhuǎn)儲(chǔ)粒度相關(guān),程序越復(fù)雜或轉(zhuǎn)儲(chǔ)粒度越細(xì)致,記錄的內(nèi)存數(shù)據(jù)就越多,會(huì)導(dǎo)致被調(diào)試程序運(yùn)行變慢. 但是優(yōu)點(diǎn)是記錄了大量的內(nèi)存數(shù)據(jù),在回放的時(shí)候可以查看內(nèi)存數(shù)據(jù)(具體跟轉(zhuǎn)儲(chǔ)粒度有關(guān)).本文轉(zhuǎn)儲(chǔ)模式特點(diǎn)如表2所示.

2) 快速模式:每個(gè)事件點(diǎn)只記錄當(dāng)前發(fā)生事件的線程的調(diào)用棧里面每個(gè)棧幀的函數(shù)的參數(shù)、函數(shù)內(nèi)已知局部變量的值、errno等全局變量、用戶態(tài)所有寄存器值等,不轉(zhuǎn)儲(chǔ)內(nèi)存數(shù)據(jù). 優(yōu)點(diǎn)是記錄過程沒有線程切換,速度快. 缺點(diǎn)是不能查看應(yīng)用程序的全局變量的值和當(dāng)前發(fā)生事件點(diǎn)時(shí)刻的其它線程的調(diào)用棧信息.

表2 本文轉(zhuǎn)儲(chǔ)模式與coredump對(duì)比

3.3 調(diào)試服務(wù)器設(shè)計(jì)

在轉(zhuǎn)儲(chǔ)階段,調(diào)試器跟蹤被調(diào)試應(yīng)用程序記錄的跟蹤文件是調(diào)試器自定義的格式,GDB無法識(shí)別. 此外,調(diào)試器還要保證記錄階段和回放階段程序映射的內(nèi)存地址空間是同一個(gè)地址范圍. 原生的GDB無法支持該功能,因此還需要在GDB基礎(chǔ)上擴(kuò)展.

本文依據(jù)GDB Remote Serial Protocol實(shí)現(xiàn)一個(gè)RSP服務(wù)器[12,13],在RSP服務(wù)器里面啟動(dòng)記錄的進(jìn)程,用戶就可以用GDB連接到該服務(wù)器來進(jìn)行回放調(diào)試.該方法節(jié)省了開發(fā)調(diào)試器的時(shí)間,同時(shí)也可以讓熟悉GDB的用戶快速熟悉反向調(diào)試的用法,而且方便與集成開發(fā)環(huán)境里的插件進(jìn)行集成.

3.4 可視化調(diào)試插件設(shè)計(jì)

可視化調(diào)試插件包含以下4個(gè)部分:工程管理模塊、遠(yuǎn)程通信模塊、調(diào)試調(diào)度模塊和后臺(tái)調(diào)試器. 工程管理模塊負(fù)責(zé)獲取當(dāng)前待調(diào)試工程的具體信息,包括工具鏈類型、調(diào)試類型等. 如果工程采用的是交叉調(diào)試等模式時(shí),遠(yuǎn)程通信模塊會(huì)被調(diào)用,自動(dòng)建立與目標(biāo)機(jī)之間的通信連接,并收發(fā)本機(jī)和目標(biāo)機(jī)之間的通信報(bào)文. 通信發(fā)起模塊對(duì)Eclipse平臺(tái)和CDT插件提供的API進(jìn)行改寫,根據(jù)工程管理模塊提供的數(shù)據(jù)重新配置調(diào)試信息,并調(diào)用后臺(tái)調(diào)試器發(fā)起調(diào)試. 各模塊的關(guān)系如圖4所示.

圖4 智能調(diào)試插件模塊關(guān)系圖

開發(fā)人員首先需要在界面上點(diǎn)擊“調(diào)試”菜單項(xiàng)或命令按鈕以激活智能調(diào)試插件并進(jìn)入調(diào)試流程,此時(shí)插件會(huì)自動(dòng)讀取工程的配置信息,并根據(jù)工程的類型(本地或遠(yuǎn)程)選擇不同的調(diào)試操作,如圖5所示.

對(duì)于本地調(diào)試,插件會(huì)自動(dòng)讀取當(dāng)前的軟硬件平臺(tái)信息,并選擇與之匹配的調(diào)試工具. 隨后,插件會(huì)再去尋找待調(diào)試工具,同時(shí)搜索調(diào)試所需的動(dòng)態(tài)庫、相關(guān)聯(lián)的工程,并設(shè)置環(huán)境變量. 待所有準(zhǔn)備工作就緒后,啟動(dòng)調(diào)試. 整體流程如圖6所示.

遠(yuǎn)程調(diào)試的流程與本地調(diào)試基本類似,但在進(jìn)行準(zhǔn)備工作之前需要與目標(biāo)機(jī)建立網(wǎng)絡(luò)連接,并將待調(diào)試的程序通過網(wǎng)絡(luò)傳送至指定位置,隨后再進(jìn)行搜索動(dòng)態(tài)庫、配置環(huán)境變量等工作. 整體流程如圖7所示.

通過上述步驟處理,智能調(diào)試插件支持一鍵進(jìn)入調(diào)試界面,將手動(dòng)配置等操作屏蔽掉,可以顯著提高軟件的開發(fā)效率.

圖5 智能調(diào)試插件工作流程圖

圖6 本地調(diào)試流程圖

圖7 遠(yuǎn)程調(diào)試流程圖

4 試驗(yàn)結(jié)果與系統(tǒng)實(shí)現(xiàn)

現(xiàn)通過Eclipse CDT原始插件和智能調(diào)試插件二者操作流程的對(duì)比以驗(yàn)證智能調(diào)試插件方案的實(shí)施效果,測(cè)試環(huán)境配置見表3. 實(shí)驗(yàn)結(jié)果表明本文設(shè)計(jì)的智能調(diào)試插件具備方案可行、簡(jiǎn)便易用等特性.

使用傳統(tǒng)的調(diào)試插件時(shí),首先需要在一個(gè)對(duì)話框中選擇調(diào)試類型,如“gdb/mi”、“gdbserver”和“remote gdb/mi”等. 對(duì)于“gdb/mi”這樣的本地調(diào)試,一般可以正常發(fā)起調(diào)試,但如果應(yīng)用程序用到的動(dòng)態(tài)鏈接庫不在/usr/lib、/usr/lib64、/usr/local/lib等常見的搜索路徑下時(shí),則需要手動(dòng)在調(diào)試配置項(xiàng)中指定搜索路徑. 倘若該工程依賴的多個(gè)動(dòng)態(tài)鏈接庫分布在不同位置,則需要重復(fù)該工作若干次,較為繁瑣. 對(duì)于“gdbserver”、“remote gdb/mi”等遠(yuǎn)程調(diào)試,除了本地調(diào)試的上述問題之外,還需要先將生成的二進(jìn)制程序通過網(wǎng)絡(luò)發(fā)送到目標(biāo)機(jī),再在目標(biāo)機(jī)端以指定參數(shù)啟動(dòng)GDB Server,最后在CDT插件提供的界面中填入IP地址、端口號(hào)等信息并發(fā)起調(diào)試. 上述過程操作均需開發(fā)人員手動(dòng)操作,過程較為繁復(fù). 同時(shí),傳統(tǒng)的CDT插件對(duì)國產(chǎn)平臺(tái)下的調(diào)試功能缺乏支持.

表3 智能調(diào)試插件測(cè)試配置

智能跟蹤調(diào)試技術(shù)和與之對(duì)應(yīng)的功能插件從流程上簡(jiǎn)化了用戶的調(diào)試操作,其為數(shù)不多的人工操作步驟中的絕大多數(shù)也可以通過簡(jiǎn)單的鼠標(biāo)點(diǎn)擊完成. 與傳統(tǒng)的CDT調(diào)試相比,該技術(shù)的優(yōu)點(diǎn)見表4.

表4 調(diào)試技術(shù)對(duì)比

在Eclipse平臺(tái)下發(fā)起調(diào)試只需兩步操作:(1) 右鍵點(diǎn)擊工程; (2) 依次選擇“Debug As”、“JARI-Works C/C++ Application”菜單項(xiàng),如果工程信息與調(diào)試插件存儲(chǔ)的信息不匹配則會(huì)彈出提示窗口,此時(shí)根據(jù)具體情形用鼠標(biāo)點(diǎn)擊對(duì)應(yīng)的按鈕即可. 對(duì)應(yīng)的界面如圖8所示,其中包含了A、B、C、D等若干個(gè)視圖. 其中,視圖A為項(xiàng)目管理視圖,通過工程名稱的后綴可以看到各工程的類型(應(yīng)用工程、動(dòng)態(tài)鏈接庫工程、驅(qū)動(dòng)工程等)和工具鏈信息(本地開發(fā)工具鏈、龍芯系列工具鏈、飛騰工具鏈等); 視圖B為代碼編輯視圖,顯示當(dāng)前調(diào)試的代碼行,通過Alt+快捷鍵的形式可以控制調(diào)試方向,如F6為正向單步調(diào)試的快捷鍵,則Alt+F6為反向單步調(diào)試,每個(gè)代碼行改變的變量在視圖E中高亮顯示,打印信息則在視圖D中顯示; 視圖C為遠(yuǎn)程連接視圖,當(dāng)前集成開發(fā)環(huán)境保存的遠(yuǎn)程連接均在此顯示,本地調(diào)試時(shí)此視圖無用,遠(yuǎn)程調(diào)試時(shí)調(diào)試插件會(huì)根據(jù)工程信息自動(dòng)建立調(diào)試連接,并在此視圖中予以顯示.

圖8 調(diào)試界面示意圖

5 結(jié)語

本文闡述了反向調(diào)試的基本原理和Eclipse的插件體系架構(gòu),針對(duì)國產(chǎn)平臺(tái)性能較低的瓶頸,設(shè)計(jì)了基于事件的反向調(diào)試方案,通過對(duì)程序運(yùn)行過程中關(guān)鍵點(diǎn)進(jìn)行快照,結(jié)合高性能的轉(zhuǎn)儲(chǔ)模塊,為國產(chǎn)平臺(tái)提供易用的智能調(diào)試解決方案.

通過設(shè)計(jì)Eclipse下基于事件的反向調(diào)試插件,可以方便地進(jìn)行故障定位,從而提高調(diào)試效率,但還存在如下不足:(1) 轉(zhuǎn)儲(chǔ)時(shí)可設(shè)置粒度不足,尤其針對(duì)性能較弱的國產(chǎn)處理器平臺(tái); (2) 調(diào)試視圖設(shè)計(jì)較為簡(jiǎn)單,未全面反應(yīng)調(diào)試時(shí)程序狀態(tài); (3) 反向調(diào)試目前只支持Alt+快捷鍵的方式操作,在工具欄中缺少按鈕控件,不能全面覆蓋開發(fā)人員的使用習(xí)慣; (4) 隨著國產(chǎn)平臺(tái)的推陳出新,本技術(shù)覆蓋的工具鏈仍需繼續(xù)擴(kuò)充. 這些問題將在后續(xù)工作中嘗試改進(jìn).

猜你喜歡
調(diào)試程序
試論我國未決羈押程序的立法完善
基于航拍無人機(jī)的設(shè)計(jì)與調(diào)試
電子制作(2018年12期)2018-08-01 00:47:44
失能的信仰——走向衰亡的民事訴訟程序
“程序猿”的生活什么樣
核電廠主給水系統(tǒng)調(diào)試
中國核電(2017年1期)2017-05-17 06:10:11
英國與歐盟正式啟動(dòng)“離婚”程序程序
無線通信中頻線路窄帶臨界調(diào)試法及其應(yīng)用
電子制作(2017年19期)2017-02-02 07:08:38
調(diào)壓柜的調(diào)試與試運(yùn)行探討
工業(yè)電氣設(shè)備控制系統(tǒng)的安裝與調(diào)試
音頻處理器的調(diào)試
主站蜘蛛池模板: 一本大道东京热无码av| 国产人成网线在线播放va| 波多野结衣久久精品| 亚洲男人的天堂久久精品| 欧美午夜理伦三级在线观看| 在线观看热码亚洲av每日更新| 91在线一9|永久视频在线| 国内嫩模私拍精品视频| 日韩精品无码免费一区二区三区 | 91免费国产在线观看尤物| 日本欧美成人免费| 国产精品一区二区国产主播| 日本黄色a视频| 精品国产乱码久久久久久一区二区| 日韩中文字幕亚洲无线码| 欧美精品二区| 毛片手机在线看| 亚洲精品免费网站| 日韩高清中文字幕| 99在线视频网站| 一本一道波多野结衣av黑人在线| 成人福利在线视频免费观看| 久久夜色精品国产嚕嚕亚洲av| 欧美19综合中文字幕| 人人爽人人爽人人片| 一区二区自拍| 国产自在线拍| 福利在线不卡一区| 国产成人无码Av在线播放无广告| 国产chinese男男gay视频网| 成人午夜视频免费看欧美| 亚洲国产中文综合专区在| 中文字幕在线欧美| 亚洲第一视频网站| 亚洲精品视频网| 99热免费在线| 97青草最新免费精品视频| 老司机午夜精品网站在线观看| 伊人久久久久久久久久| 香蕉蕉亚亚洲aav综合| 91福利国产成人精品导航| 国产美女无遮挡免费视频网站 | 亚洲综合极品香蕉久久网| 伊人网址在线| 91色在线观看| 91在线精品麻豆欧美在线| 中文字幕无码av专区久久 | 欧美日韩另类在线| 亚洲一级毛片在线观播放| 久久情精品国产品免费| 久久精品电影| 囯产av无码片毛片一级| 六月婷婷激情综合| 久久青草免费91线频观看不卡| 一级片一区| 色播五月婷婷| 国产高清国内精品福利| 午夜精品区| 国产精品极品美女自在线| 欧美性猛交一区二区三区 | 天堂中文在线资源| 国产激情无码一区二区三区免费| 欧美国产在线看| 国产亚洲欧美日韩在线观看一区二区| 喷潮白浆直流在线播放| 亚洲区欧美区| 久久激情影院| 1769国产精品视频免费观看| 午夜小视频在线| 国产香蕉97碰碰视频VA碰碰看| 丰满人妻中出白浆| 白浆免费视频国产精品视频| 日日拍夜夜嗷嗷叫国产| 老司机精品久久| 久久 午夜福利 张柏芝| 中文字幕日韩视频欧美一区| 好吊妞欧美视频免费| 久久大香伊蕉在人线观看热2| 亚洲国产中文在线二区三区免| 国产成人精品2021欧美日韩| 五月天久久婷婷| 在线观看欧美国产|