VC6.0調試知識大全

常用功能:

   

   

  1. Restart(Ctrl+shift+F5):此debugger功能將從程序的開始(第一有效行)處全速執行,而不是從當前所跟蹤的位置開始調

    試,這時所有變量的當前值都將被丟棄,debugger會自動停在程序的main()開始處.這時如果選擇Step Over(F10)就可以逐步執行main()函數了.

  2. Stop Debugging(Shift+F5):此debugger功能將終止(所有)調試,並返回到常規編輯狀態.
  3. Break(此功能常常在遇到調用函數的語句時可見.):此功能將在調試過程中的debugger當前位置掛起程序的執行,然後就可以在調

    試狀態一修改程序的代碼,接着可以用Apply Code Changes(Alt+F10)來應用修改的代碼到正在調試的程序當中.如果,當前(需要,待)可以(從DOS

    等窗口)輸入值,掛起後將不能再輸入.

  4. Apply Code Changes(Alt+F10):此功能可以在程序正在調試程序過程中應用(掛起)修改後的源代碼.如,選擇Break功能並修改代

    碼後,只要選擇Apply Code Changes(Alt+F10)就能將修改後的代碼應用到正在調試的程序當中.

  5. Show Next Statement(Alt+Num*):此功能將顯示程序代碼的下一條語句,如果源代碼中找不到,則在Disassembly窗口中顯示語句.

    當在Disassembly窗口中顯示時,可以單擊Disassembly 返回到源代碼窗口.

  6. Step Into(F11):此功能可以單步進入到在調試過程中所跟蹤的調用函數的語句的函數內部.如,當前語句是"d.Display()",

    選擇Step Into(F11)後,Debugger將進入Display()函數內部並停在Display()函數內部的第一條語句上.(此時,

    就可以Step Over(F10)對Display()函數進行單步調試了.)

  7. Step Over(F10):此功能可以單步對所在函數單步調試,如果調試的語句是一個調用函數的語句時,

    Debugger將全速執行所調用的函數,單步(一步)通過所調用的函數,Debugger停該調用語句的下一條語句上.

  8. Step Out(Shift+F11):此功能將使Debugger切換回全速執行到被調用函數結束,並停在該函數調用語句的下一條語句上.

    當確定所調用的函數沒有問題時可以用這個功能全速執行被調用函數.

  9. Run to Cursor(Ctrl+F10):此功能將全速執行到包含插入點光標所在的行,可以作爲在插入點光標處設置常規斷點的一種選擇.

    注意,當光標處不是一個有效的執行語句時此功能將不起作用.

  10. Go(F5):此功能將全速執行程序直到遇到一個斷點或程序結束,或直到程序暫停等待用戶輸入.

    注意,此功能最能有效的調試循環,常將斷點設置在循環體內,重複的按F5全速執行循環體可以測試循環過程中的產生的變化.

  11. Step Into Specific Function:此功能可以可以單步通過程序中的指令,並進入指定的函數調用,此功能對於函數的嵌套層不限.

       

       

       

       

調試常用快捷鍵

單步進入

F11

單步跳過

F10

單步跳出

SHIFT+F11

運行到光標

CTRL+F10

開關斷點

F9

清除斷點

CTRL+SHIFT+F9

Breakpoints(斷點管理)

CTRL+B 或ALT+F9

GO

F5

Compile(編譯,生成.obj文件)

CTRL+F7

Build(組建,先Compile生成.obj再Link生成.exe)

F7

   

From 《Visual C++ Debugger》

   

Debug Menu From MSDN

Start Debug Commands (Build menu)

Menu
command


Action

Go

Executes code from the current statement until a breakpoint or the end of the program is reached, or until the application pauses for user input. (Equivalent to the Go button on the toolbar.)

Step Into

Single-steps through instructions in the program, and enters each function call that is encountered.

Run to Cursor

Executes the program as far as the line that contains the insertion point. This is equivalent to setting a temporary breakpoint at the insertion point location.

Attach to Process

Attaches the debugger to a process that is running. Then you can break into the process and perform debugging operations like normal.

When you begin debugging, the Debug menu appears, replacing the Build menu on the menu bar. You can then control program execution using the commands

listed in the following table.

Debug Menu Commands that Control Program Execution

Debug menu
command


Action

Go

Executes code from the current statement until a breakpoint or the end of the program is reached, or until the application pauses for user input. (Equivalent to the Go button on the Standard toolbar.) When the Debug menu is not available, you can choose Go from the Start Debug submenu of the Build menu.

