Visual C++ 6.0調試功能
這是我自己在學習時整理的,希望對大家有用.其中有幾個部分的內容,如下:
※My Note
全部由我截圖并參考資料進行說明,這其中有大量的內容是調試過程中體會總結才寫的.有不當之處請大家更正.
※From 《Visual C++ Debugger》
這本書寫得非常的不錯,從里面截了一些有用的圖,主要是強烈推薦大家閱讀這本書.
※Debug Menu From MSDN
這是我從Visual C++ 6.0 MSDN Library October 2001中查來的,在My Note中有很多是從那里參考的.強烈推薦大家看這份英文說明.
※From 《visual C++ 6.0開發工具與調試》
這是我從網絡上搜索到的,問題很經典,強烈推薦大家參看學習,避免不必要的錯誤.
?
?
My Note
○常用功能:
?
?
?
?
Restart(
Ctrl+shift+F5):此debugger功能將從程序的開始(第一有效行)處全速執行,而不是從當前所跟蹤的位置開始調
試,這時所有變量的當前值都將被丟棄,debugger會自動停在程序的main()開始處.這時如果選擇Step Over(F10)就可以逐步執行main()函數了.
Stop Debugging(
Shift+F5):此debugger功能將終止(所有)調試,并返回到常規編輯狀態.
Break(
此功能常常在遇到調用函數的語句時可見.):此功能將在調試過程中的debugger當前位置掛起程序的執行,然后就可以在調
試狀態一修改程序的代碼,接著可以用Apply Code Changes(Alt+F10)來應用修改的代碼到正在調試的程序當中.如果,當前(需要,待)可以(從DOS
等窗口)輸入值,掛起后將不能再輸入.
Apply Code Changes(
Alt+F10):此功能可以在程序正在調試程序過程中應用(掛起)修改后的源代碼.如,選擇
Break功能并修改代
碼后,只要選擇Apply Code Changes(Alt+F10)就能將修改后的代碼應用到正在調試的程序當中.
Show Next Statement(
Alt+Num*):此功能將顯示程序代碼的下一條語句,如果源代碼中找不到,則在Disassembly窗口中顯示語句.
當在Disassembly窗口中顯示時,可以單擊
Disassembly 返回到源代碼窗口.
Step Into(
F11):此功能可以單步進入到在調試過程中所跟蹤的調用函數的語句的函數內部.如,當前語句是"d.Display()",
選擇Step Into(F11)后,Debugger將進入Display()函數內部并停在Display()函數內部的第一條語句上.(此時,
就可以Step Over(F10)對Display()函數進行單步調試了.)
Step Over(
F10):此功能可以單步對所在函數單步調試,如果調試的語句是一個調用函數的語句時,
Debugger將全速執行所調用的函數,單步(一步)通過所調用的函數,Debugger停該調用語句的下一條語句上.
Step Out(
Shift+F11):此功能將使Debugger切換回全速執行到被調用函數結束,并停在該函數調用語句的下一條語句上.
當確定所調用的函數沒有問題時可以用這個功能全速執行被調用函數.
Run to Cursor(
Ctrl+F10):此功能將全速執行到包含插入點光標所在的行,可以作為在插入點光標處設置常規斷點的一種選擇.
注意,當光標處不是一個有效的執行語句時此功能將不起作用.
Go(
F5):此功能將全速執行程序直到遇到一個斷點或程序結束,或直到程序暫停等待用戶輸入.
注意,此功能最能有效的調試循環,常將斷點設置在循環體內,重復的按F5全速執行循環體可以測試循環過程中的產生的變化.
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++標簽中的Category選General,Optimizations選Disable(Debug),
Debut info選Program 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 AppWizard-Step 1 of 2"對話框,選擇"An existing Project"項,單擊【Next】按鈕。
出現"Custom AppWizard-Step 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錯誤
不相匹配的程序代碼或模塊定義(.DEF)文件導致LNK2001。例如,如果在C++源文件了內聲明了一變量"var1",
卻視圖在另一個文件內以變量"var1"訪問改變量。
(2)???????????? 如果使用的內聯函數是在.cpp文件內定義的,而不是在頭文件內定義將導致LNK2001錯誤。
(3)???????????? 調用函數是如果所用的參數類型頭函數聲明是的類型不符將會產生LNK2001錯誤。
(4)???????????? 視圖從基類的構造函數或析構函數中調用虛擬函數時將會導致LNK2001錯誤。
(5)???????????? 要注意函數和變量的可公用性,只有全局變量、函數時可公用的。靜態函數和靜態變量具有相同的使用范圍限制。
當試圖從文件外部方位任何沒有在該文件內聲明的靜態變量時將導致編譯錯誤或LNK2001錯誤。
<2>由于編譯和聯機的設置而造成的LNK2001錯誤
如果編譯時使用的時/NOD(/NODERAULTLIB)選項,程序所需要的運行庫和MFC時將得到又編譯器寫入目標文件模塊,
但除非在文件中明確包含這些庫名,否則這些庫不會北鏈接進工程文件。這種情況下使用/NOD將導致LNK2001錯誤
如果沒有為wWinMainCRTStartup設定程序入口,在使用Unicode和MFC時講的到
"unresolved external on _WinMain@16"的LNK2001錯誤信息。
使用/MD選項編譯時,既然所有的運行庫都被保留在動態鏈接庫之內,源文件中對"func"的引用,
在目標文件里即對"__imp__func"的引用。如果試圖使用靜態庫LIBC.LIB或LIBCMT.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)???????????? 不正確的/SUBSYSTEM或ENTRY設置也能導致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)資源輔助文件,二進制格式,一般不用去管他。
.clw:ClassWizard信息文件,實際上是INI文件格式,又興趣可以研究一下。有時候ClassWizard出了問題,手工修改CLW文件可以解決。
如果此文件不存在的話,每次用ClassWizard的時候回提示是否重建。
.dsp(DevelopStudio Project):項目文件,文本格式,不過不熟悉的或不要手工修改。
.dsw(DevelopStudio Workspace):是工作區文件,其他特點和.dsp差不多。
.plg:是編譯信息文件,編譯時的error和warning信息文件(實際上時一個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)。當自動完成功能出問題時可以刪除此文件。編譯工程后回自動生成。
??????????????????????????????????????????????????????????????????????????????????????????????????聲明:以上為從的個人初學時的學習筆記中整理制作而成,有不當之處請自行更正.
?????????????????????????????????????????????????????????????????????∪∩BUG
??