天天看點

将 Visual Studio .NET 調試器用于 ASP.NET 應用程式

釋出日期: 8/16/2005 | 更新日期: 8/16/2005

Min Kwan Park

Visual C# Debugger QA Team

Microsoft Corporation

摘要:

因為帳戶的配置和互相作用可以在多個不同步驟中引起中斷,是以調試 ASP.NET 可能是件棘手的事情。本文概括論述與調試 ASP.NET 應用程式相關的常見問題,列舉錯誤示例并解釋如何解決這些問題。

将 Visual Studio .NET 調試器用于 ASP.NET 應用程式
本頁内容
将 Visual Studio .NET 調試器用于 ASP.NET 應用程式
簡介
将 Visual Studio .NET 調試器用于 ASP.NET 應用程式
ASP.NET調試。
将 Visual Studio .NET 調試器用于 ASP.NET 應用程式
正常調試
将 Visual Studio .NET 調試器用于 ASP.NET 應用程式
因果性調試:Web 服務用戶端和 Web 服務之間的步驟
将 Visual Studio .NET 調試器用于 ASP.NET 應用程式
遠端調試

簡介

在過去的幾個月中,我曾與許多存在調試問題的使用者一起工作,他們之中有一部分來自 Microsoft 内部。我發現,如果使用者能得到正确的診斷,則很多常見的錯誤和問題便迎刃而解。是以,我寫了這篇文章,旨在向使用者提供在使用調試器時能幫助他們解決問題的資訊。

本文檔包含:

錯誤消息對話框或錯誤情況描述
上述錯誤的原因。
上述問題的解決方法。

在此,我對 VCS 調試器團隊和幫助我完成本文及向我提供精彩回報的人士表示感謝。

将 Visual Studio .NET 調試器用于 ASP.NET 應用程式

傳回頁首

ASP.NET調試。

如果在本部分中找不到需要的錯誤消息,請檢視處理正常調試問題部分或處理遠端調試問題部分。

消息:無法在 Web 伺服器中啟動調試。
将 Visual Studio .NET 調試器用于 ASP.NET 應用程式
1. 無法啟動調試錯誤消息 原因 1

未将 IIS 應用程式配置為使用

Integrated Windows Authentication

。確定已選中“Authentication Method”對話框中的

Integrated Windows Authentication

複選框,如圖 2 所示。

将 Visual Studio .NET 調試器用于 ASP.NET 應用程式
2. 啟用內建身份驗證 原因 2

檢查 IIS 的

Enable HTTP Keep Alive

選項。如果它是關閉的,則可能需要将其打開,再嘗試調試。

消息:您沒有調試伺服器的權限。
将 Visual Studio .NET 調試器用于 ASP.NET 應用程式
3. 無調試權限 原因 1

確定已啟用

Integrated Windows Authentication

。可能的原因是僅為 IIS 的 Directory 安全啟用了

Basic authentication

原因 2

如果您在使用

Integrated Windows Authentication

,則需要確定您的使用者帳戶能夠完全控制 IIS 的目錄。

原因 3

如果使用完整的機器名(如 machinename.domainname.something)建立 Web 項目,則該 Web 站點會被識别為 Internet 站點。是以,Internet Explorer 的預設設定将對登入行為産生影響。在這種情況下,您需要使用目前帳戶在具有 IE 設定的“Internet”區域啟用登入。

然而,這不是 Internet Explorer 的預設設定,是以最好僅使用機器名來建立項目,将圖 4 用作 Security Settings 的指南。

将 Visual Studio .NET 調試器用于 ASP.NET 應用程式
4. 設定 Internet Explorer 身份驗證 消息:發送調試 HTTP 請求時發生伺服器端錯誤。
将 Visual Studio .NET 調試器用于 ASP.NET 應用程式
5. 調試期間的伺服器端錯誤 原因 1

Web 應用程式沒有應用程式名。為此,請使用 IIS MMC 來檢查 Web 項目的屬性,確定 Web 項目具有應用程式名。當圖 6 中的紅色輪廓出現時,應該出現應用程式名。