Restart

Resets execution to the first line of the program. This command reloads the program into memory, and discards the current values of all variables (breakpoints and watch expressions still apply). It automatically halts at the main( ) or WinMain( ) function.

Stop Debugging

Terminates the debugging session, and returns to a normal editing session.

Break

Halts the program at its current location.

Step Into

Single-steps through instructions in the program, and enters each function call that is encountered.  When the Debug menu is not available, you can choose Step Into from the Start Debug submenu of the Build menu.

Step Over

Single-steps through instructions in the program. If this command is used when you reach a function call, the function is executed without stepping through the function instructions.

Step Out

Executes the program out of a function call, and stops on the instruction immediately following the call to the function. Using this command, you can quickly finish executing the current function after determining that a bug is not present in the function.

Run to Cursor

Executes the program as far as the line that contains the insertion point. This command is equivalent to setting a temporary breakpoint at the insertion point location. When the Debug menu is not available, you can choose Run To Cursor from the Start Debug submenu of the Build menu.

Step Into Specific Function

Single steps through instructions in the program, and enters the specified function call. This works for any number of nesting levels of functions.

The following additional commands appear on the Debug menu:

Exceptions

Displays the Exceptions dialog, which you can use to specify how you want the debugger to handle your program exceptions.

Threads

Displays the Threads dialog, which you can use to suspend, resume, or set focus to progam threads.

Show Next Statement

Shows the next statement in your program code. If source code is not available, displays the statement within the Disassembly window.

QuickWatch

Displays the Quick Watch window, where you can work with expressions.

   

   

From 《visual C++ 6.0開發工具與調試》

1、          如何快速地範代碼縮進格式

中所需要範的代,按shift+F8

2、          如何在Release狀態調試

Project->Setting=>ProjectSetting對話框,選擇Release狀態。C/C++標籤中的CategoryGeneral,OptimizationsDisable(Debug),

Debut infoProgram Database。在Link標籤中Generate debug info複選框。

     

注:只是一介乎Debug合Release的中間狀態,所有的ASSERT、VERIFY都不起作用,函數調用方式已正的調用,而不表,

但是這種狀態下QuickWatch、調列跟蹤功能仍然有效,和Debug版一

     

3、          Release和Debug有什不同。

Release版稱爲發行版,Debug版稱爲調試版。

Debug中可以行、跟蹤等功能,但生成的可行文件比大,代碼運行速度慢。Release版行速度快,可行文件小,

但在其編譯條件小無法調試功能。

Release的exe文件接的是準的MFC DLL(Use MFC in a shared or static dll),比如MFC42.DLL。些DLL在安裝Windows的候,

配置,所以些程序能有安裝Visual C++ 6.0的機器上行。而Debug版本的exe接了調試版本的MFC DLL文件,如MFC42D.DLL。

有安裝Visual C++6.0的機器上不能行,因缺MFC42D.DLL等,除非選擇use static dll when link。

     

4、          ASSERT和VERIFY有什麼區別

ASSERT裏面的容在Release版本中不編譯,VERIFY裏面的容仍然翻,但不再判斷真假。所以後者更安全一點。

例如ASSERT(file.Open(strFileName))。

一旦到了Release版本中,一行就忽略了,file根本就不Open()了,而且有任何出的信息。如果用VERIFY()就不這個問題

     

5、          Workspace和Project之是什麼樣

Workspace可以包括幾project,但只有一個處於Active狀態,各project之可以有依賴關系,在project的Setting..中可以定,

比如那Active狀態的project可以依於其他的提供其函數調用的靜態庫

     

6、          如何在非MFC程序中使用ClassWizard

在工程目下新建一空的.RC文件,然後加入到工程中就可以了。

     

7、          如何

按F9在前光標處增加一個斷點和取消一個斷點。

另外,在編輯狀態下,按Ctrl+B對話框。然後單擊【Condition…】按鈕彈件的對話置。

     

8、          編輯狀態發現成員變量或函數不能顯示提示是如何打開顯示功能

似乎是目前這個Visual C++ 6.0版本的一bug,可按如下步使其正常,如再出,可如法炮製:

(1)             關閉Project

(2)             除"工程名.ncb"文件

(3)             重新打工程

     

9、          如何ClassWizard生成的類徹

首先在工作的FileView中該類的.h和.cpp文件,按delete除,然後在文件管理器中將這兩個文件除,再行ClassWizard,

