釋出日期: 8/16/2005 | 更新日期: 8/16/2005
Min Kwan Park
Visual C# Debugger QA Team
Microsoft Corporation
摘要:因為帳戶的配置和互相作用可以在多個不同步驟中引起中斷,是以調試 ASP.NET 可能是件棘手的事情。本文概括論述與調試 ASP.NET 應用程式相關的常見問題,列舉錯誤示例并解釋如何解決這些問題。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuMXZyFWdxN3Mvw1cldWYtl2Lc52bt12bD5iMQ5UTvw1clRXYsBXblR3LclnclxGbhd2LclnchJnYpx2Lc12bj5Cdm92cvJ3Yp1mL3d3dvw1LcpDc0RHaiojIsJye.gif)
本頁内容
| 簡介 |
| ASP.NET調試。 |
| 正常調試 |
| 因果性調試:Web 服務用戶端和 Web 服務之間的步驟 |
| 遠端調試 |
簡介
在過去的幾個月中,我曾與許多存在調試問題的使用者一起工作,他們之中有一部分來自 Microsoft 内部。我發現,如果使用者能得到正确的診斷,則很多常見的錯誤和問題便迎刃而解。是以,我寫了這篇文章,旨在向使用者提供在使用調試器時能幫助他們解決問題的資訊。
本文檔包含:
• | 錯誤消息對話框或錯誤情況描述 |
• | 上述錯誤的原因。 |
• | 上述問題的解決方法。 |
在此,我對 VCS 調試器團隊和幫助我完成本文及向我提供精彩回報的人士表示感謝。
傳回頁首
ASP.NET調試。
注如果在本部分中找不到需要的錯誤消息,請檢視處理正常調試問題部分或處理遠端調試問題部分。
消息:無法在 Web 伺服器中啟動調試。未将 IIS 應用程式配置為使用
Integrated Windows Authentication。確定已選中“Authentication Method”對話框中的
Integrated Windows Authentication複選框,如圖 2 所示。
檢查 IIS 的
Enable HTTP Keep Alive選項。如果它是關閉的,則可能需要将其打開,再嘗試調試。
消息:您沒有調試伺服器的權限。確定已啟用
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 的指南。
Web 應用程式沒有應用程式名。為此,請使用 IIS MMC 來檢查 Web 項目的屬性,確定 Web 項目具有應用程式名。當圖 6 中的紅色輪廓出現時,應該出現應用程式名。
如果使用的是 NTFS 檔案格式,則確定“aspnet”具有“wwwroot”或虛拟目錄檔案夾上的适當權限,才能通路和寫入這些檔案夾。
消息:沒有對項目進行配置以接受調試。如果出現這一錯誤消息,則需要針對調試配置 Web。為此,需要在 web.config 檔案中設定 debug = true。此檔案位于 Web 項目檔案夾中。
您可以啟動調試,同時不出現錯誤消息,但是不能到達斷點。您使用
F5鍵啟動了調試,看起來好像正确啟動了調試并且也正确啟動了 Internet Explorer,但是您不能到達代碼隐藏的代碼中的斷點。
原因 1 :在項目屬性中未啟用
Asp.net 調試。按照圖 8 所示将該項設定為 True。
在 VB 項目中,UI 有所不同,但可以輕松地識别等效項。
原因 2 :請確定使用比對的調試符号檔案加載期望的 DLL。可以使用
Modules視窗來檢查這一點。
消息:未正确安裝調試器。如果看到這一問題,請在 Console Application 項目中檢查調試功能。如果控制台應用程式項目顯示如圖 10 所示的錯誤消息,則表示未正确安裝 .NET Framework 應用程式。
需要通過執行“regsvr32 mscordbi.dll”來手動注冊“mscordbi.dll”。
消息:伺服器不支援對 ASP.NET 或 ATL 伺服器應用程式的調試。如果您在機器上安裝了 Windows XP Pro 或 Windows 2000 Pro,則可能需要考慮 Visual Studio 7 和 IIS 之間的安裝順序。如果在 Visual Studio 7 之後安裝 IIS,則會發生這一錯誤。在這種情況下,請使用“aspnet_regiis.exe –i”注冊“aspnet_isapi.dll”。
消息:通路被拒絕。檢驗您是否是管理者或某個組成員。您可能不是該計算機上
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 。 |
您可能安裝了
IIS Lockdown工具。如果這樣,則查找 urlscan.ini 檔案,并将 DEBUG(區分大小寫)添加到 [allowverbs] 部分中。
原因 2 :如果将域控制器用作伺服器,并且項目是使用機器名(非完整域名)建立的,則可能需要将項目的 URL 更改為完整域名。
原因 3 :如果将 IIS 設定為使用專用 IP(例如
Web site identification,可以在 IIS MMC 的 IIS 設定中找到這一選項),則可能看到這條錯誤消息。在這種情況下,需要更改項目名,直接使用 IP 位址。對于現有項目,需要更改項目以使用 IP 位址,而不用通過編輯 .sln 檔案和 .webinfo 檔案使用機器名。
原因 4 :web.config 檔案的 中的值太大。預設機關是千位元組而非位元組,是以如果更改此數字,使用了錯誤的機關,則可能導緻調試問題。
消息:通路被拒絕。您可能是
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/。
傳回頁首
正常調試
這些案例基于
Console application項目類型。
消息:無法啟動調試。導緻圖 15 中所示問題的原因是沒有正确注冊 mscordbi.dll。此問題的補救辦法是手動注冊該檔案。
消息:無法啟動調試。通路被拒絕。確定正确啟動
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”語句體相比對。當代碼功能正确時,顯示就不正确了。
傳回頁首
因果性調試: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 服務。
傳回頁首
遠端調試
無法檢視遠端機器上的任何程序確定在遠端機器上安裝了
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 |
轉到原英文頁面