将 Visual Studio .NET 調試器用于 ASP.NET 應用程式
6. 設定應用程式名 原因 2

如果使用的是 NTFS 檔案格式,則確定“aspnet”具有“wwwroot”或虛拟目錄檔案夾上的适當權限,才能通路和寫入這些檔案夾。

消息:沒有對項目進行配置以接受調試。
将 Visual Studio .NET 調試器用于 ASP.NET 應用程式
7. 未針對調試配置項目

如果出現這一錯誤消息,則需要針對調試配置 Web。為此,需要在 web.config 檔案中設定 debug = true。此檔案位于 Web 項目檔案夾中。

您可以啟動調試,同時不出現錯誤消息,但是不能到達斷點。

您使用

F5

鍵啟動了調試,看起來好像正确啟動了調試并且也正确啟動了 Internet Explorer,但是您不能到達代碼隐藏的代碼中的斷點。

原因 1

在項目屬性中未啟用

Asp.net 調試

。按照圖 8 所示将該項設定為 True。

将 Visual Studio .NET 調試器用于 ASP.NET 應用程式
8. 啟用 ASP.NET 調試

在 VB 項目中,UI 有所不同,但可以輕松地識别等效項。

原因 2

請確定使用比對的調試符号檔案加載期望的 DLL。可以使用

Modules

視窗來檢查這一點。

消息:未正确安裝調試器。
将 Visual Studio .NET 調試器用于 ASP.NET 應用程式
9. 未正确安裝調試器

如果看到這一問題,請在 Console Application 項目中檢查調試功能。如果控制台應用程式項目顯示如圖 10 所示的錯誤消息,則表示未正确安裝 .NET Framework 應用程式。

将 Visual Studio .NET 調試器用于 ASP.NET 應用程式
10. 無法啟動調試

需要通過執行“regsvr32 mscordbi.dll”來手動注冊“mscordbi.dll”。

消息:伺服器不支援對 ASP.NET ATL 伺服器應用程式的調試。
将 Visual Studio .NET 調試器用于 ASP.NET 應用程式
11. 無法啟動調試

如果您在機器上安裝了 Windows XP Pro 或 Windows 2000 Pro,則可能需要考慮 Visual Studio 7 和 IIS 之間的安裝順序。如果在 Visual Studio 7 之後安裝 IIS,則會發生這一錯誤。在這種情況下,請使用“aspnet_regiis.exe –i”注冊“aspnet_isapi.dll”。

消息:通路被拒絕。檢驗您是否是管理者或某個組成員。
将 Visual Studio .NET 調試器用于 ASP.NET 應用程式
12. 通路被拒絕

您可能不是該計算機上

Debugger Users

組的成員。将您的使用者帳戶添加到計算機上的

Debugger Users

組中即可解決此錯誤。

要将您的使用者帳戶添加到

Debugger Users

組中,需要執行以下操作:

1. 作為 Administrator 登入。
2. 運作 Administrator tools 中的 Computer management
3. 選擇 Local users and groups/groups 節點。
4. 輕按兩下右邊窗格中的 Debugger Users 組。
5. 單擊 Debugger users properties 對話框中的 Add 按鈕。
6. 鍵入使用者帳戶并單擊 OK
消息:無法啟動 ASP.NET ATL 伺服器調試。
将 Visual Studio .NET 調試器用于 ASP.NET 應用程式
13. 未安裝 ASP.NET ATL 原因 1

您可能安裝了

IIS Lockdown

工具。如果這樣,則查找 urlscan.ini 檔案,并将 DEBUG(區分大小寫)添加到 [allowverbs] 部分中。

原因 2

如果将域控制器用作伺服器,并且項目是使用機器名(非完整域名)建立的,則可能需要将項目的 URL 更改為完整域名。

原因 3

