程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 如何使用Visual C++子集搜索主題

如何使用Visual C++子集搜索主題

編輯:C++入門知識

在Windows平台上的實現就有若干種,比較常用的有Visual C++ 6.0附帶的Visual C++子集實現,和Borland C++ Builder附帶的C++編譯器實現,看完本文你肯定有不少收獲,希望本文能教會你更多東西。

如果程序並不是每次運行到斷點處都會發生錯誤,那麼不停地在調試器和應用程序之間穿梭很快就會讓人厭倦,這時高級斷點就派上了用場。從本質上來講,高級斷點允許你將某些智慧寫入到斷點中,讓調試器在執行到斷點處時,只當程序內部狀態符合你指定的條件時才在斷點處中斷程序運行,並切換到調試器中。按下Alt+F9快捷鍵彈出Breakpoints對話框,浏覽一下對話框發現該對話框分為Location、Data和Messages三頁,分別對應三種斷點:

1. 位置斷點:我們通常使用的簡單斷點均為位置斷點,我們還可以設置斷點在某個二進制地址或任何函數上,並通過指定各種限定條件來增強位置斷點的功能。

2. 表達式和變量斷點:調試器會讓程序一直運行,直到滿足所設的條件或者指定數據更改為止。在Intel CPU上,這兩種斷點都盡可能通過CPU的特定調試寄存器使用一個硬件斷點,如果能夠使用調試寄存器,那麼程序將能夠全速運行,否則調試器將單步執行每個匯編指令,並每步都檢查條件,程序的運行速度將極其緩慢甚至無法運行。

3. Visual C++子集斷點:使用消息斷點,可以讓調試器在窗口過程接收到一個特定的Windows消息時中斷。消息斷點適用於C SDK類型的程序,對於使用MFC等C++類庫的程序應該是絕大多數)來說,消息斷點並不實用,可以變通地使用位置斷點來達到同樣效果。

調用堆棧

有時候我們並不清楚應該在哪裡設置斷點,只知道程序正在運行就突然崩潰了,這時候如何定位到出錯地點呢?這時的選擇就是查看調用堆棧,調用堆棧可以幫助我們確定某一特定時刻,程序中各個函數之間的相互調用關系。

  • 講述C++Builder實現IE中最常用菜單
  • 進行Visual C++ 6.0編譯實現功能
  • 分析C++語法與C語言之間關系說明
  • 對C++編程錯誤進行說明講解
  • 詳細介紹C++語言及其代碼進行學習

方法是當程序執行到某斷點處或者程序崩潰,控制權轉到調試器後,按下Alt+7快捷鍵,彈出Call Stack窗口,你可以看到當前函數調用情況,當前函數在最上面,下面的函數依次調用其上面的函數。在Call Stack窗口的彈出菜單上選擇Parameter Values和Parameter Types可以顯示各個函數的參數類型和傳入值。

使用跟蹤工具

有些時候,我們希望了解程序中不同函數之間的協作關系,或者由於文檔的缺失,希望能夠確認函數在不同情況下被調用時的傳入參數值。這時使用斷點功能就過分麻煩,而調用堆棧只能查看當前函數的被調用情況,一種較好的方法就是使用TRACE宏以及相對應的工具。

程序Debug版)運行中,一旦運行到Visual C++子集,就會向當前Windows系統的調試器輸出TRACE宏內指定的字符串並顯示出來,當在Visual C++環境中調試運行按F5鍵)程序時,可以在Output窗口的Debug頁看到TRACE宏的輸出內容。

實際上,TRACE宏是封裝了Windows API函數OutputDebugString的功能,有些輔助工具可以在不驚動Visual C++調試器的前提下,攔截程序中TRACE宏的輸出內容,比如《深入淺出MFC》的附錄中提到的Microsoft System JournalMSJ)1996年1月的C/C++專欄介紹的TraceWin工具在較老版本的MSDN中可以找到源代碼和文檔)以及功能強大的免費工具DebugView。

使用TRACE宏,我們可以輕松了解程序中各個函數之間的相互協作關系和被調用的先後順序和時間,進一步說,你能夠完全掌握程序的執行流程。最後請注意,TRACE宏會對程序效率有所影響,所以,當前不用的TRACE宏最好刪除或者注釋掉。

 閱讀程序的技巧

對於程序員來說,無論是學習還是工作,經常要閱讀其他程序員的源代碼,如何快速領悟程序的思想,洞悉程序的結構和各個組成部分的功能,進而全面掌握程序所涉及的方方面面,是程序員很重要的一項基本技能。下面介紹一些常用的技巧。

從功能、界面入手Visual C++子集

一個完整的應用程序或者系統是由若干相對獨立的功能構成,這些功能反應在與用戶交互的圖形界面上,就是各種菜單命令、工具欄按鈕命令等等。所以如果當前只對程序的某幾個功能感興趣,可以在程序中找到這些菜單命令、按鈕命令等的ID響應函數,以此為起點,逐步深入到程序內部,直到完全理解該功能的實現為止。此過程所花費的時間,很大程度上取決於程序員對調試技術的掌握程度。

需要強調的是,在不熟悉程序核心結構和實現技術的情況下,直接采用該方法探究程序,當逐步深入到程序核心時,涉及的程序模塊數量會急劇增長,理解難度也會驟然增大;一旦你對程序核心結構和實現技術了然於胸,采用該方法探究程序,會有勢如破竹之感覺。

砍去枝葉,只留主干

前面已經提到,無論如何,最終你都要掌握程序核心結構和實現技術。如何掌握呢?方法是首先將拿到的程序進行完整的備份,然後將次要功能都從程序中去掉,只留下的必須的部分。去除次要功能是一個反復多次的過程,花費的時間取決於程序員對行業知識的理解程度、編程技術的高低和經驗的多少。

經常遇到無法在短時間內判斷某個模塊是否次要的情況隨著對程序的理解逐漸加深,以及經驗和技術的積累,這種情況會越來越少),這時候建議直接將該模塊去除,然後重新編譯連接程序,運行程序,看程序運行是否正常。

以上介紹的兩種方法是使用比較頻繁的,Visual C++子集可以相互結合,交替使用。但無論采用什麼方法探究閱讀程序,都不要指望能夠不費任何氣力,花費一兩個鐘頭就能夠將上萬行的程序探究個明白。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved