【精华】掌握Qt调试技术
前言
軟件調試,是開發過程中必備的技能。通過調試可以發現軟件存在的bug,即缺陷。調試可以幫助開發者窺探到軟件運行過程中的詳細狀態,從而為消除bug提供重要信息。調試的英文是debug,前面的de在英文中表示“反對”,“消除”。本文將會介紹日常開發中常用的、也是一名合格的Qt開發人員需要掌握的Qt軟件基本調試方法,并結合不同場景加以說明,幫助讀者查漏補缺,打牢基本功。
常用調試方法
1. 基本調試方法
1.1 以調試啟動
以調試啟動,是指軟件在啟動的同時,調試也隨即開始。
在Qt項目中,點擊Qt Creator左下角調試按鈕,如下所示,即可以調試啟動:
在VS中調試啟動按鈕為:
以調試啟動是最常用的調試方法,因為它可以對軟件啟動到退出的全過程進行調試,所以是調試的首選方法,適用于絕大多數場景。
1.2 附加到進程
附加到進程是另外一種比較常用的調試方法,它是指在軟件無調試啟動一段時間后,再將調試器掛載到應用程序中進行調試。這種方法通常在以下場景使用:
- 場景1:
如果軟件啟動速度較慢(啟動慢的原因很多,比如加載資源、加載插件等等)。調試本身就會使軟件變慢,以調試啟動,會導致軟件啟動速度更慢。而采用附加到進程的調試方法,可以在軟件啟動后,再調試軟件,節省時間。但是如果你需要調試的代碼段只在軟件啟動時刻執行一次,那就無法用此種方法,只能使用以調試啟動的方法來調試。 - 場景2:
在軟件是由windows批處理啟動時,一般需要使用附加到進程的方法調試。
通常使用批處理啟動軟件,是為了配置軟件的啟動環境,或進行一些啟動前的預處理步驟。因為在開發環境中,啟動軟件僅僅能夠配置命令行參數而已,無法進行復雜的環境配置,所以就無法直接以調試啟動的方法調試。可能有的同學說,直接調試批處理文件是否可行,答案是不行,感興趣的同學可以自己嘗試。那么這樣一來就只有使用附加到進程的方法調試了。
附加到進程,在Qt Creator中,選擇菜單“調試”->“開始調試”->“關聯到運行中的程序”,隨后在彈出的進程列表中選擇需要調試的進程即可,如下圖所示:
在VS中,在菜單中選擇“調試”->“附加到進程”,在彈出的進程列表中選擇需要調試的進程即可,如下圖所示:
1.3 啟動后再調試
啟動后再調試嚴格來說也是附加到進程。在Qt中,當軟件啟動后,可以點擊下圖所示的按鈕,直接附加到進程調試:
這里就不再贅述。
2. 遠程調試
遠程調試用于通過網絡對另外一臺電腦上運行的軟件進行調試。
通常用于以下場景:
- 場景1
假設目標電腦為實際運行環境。且不能安裝開發環境,可能的原因有:目標電腦版本較老、性能較差、不具備安裝開發環境的條件,抑或是時間緊急,沒有時間安裝配置開發環境。
但是目標電腦可以接入網絡,包括局域網和廣域網。這種情況下可以在目標電腦上啟動調試服務器;在自己的開發電腦上,在VS中使用源碼實現遠程調試。
調試服務器,又叫遠程調試器,Remote Debugger,本地 VS 安裝目錄下的找到msvsmon.exe,拷貝到目標電腦上運行。
隨后在目標電腦上配置調試服務器,包括監聽端口、防火墻等。
在調試電腦上的VS 工程中,打開項目屬性,點擊調試選項卡,切換到遠程 Windows 調試器進行配置。具體的配置過程,限于篇幅這里不再贅述,大家可自行搜索。
需要強調的是,發布的debug版本的軟件一定要包含.pdb文件,即調試信息文件,它包含了符號的位置信息,用于定位源碼,無pdb文件將無法調試。
3. windbg調試
windbg調試是指使用windbg調試軟件在目標電腦上進行調試,這種調試方法的優點是不需要安裝開發環境,不需要連接網絡。只需要將目標電腦上運行的軟件對應的源碼,以及和目標電腦對應位數、版本的windbg軟件拷貝到目標電腦上即可。
windbg調試時,需要進行源碼目錄配置等操作。windbg支持單步執行,執行到指定位置、查看變量、附加到進程等諸多功能,基本包含Qt/VS中的調試功能,甚至更加強大。當然,使用windbg調試需要一定的學習成本,因為其只在特定的場景下使用,一般只需要在用的時候根據網絡上的教程現學即可。
和上面一樣,被調試的軟件必須含有.pdb文件,否則無法調試。
4. 僅日志調試
上面說的調試方法,都是使用調試器進行調試,可以看到軟件運行時的詳細信息。但是上述方法的缺點是必須需要和運行的目標軟件建立某種連接。而日志調試不需要建立實質性的連接,日志僅僅為軟件運行過程中調試信息的記錄文本。日志調試需要先打印出重要的運行信息,在排查軟件問題時,通過分析日志記錄,推斷出軟件出現問題的原因。日志調試是一種在軟件開發后期最省時省力、成本最低的調試方法。但是實現日志調試是一種從編寫軟件的第一行代碼開始就進行的長期、持續的工作。編寫代碼時,在重要的位置上打印出重要的信息,是實現日志調試的必要工作。
Qt中提供了日志輸出機制。如qDebug()、qInfo()、qCritical()、qFatal(),用于向控制臺打印信息,當然也可以重定向輸出到文件,后面的文章會加以說明。除此之外還有斷言Q_ASSERT,可以在調試版本的軟件運行時,在關鍵位置進行條件校驗,校驗失敗時,彈出對話框提示并指明錯誤代碼位置。
日志調試在軟件中是必不可少的存在,任何一個良好的軟件都會有日志記錄。從另一個角度看,在編碼過程中,我們要培養打印日志的好習慣,這也是提高編碼水平的重要內容。
調試場景
1. 開發階段調試
因為開發階段一般環境準備比較充分,大部分時間使用調試器進行調試,包含上面提到的基本調試方法、遠程調試方法、windbg調試方法。使用調試器調試可以直接看到內存變量、程序執行位置、對執行進行控制,可以快速定位問題。
軟件調試不是目的,軟件在設計和編碼階段要充分考慮各種輸入輸出情況,對異常的處理分支不能不管不問,不可圖懶省事,要對軟件質量負責,這是開發者的本職工作,是減少軟件缺陷的關鍵。我們不僅要學習調試技術,還要建立起對軟件正確的態度,成為一名合格的工程師。
2. 部署、維護階段調試
部署維護階段,因為部署維護時的軟件運行環境會發生巨大變化,可能因為種種原因,調試會出現困難。這要求我們掌握并靈活運用多種調試手段,根據實際情況選擇合適的調試方法,或者綜合運用各種調試方法。在不具備調試條件時,通過協商、溝通創建必要的調試環境,最后解決軟件問題,防止因軟件問題產生損失,這會給我們帶來很大的成就感。
結語
本文對筆者在工作中關于軟件調試的一些經驗方法進行了系統的總結,希望對想要做出優秀軟件的同學有所幫助。
大家如有任何疑問,歡迎評論交流。
本文由微信公眾號“Qt未來工程師”原創發布。
總結
以上是生活随笔為你收集整理的【精华】掌握Qt调试技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 抖音测试自动播放下一条视频功能:彻底解放
- 下一篇: 初二学生网购花光母亲12万手术费上热搜