如果将 IIS 設定為使用專用 IP(例如

Web site identification

,可以在 IIS MMC 的 IIS 設定中找到這一選項),則可能看到這條錯誤消息。在這種情況下,需要更改項目名,直接使用 IP 位址。對于現有項目,需要更改項目以使用 IP 位址,而不用通過編輯 .sln 檔案和 .webinfo 檔案使用機器名。

原因 4

web.config 檔案的 中的值太大。預設機關是千位元組而非位元組,是以如果更改此數字,使用了錯誤的機關,則可能導緻調試問題。

消息:通路被拒絕。
将 Visual Studio .NET 調試器用于 ASP.NET 應用程式
14. 通路被拒絕 原因:

您可能是

Debugger Users

組的成員,但是您不具有調試 aspnet 輔助程序的權限,因為您不是

aspnet

使用者帳戶或

Administrators

組的成員。将您的使用者帳戶添加到機器上的

Administrators

組即可解決此問題。

無法使用包括檔案進行調試

在 ASPX 中,無法使用包括檔案進行調試。将舊的 ASP 項目轉換為 ASPX 時,往往産生包括檔案。

如果通過 包括檔案,則可能無法正确調試該包括檔案。您需要使用 來代替。

更改密碼後,需要登出 / 登入才能進行 ASP.NET 調試。

更改密碼後,需要登出,然後再登入才能正确進行 ASP.NET 調試。

安裝 Windows2000 SP4 後, ASP.NET 調試不能運作,同時顯示消息 通路被拒絕

此問題的解決方法是,使用 regsvr32 –i aspnet_isap.dll 重新注冊 aspnet_isap.dll。

僅在首次加載頁面時遇到斷點。

針對這一特定問題,可能存在多種原因,但是最大的可能性是您在 web.config 檔案中設定了頁面緩存選項。

如果在 web.config 中看到類似于 的内容,則需要将值設定為“False”,以關閉 Web 頁面緩存。更改該設定并重新整理頁面後,可能遇到斷點。

您需要共享 Web 伺服器以進行調試,但是不想讓其他使用者成為計算機管理者。

在 Visual Studio .NET 中,以下二者可以确定使用者是否可以進行調試。其中之一是

Debugger Users

組,另一個是使用者權限,如管理者、Power User 或 SEDebug。

Debugger Users 組确定使用者是否可以通路 VS 調試元件(主要是 MDM-Machine Debug Manager,Visual Studio 的一部分),是以成為該組的成員意味着保證可以通路 MDM。是以在這一點上,您可以調試開放程序并檢視機器上的程序清單。

不過在此之後,您是否可以調試其他使用者的程序取決于您的權限。例如,如果您想調試别人的本地程序,則需要具有 SEDebug 權限.針對其他使用者的托管程序,您應該是該機器上的管理者,才有權進行調試。

因為存在這一限制,是以在您的方案中,應該授予學生管理者權限。否則,預設情況下無法對 ASP.NET 輔助程序進行調試。

我們有一種變通方法。Cassini 是一個獨立的小型 ASP.NET 伺服器。對學生來說,他們可以使用 Cassini 進行開發,稍後将開發結果部署到實際伺服器上來送出結果。Cassini 位于 http://www.asp.net/Projects/Cassini/Download/。

将 Visual Studio .NET 調試器用于 ASP.NET 應用程式

傳回頁首

正常調試

這些案例基于

Console application

項目類型。

消息:無法啟動調試。
将 Visual Studio .NET 調試器用于 ASP.NET 應用程式
15. 無法啟動程式

導緻圖 15 中所示問題的原因是沒有正确注冊 mscordbi.dll。此問題的補救辦法是手動注冊該檔案。

消息:無法啟動調試。通路被拒絕。
将 Visual Studio .NET 調試器用于 ASP.NET 應用程式
16. 拒絕通路錯誤消息

確定正确啟動

Machine Debugger Manager

服務,并且確定您是

Debugger Users

Administrators

的成員。

我可以啟動托管調試,但是 PDB 不加載,并且不能遇到任何斷點。

