上面這個程序是極其簡單的,後面的文章中我將用一個比較復雜的例子來調試。我們現在一步步的開始吧!
不過請注意我使用"/*… …*/"來標記了注釋和一些相關文字的說明。
開始->運行->Cmd,ok,現在打開了一個Dos窗口,編譯你的C#程序。(下面的所有輸入動作是一個整體的調試過程,請注意不要混淆我加在後面的注釋。而且也請依照顏色來判斷那些是我輸入的數據,那些是計算機輸出的數據)
調試開始:
第一步:編譯上面的程序
E:\Cs>csc /debug Test-1.cs
/* 注意這裡我在編譯這個Test-1.cs是加了 "debug"這個參數的(這個debug後面的參數就請你老人家自己勤快一下,看看MSDN),如果沒有什麼錯誤的話我們繼續。需要提醒大家一點的是有的用戶的系統PATH中沒有指定Csc.exe所在的位置,在運行"Csc.exe"的時候,未必能夠找到,那個時候你就必須指定Csc.exe的路徑,比如我的Csc.exe的路徑就是:"E:\Program Files\Microsoft.NET\FrameworkSDK\Bin\Cordbg.exe",說這麼一些廢話其實是因為有的時候在安裝了VS7(Beta 2)的電腦上不能直接調用這個東西。
編譯過後用Dir查一下你的文件路徑,除了多了一個Test-1.exe外還,多了另外一個Test-1.pdb,這是一個存儲調試信息的文檔。
*/
第二步:裝載你的程序;(下面就是你裝載一個程序後系統輸出的信息)
E:\Cs>Cordbg Test-1.exe
Microsoft (R) Common Language Runtime Test Debugger Shell.
Version 1.0.2914.16 Copyright (C) Microsoft Corp. 1998-2001. All rights reserved
.
(cordbg) run Test-1.exe
Process 22952/0x59a8 created.
Warning: couldn't load symbols for c:\winnt\microsoft.net\framework\v1.0.2914\ms
corlib.dll
[thread 0x59a4] Thread created.
012: Console.WriteLine("Please Enter Your Name. Thanks!");
(cordbg)
/* 裝載程序還有另外一種方法,我將在以後的文檔中加以說明。*/
第三步:調試你的程序;(下面的出現的將是調試程序的時候所有的代碼,請注意我的注釋是加在後面的)
(cordbg)sh 18
001: /*
002: 'Data:2001-12-13
003: 'Author:龍山文化
004: 'One Csharp Test Program
005: */
006: using System;
007: class Test_1
008: {
009: static void Main()
010: {
011: string str;
012:* Console.WriteLine("Please Enter Your Name. Thanks!");
013: str=Console.ReadLine();
014: Console.WriteLine("------------------------------------\r\n");
015: Console.WriteLine("Dear "+str+", Welcome To Csharp's World!\r\n");
016: Console.WriteLine("------------------------------------\r\n");
017: }
018: }
/*"sh" 命令是查看被調試程序源代碼的,其實這個源代碼還是從Test-1.cs中裝載的,如果你的Test-1.cs不存在的話,在裝載被調試的程序的時候會出現如下錯誤代碼:
"Error loading source file 'E:\Cs\Test-1.cs': File not found"
當然程序還是可以運行的。只不過原來的最後一行的C#代碼顯示,變成了匯編代碼的顯示。關於匯編方式的顯示我將在後面的文章中加以介紹。
*/
(cordbg) b 12
Breakpoint #1 has bound to E:\Cs\Test-1.exe.
#1 E:\Cs\Test-1.cs:12 Main+0x0(il) [active]
… …
/*通過b 命令設置了程序斷點,天啦!你不要告訴我連什麼是斷點都不知道喲。如果你不知道的話,那麼老大你還是不要看了吧。
設置斷點調試程序調試程序最重要的一個方法
b 命令也可以查看所有已經被設置的斷點,如下所示
*/
(cordbg) b
#1 E:\Cs\Test-1.cs:12 Main+0x0(il) [active]
#2 E:\Cs\Test-1.cs:13 Main+0xa(il) [active]
#3 E:\Cs\Test-1.cs:14 Main+0x10(il) [active]
(cordbg) con
Please Enter Your Name. Thanks!
break at #2 E:\Cs\Test-1.cs:13 Main+0xa(il) [active]
013: str=Console.ReadLine();
/*
con 命令表示繼續執行程序代碼,一直執行到下一個斷點,本來程序被裝載後默認設置了一個斷點,在使用sh命令察看源代碼的地方某行代碼的序號被加了一個"*",這行代碼就算是系統默認的斷點設置。
另外有個"next" 命令也可以用來調試,但是表示執行到下一行,而不是下一個斷點行。請注意區分,你也可以實際的操作來看看具體的效果
*/
(cordbg) con
龍山文化
break at #3 E:\Cs\Test-1.cs:14 Main+0x10(il) [active]
014: Console.WriteLine("------------------------------------\r\n");
(cordbg) p str
str=(0x00ba3414) "龍山文化"
/*
上面的調試代碼利用 con命令執行到下一個斷點:獲得了一個系統輸入字符串"龍山文化"
並且利用"p" 命令打印出了變量"str"中的數據,在調試程序的時候打印程序中的程序變量是很關鍵的動作。
*/
(cordbg) con
------------------------------------
Dear 龍山文化, Welcome To Csharp's World!
------------------------------------
[thread 0x5fb0] Thread created.
[thread 0x59a8] Thread exited.
Process exited.
/*
con執行下一個斷點後,程序運行到結束。
*/
到這步為止,一個最簡單的C#程序就通過Cordbg通過最簡單的方式調試完成了,在後面的文章中我將會給你展示更加復雜的程序的調試