程序崩潰的原因分類
- 函數棧溢出
一個變量未初化、未賦值,就讀取它的值。
( 這屬於邏輯問題,往往是粗心大意的導致的 ) - 函數棧溢出
(1)定義了一個體積太大的局部變量
(2)函數嵌套調用,層次過深(如無窮遞歸) - 數組越界訪問
訪問數組元素時,下標越界 - 指針的目標對象不可用
(1)空指針
(2)野指針- 指針未賦值
- free/delete釋放了的對象
- 不恰當的指針強制轉換
1 導言
在軟件開發週期中,測試和修正缺陷(defect,defect與bug的區別:Bug是缺陷的一種表現形式,而一個缺陷是可以引起多種Bug的)的時間遠多於寫代碼的時間。通常,debug是指發現缺陷並改正的過程。修正缺陷緊隨debug之後,或者說二者是相關的。如果代碼中存在缺陷,我們首先要識別造成缺陷的根本原因(root cause),這個過程就稱作調試(debugging)。找到根本原因後,就可以修正缺陷。
那麼如何調試代碼呢?Visual Studio提供了很多用於調試的工具。有時調試需要花費大量時間去識別root cause。VS提供了許多輔助調試的便捷的工具。調試器(Debugger)包含錯誤列表、添加斷點、可視化的程序流程、控制執行流程、Data Tips、監視窗口(watch windows)、多線程調試、線程窗口、並行調試概覽以及IntelliTrace調試概覽。我希望本文能夠對調試功能的使用者有所裨益。請注意,本文使用VS2010。某些功能在舊版本中也是一致的,但是VS2010新增了許多features(Labeling breakpoint, Pinned DataTip, Multithreaded Debugging, Parallel debugging and IntelliTrace)。
2 如何啓動調試?
圖 啓動調試(Start Debugging)
“附加到進程(Attach to Process)”是另一種啓動調試的方法。Attach Process會爲應用程序啓動一個調試會話。可能我們更熟悉ASP.NET Web應用的Attach Process調試。我發了另外兩篇相關的帖子。如下:
- Debug Your ASP.NET Application that Hosted on IIS
- Remote IIS Debugging: Debug your ASP.NET Application which is hosted on "Remote IIS Server"
通常我們通過在可能存在問題代碼處加斷點來啓動調試。因此,我們從斷點開始講起。
3 斷點(Breakpoints)
圖 設置斷點(Set Breakpoint)
3.1 使用斷點進行調試
在中斷模式下,你有多條可使用的命令,使用相應命令進行進一步的調試。
圖 斷點工具條(Breakpoint Toolbar)
3.1.1 逐過程(Step Over)
3.1.2 逐語句(Step Into)
3.1.3 跳出(Step Out)
3.1.4 繼續(Continue)
3.1.5 設置下一語句(Set Next Statement)
3.1.6 顯示下一語句(Show Next Statement [Ctrl+*])
3.2 斷點標籤(Labeling in Break Point)
- class Program
- {
- static void Main(string[] args)
- {
- string[] strNames = { "Name1", "Name2", "Name3", "Name4", "Name5", "Name6" };
- foreach (string name in strNames)
- {
- Console.WriteLine(name); // BreakPoint
- }
- int temp = 4;
- for (int i = 1; i <= 10; i++)
- {
- if (i > 6)
- temp = 5;
- }
- }
- public static void Method1()
- {
- Console.WriteLine("Break Point in Method1"); // BreakPoint
- }
- public static void Method2()
- {
- Console.WriteLine("Break Point in Method2"); // BreakPoint
- Console.WriteLine("Break Point in Method2"); // BreakPoint
- }
- public static void Method3()
- {
- Console.WriteLine("Break Point in Method3"); // Breakpoint
- }
- }
3.3 條件斷點(Conditional Breakpoint)
- class Program
- {
- static void Main(string[] args)
- {
- string [] strNames = { "Name1","Name2", "Name3", "Name4", "Name5", "Name6"};
- foreach(string name in strNames)
- {
- Console.WriteLine(name); // Breakpoint is here
- }
- }
- }
- Is True
- Has Changed
3.4 導入/導出斷點(Import / Export Breakpoint)
3.5 斷點命中計數(Breakpoint Hit Count)
3.6 Breakpoint When Hit
3.7 斷點篩選器(Breakpoint Filter)
4 數據便籤(Data Tip)
4.1 Pin Inspect Value During Debugging
4.2 Drag-Drop Pin Data Tip
4.3 Adding Comments
4.4 Last Session Debugging Value
4.5 Import Export Data Tips
4.6 Change Value Using Data Tips
4.7 Clear Data Tips
5 監視窗口(Watch Windows)
5.1 局部變量(Locals)
5.2 自動窗口(Autos)
5.3 監視(Watch)
有4個可同時使用的監視窗口。
圖:多個監視窗口
5.3.1 Creating Object ID
5.4
6 即時窗口(Immediate Window)
7 調用堆棧(Call Stack)
8 調試多線程程序(Debugging Multithreaded Program)
8.1 Exploring Threads Window
8.2 Flag Just My Code
8.3 Break Point Filter - Multithread Debugging
9 調試並行程序(Debugging Parallel Program)
9.1 Parallel Task and Parallel Stacks
10 Debugging with IntelliTrace
10.1 Overview
10.2 Mapping with IntelliTrace
10.3 Filter IntelliTrace Data
11 調試常用快捷鍵(Useful Shortcut Keys For VS Debugging)
Shortcut Keys | Descriptions |
Ctrl-Alt-V, A | Displays the Auto window |
Ctrl-Alt-B | Displays the Breakpoints dialog |
Ctrl-Alt-C | Displays the Call Stack |
Ctrl-Shift-F9 | Clears all of the breakpoints in the project |
Ctrl-F9 | Enables or disables the breakpoint on the current line of code |
Ctrl-Alt-E | Displays the Exceptions dialog |
Ctrl-Alt-I | Displays the Immediate window |
Ctrl-Alt-V, L | Displays the Locals window |
Ctrl-Alt-Q | Displays the Quick Watch dialog |
Ctrl-Shift-F5 | Terminates the current debugging session, rebuilds if necessary, and starts a new debugging session. |
Ctrl-F10 | Starts or resumes execution of your code and then halts execution when it reaches the selected statement. |
Ctrl-Shift-F10 | Sets the execution point to the line of code you choose |
Alt-NUM * | Highlights the next statement |
F5 | If not currently debugging, this runs the startup project or projects and attaches the debugger. |
Ctrl-F5 | Runs the code without invoking the debugger |
F11 | Step Into |
Shift-F11 | Executes the remaining lines out from procedure |
F10 | Executes the next line of code but does not step into any function calls |
Shift-F5 | Available in break and run modes, this terminates the debugging session |
Ctrl-Alt-H | Displays the Threads window to view all of the threads for the current process |
F9 | Sets or removes a breakpoint at the current line |
Ctrl-Alt-W, 1 | Displays the Watch 1 window to view the values of variables or watch expressions |
Ctrl-Alt-P | Displays the Processes dialog, which allows you to attach or detach the debugger to one or more running processes |
Ctrl-D,V | IntelliTrace Event |
12 深入學習(Further Study)
13 總結(Summary)
“自動窗口”(Autos):當前使用的變量
“局部窗口”(Locals):在範圍內的所有變量
“監視N”(Watch):可定製(N從1到4)
Step Into(逐語句):執行並移動到下一條語句(實際上,跳入上一條語句的代碼塊,此代碼塊的第一條)
Step Over(逐過程):執行並跳到下一條語句,但不進入上一條語句的代碼塊
Step Out(跳出):執行到代碼塊結尾
命令窗口(Command)
即時窗口(Immediate):主要用於計算表達式