如果正确啟動了調試器,但不能遇到任何斷點,則您可能需要檢查 diasymreader.dll 的安裝。可能沒有注冊該檔案。要注冊該檔案,需要執行以下操作:

regsvr32 /diasymreader.dll
      
托管調試不運作

在程序建立 CLR 對象前,以 CLR 模式連接配接本地程序。托管調試不運作。

解決方案 1

在程序中使用了 CLR 代碼後再連接配接程序。

解決方案 2

以 InterOp 模式連接配接程序。在這種情況下,不必在調用 CLR 代碼之後再連接配接程序。

托管調試器不響應

使用托管代碼啟動調試時,調試器不響應。

解決方案:

確定已停止并禁用

.NET FrameworkSupport

服務(僅停止該服務還不夠)。

如果沒有運作

.NET FrameworkSupport

服務,則禁用

IIS admin

服務。

使用 C# 代碼單步調試不正确

考慮以下代碼:

string someStr; 
someStr = "SomeValue"; 
if(someStr == null) 
  Console.WriteLine("what's up?"); 

try 
{ 
} 
catch(Exception e) 
{ 
}
      

如果使用此代碼,則會看到遇到“if”語句時,指令指針将移動到“if”語句體 (Console.WriteLine("what's up?");)。

這不是一個調試器 bug,而是一個衆所周知的 try catch 塊調試資訊問題。請參見以下調試器中 try catch 塊示例的反彙編代碼。

if(someStr == null) 
a cmp        dword ptr [ebp-18h],0 
e jne        C 

Console.WriteLine("what's up?"); 
 mov        ecx,dword ptr ds:[01C50070h] 
 call       dword ptr ds:[02F0257Ch] 
c jmp        

catch(Exception e) 
e mov        dword ptr [ebp-1Ch],eax 
 call       C0846 
 jmp        

} 
 nop      
      

值沒有比對時,指令指針移動到 0000003c jmp 行,但是該行已經錯誤地與“if”語句體相比對。當代碼功能正确時,顯示就不正确了。

将 Visual Studio .NET 調試器用于 ASP.NET 應用程式

傳回頁首

因果性調試:Web 服務用戶端和 Web 服務之間的步驟

無法從 Web 服務用戶端到 Web 服務設定調試

預設設定不允許從 Web 服務用戶端進入 Web 服務。它的運作方式類似 step-over。

ASPNET 輔助程序(aspnet_wp.exe 或 w3wp.exe)在“aspnet”或“network service”使用者帳戶之下運作,而這些帳戶沒有通過 DCOM 通路 MDM 的權限。是以,需要将這些帳戶添加到

Debugger Users

組中。

啟用 Web 服務模拟後,無法再使用因果性步驟。

使用“web.config”為 Web 服務啟用模拟時,不能從 Web 服務用戶端代碼進入 Web 服務代碼。因為,它的運作方式類似于 step over。

您需要執行以下操作來更正用戶端和服務之間的步驟。

關閉 IIS 中的 Anonymous access
更改用戶端代碼,将憑據設定為 Web 服務,如下所示:
Service1 obj = new Service1();
obj.Credentials = System.Net.CredentialCache.DefaultCredentials;

在此之後,您将能夠從用戶端進入 Web 服務。

這些操作是必需的,因為當您進入 Web 服務時,某些 .NET Framework 元件需要使用系統級調試器元件 (MDM) 來共同建立它。如果不能提供正确的憑據,則此步驟将失敗。如果沒有這些正确的憑據,“step into”的運作将類似于“step over”。

調試器挂起

如果 Web 服務用戶端代碼在 STA (Single Thread Apartment) 模型中運作,并且它在等待異步調用完成,如下所示:

Service1 obj = new Service1(); 
System.IAsyncResult ar = obj.BeginHelloWorld(new System.AsyncCallback(Class1.Handle),obj); 
while(ar.IsCompleted != true) 
{ 
  System.Threading.Thread.Sleep(1000); 
}
      