這時是否移走該類的提示,選擇remove就可以了。

     

10、     如何再workspace中消失的找出

開該類對應文件,然後便改一下,這個時候工作新的,再將這個類改回原的名字就可以了。

     

11、     如何清除所有的

【Edit】->【Breakpoints…】,打"Breakpoints"對話框,單擊【Remove All】按即可。

快捷是"Ctrl + Shift + F8"。

     

12、     如何再ClassWizard中選擇未列出的信息

"ClassWizard"對話框,然後切到"Class Info"面。改"Message filter",如選擇"Window","Message"面就Window的信息。

     

13、     如何檢測程序中的括是否匹配

把光到需要檢測的括前面,按快捷"Ctrl + ]"。如果括匹配正確,光就跳到匹配的括號處,否不移

且機箱喇叭還會發出一警告。

     

14、     如何看一宏(或量、函)的定

把光到要看的一宏上,就比如最常的DECLARE_MAP_MESSAGE上按一下F12(或右中的相),

如果有建立瀏覽文件,就提示對話框,按【確定】按,然後就跳到宏(或量、函)定的地方。

     

15、     如何添加Lib文件到當前工程

單擊菜單【Project】->Settings…】彈出"Project Setting"對話框,切換到"Link"標籤頁,在"Object/library modules"處輸入Lib文件名稱,

不同的Lib之間用空格格開。

     

16、     如何快速刪除項目下的Debug文件夾中臨時文件

在工作區的FileView視圖中選中對應的項目,單擊右鍵彈出菜單,選擇【Clean(selection only)】菜單即可。

     

17、     如何快速生成一個現有工程除了工程名外完全相同的新工程。

在新建工程的"New"對話框中選擇"Custom Appwizard"項,輸入新工程的名字,單擊【OK】按鈕。出現"Custom AppWizard"項,

輸入新工程的名字,單擊【OK】按鈕。出現"Custom AppWizardStep 1 of 2"對話框,選擇"An existing Project"項,單擊【Next】按鈕。

出現"Custom AppWizardStep 2 of 2"對話框,選擇現有工程的工程文件名,最後單擊【Finish】按鈕。編譯後就生成一個與現有工程相同

但可以重新取名的工程AppWizard

現在就可以項用MFC AppWizard一樣用這個定製的嚮導。如果不想用了,可以在Visual C++ 6.0安裝目錄下Common/MSDev98/Template目錄

中刪除該Wizard對應的.awx.pdb文件。

     

18、     如何解決Visual C++ 6.0不正確連接的問題

情景:明明之間改動了一個文件,卻要把整個項目全部重新編譯鏈接一次。剛剛鏈接好,一運行,有提示重新編譯鏈接一次。

這是因爲出現了未來文件(修改時間和創建時間比系統時間晚)的緣故。可以這樣處理:找到工程文件夾下的debug目錄,

將創建和修改時間都比系統時間的文件全部刪除,然後再從新"Rebuild All"一次。

     

19、     引起LNK2001的常見錯誤都有哪些

遇到的LNK2001錯誤主要爲:unresolved external symbol "symbol"

如果鏈接程序不能在所有的庫和目標文件內找到所引用的函數、變量或標籤,將產生此錯誤信息。

一般來說,發生錯誤的原因有兩個:一時所引用的函數、變量不存在,拼寫不正確或者使用錯誤;其次可能使用了不同版本的鏈接庫。

一下是可能產生LNK2001錯誤的原因:

<1>由於編碼錯誤導致的LNK2001錯誤

  1. 不相匹配的程序代碼或模塊定義(.DEF)文件導致LNK2001。例如,如果在C++源文件了內聲明瞭一變量"var1",

    卻視圖在另一個文件內以變量"var1"訪問改變量。

(2)             如果使用的內聯函數是在.cpp文件內定義的,而不是在頭文件內定義將導致LNK2001錯誤。

(3)             調用函數是如果所用的參數類型頭函數聲明是的類型不符將會產生LNK2001錯誤。

(4)             視圖從基類的構造函數或析構函數中調用虛擬函數時將會導致LNK2001錯誤。

(5)             要注意函數和變量的可公用性,只有全局變量、函數時可公用的。靜態函數和靜態變量具有相同的使用範圍限制。

當試圖從文件外部方位任何沒有在該文件內聲明的靜態變量時將導致編譯錯誤或LNK2001錯誤。