則調試器将挂起。發生此挂起操作,原因在于調試器中的代碼已鎖定一個調試器元件。解決方案 1 是更改代碼以使用與事件或 mutex 同步的線程。另一個解決方案是登出 csm.dll。第二個解決方案禁用 causality 步驟(從 Web 服務用戶端代碼到 Web 服務方法的步驟)。您可能需要手動連接配接 aspnet_wp.exe 才能調試 Web 服務。

将 Visual Studio .NET 調試器用于 ASP.NET 應用程式

傳回頁首

遠端調試

無法檢視遠端機器上的任何程序

確定在遠端機器上安裝了

Remote full debug

設定,并且您是

Debugger Users

組的成員。

RPC 問題而無法連接配接到遠端機器

以下資訊摘自 Mike Clay 撰寫的 KB 文章。

如果通過“Processes”對話框連接配接到遠端機器上時看到以下錯誤消息:

Error while trying to run project: Unable to start debugging on the 
web server. Not enough storage is available to complete this operation.
      

或者在進行 ASP.NET 調試期間看到這一消息:

Error while trying to run project: Unable to start debugging on the web
server. Unable to map the debug start page URL to a machine name.
      

則確定 RPC 在您的機器與遠端機器之間正确運作。下面的行為可能導緻 RPC 問題:

通過防火牆進行調試。Microsoft 不建議或支援通過防火牆的遠端 ASP.NET 調試。解決此問題最好的方式是,使用“終端服務”登入遠端伺服器并在本地進行調試。
RPC 的一種常見故障是無力解析遠端機器名。RPC 依靠名稱解析在計算機之間通信。如果未能将遠端伺服器機器名解析為正确的 IP 位址,則可能發生錯誤。
RPC 通信隻能單向流動,另一個方向卻不行。RPC 通信必須能夠從用于調試的機器到達遠端伺服器,并從遠端伺服器傳回用于調試的機器,這樣才能成功進行遠端調試。確定以雙向方式啟用 RPC 通信。

要分析 RPC,可以使用

RPCPing

工具。

遠端調試工作組中的機器失敗

當您的兩台 Windows XP Pro 機器都不在域中但在工作組中時,将發生這種情況。在它們之間進行遠端調試時,您根本無法通路遠端機器。

在工作組環境中,您需要確定兩台機器具有相同的使用者帳戶名和相同的密碼。否則,DCOM 進行身份驗證時将失敗。

另外,在 Windows XP Pro 上,将

Sharing and security model for local accounts

的預設安全設定設定為現在允許共享。下面是更改此設定的步驟:

1. 運作管理者工具中的 Local Security Settings
2. 選擇 Security settings/Local policies/Security 選項。
3. Network access : Sharing and Security model for local accounts Guest only - local users authenticate as Guest 更改為 Classic - local users authenticate as themselves
4. 重新啟動計算機。

應該将此更改應用于進行遠端調試的兩台機器。

更改設定後,即可使用同一名稱的使用者帳戶在兩台機器上進行遠端調試。請確定每台機器上的使用者帳戶都具有密碼。在某些情況下,沒有實際密碼機器不能運作。

然而,因為更改了安全模型的預設設定,是以可能公開下面的内容:

意外的檔案共享
意外的 DCOM 元件共享。

在進行這一更改之前,從遠端機器到您的機器的任何種類的連接配接都是以

Guest

身份進行的;但更改後,他/她即可接受使用本地使用者帳戶的身份驗證。是以,在調試案例中,如果将一個檔案夾或 DCOM 對象共享出來,其他機器上的任何比對使用者(具有相同使用者名和相同密碼)都可能可以通路您的共享對象。

我極力建議,如果您要使用這一變通方法,則請確定所有使用者帳戶都具有強密碼,否則應該設定一個網絡孤島來調試機器,以防止惡意攻擊。

相關書籍
Inside Microsoft Visual Studio .NET
Debugging Applications for Microsoft .NET and Microsoft Windows

轉到原英文頁面

繼續閱讀