<2>由於編譯和聯機的設置而造成的LNK2001錯誤

  1. 如果編譯時使用的時/NOD(/NODERAULTLIB)選項,程序所需要的運行庫和MFC時將得到又編譯器寫入目標文件模塊,

    但除非在文件中明確包含這些庫名,否則這些庫不會北鏈接進工程文件。這種情況下使用/NOD將導致LNK2001錯誤

  2. 如果沒有爲wWinMainCRTStartup設定程序入口,在使用UnicodeMFC時講的到

    "unresolved external on _WinMain@16"的LNK2001錯誤信息。

  3. 使用/MD選項編譯時,既然所有的運行庫都被保留在動態鏈接庫之內,源文件中對"func"的引用,

    在目標文件裏即對"__imp__func"的引用。如果試圖使用靜態庫LIBC.LIBLIBCMT.LIB進行鏈接,將在__imp__func上發生LNK2001錯誤。如果不使用/MD選項編譯,在使用MSVCxx.LIB鏈接時也會發生LNK2001錯誤。

(4)             使用/ML選項編譯時,如用LIBCMT.LIB鏈接回在_errno上發生LNK2001錯誤。

(5)             當編譯調試版的應用程序時,如果採用發行版模態庫進行鏈接也會產生LNK2001錯誤;同樣,

使用調試版模態庫鏈接發行版應用程序時也會產生相同的錯誤。

(6)             不同版本的庫和編譯器的混合使用也能產生問題,因爲新版的庫裏可能包含早先的版本沒有的符號和說明。

(7)             在不同的模塊中使用內聯和非內聯的編譯選項能夠導致LNK2001錯誤。如果創建C++庫時打開了

函數內聯(/Ob1/Ob2),但是在描述該函數的相應頭問卷安裏卻關閉了函數內聯(沒有inline關鍵字)

只是將得到錯誤信息。爲避免該問題的發生,應該在相應的頭文件中用inline關鍵字標誌爲內聯函數。

(8)             不正確的/SUBSYSTEMENTRY設置也能導致LNK2001錯誤。

     

20、     如何調試一個沒有源碼的exe文件調用的dll

Visual C++ 6.0中,進入"Project Setting"對話框然後選擇Debug標籤頁。通常Visual Studio默認"executable for debug session"爲可執行文件名,

但可以將他改成任何你想要的程序。甚至可以指定不同的工作目錄以及傳遞參數到你的程序。這個技術常用來調試Dlls、名字空間擴展、

COM對象和其他從某些EXE以及從第三方的EXE中調用的plug-in程序。

     

21、     Visual C++ 6.0工程中的項目文件都表示什麼。

.opt:工程關於開發化境的參數文件。如工具條位置等信息。

.aps(AppStudio File)資源輔助文件,二進制格式,一般不用去管他。

.clwClassWizard信息文件,實際上是INI文件格式,又興趣可以研究一下。有時候ClassWizard出了問題,手工修改CLW文件可以解決。

如果此文件不存在的話,每次用ClassWizard的時候回提示是否重建。

.dsp(DevelopStudio Project):項目文件,文本格式,不過不熟悉的或不要手工修改。

.dsw(DevelopStudio Workspace):是工作區文件,其他特點和.dsp差不多。

.plg:是編譯信息文件,編譯時的errorwarning信息文件(實際上時一個html文件),一般用處不大。在單擊菜單【Tool】->Option

彈出的對話框裏面有個選項可以控制這個文件的生成。

.hpj(Help Project):是生成幫助文件的工程,用microsoft Help Compiler可以處理。

.mdp(Microsoft DevStudio Project):是舊版本的項目文件,如果要打開此文件的話,回提示你是否轉換成新的.dsp格式。

.bsc:是用於瀏覽項目信息的,如果用Source Brower的話舊必須又這個文件。如果不用這個功能的話,可以在Project Options裏面去掉

Generate Browse Info File,這樣可以加快編譯速度。

.map是執行文件的影像信息記錄文件,除非對系統底層,這個文件一般用不着。

.pch(Pre-Compiled File):是與編譯文件,可以加快編譯速度,但是文件非常大。

.pdb(Program Database),記錄了程序有關的一些數據和調試信息,在調試的時候可能有用。

.exp:只有在編譯DLL的時候纔會生成,記錄了DLL文件的一些信息,一般也沒有用。

.ncb:無編譯瀏覽文件(no compile browser)。當自動完成功能出問題時可以刪除此文件。編譯工程後回自動生成。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章