摘要:因為帳戶的配置和相互作用可以在多個不同步驟中引起中斷,所以調試 ASP.NET 可能是件棘手的事情。本文概括論述與調試 ASP.NET 應用程式相關的常見問題,列舉錯誤樣本並解釋如何解決這些問題。
本頁內容
|
簡介 |
|
ASP.NET調試。 |
|
常規調試 |
|
因果性調試:Web 服務用戶端和 Web 服務之間的步驟 |
|
遠端偵錯 |
簡介
在過去的幾個月中,我曾與許多存在調試問題的使用者一起工作,他們之中有一部分來自 Microsoft 內部。我發現,如果使用者能得到正確的診斷,則很多常見的錯誤和問題便迎刃而解。因此,我寫了這篇文章,旨在向使用者提供在使用調試器時能協助他們解決問題的資訊。
本文檔包含:
• |
錯誤訊息對話方塊或錯誤情況描述 |
• |
上述錯誤的原因。 |
• |
上述問題的解決方案。 |
在此,我對 VCS 調試器團隊和協助我完成本文及向我提供精彩反饋的人士表示感謝。
ASP.NET調試。
注 如果在本部分中找不到需要的錯誤訊息,請查看處理常規調試問題部分或處理遠端偵錯問題部分。
訊息:無法在 Web 伺服器中啟動調試。
圖 1. 無法啟動調試錯誤訊息
原因 1:未將 IIS 應用程式配置為使用 Integrated Windows Authentication。確保已選中“Authentication Method”對話方塊中的 Integrated Windows Authentication 複選框, 2 所示。
圖 2. 啟用整合身分識別驗證
原因 2:檢查 IIS 的 Enable HTTP Keep Alive 選項。如果它是關閉的,則可能需要將其開啟,再嘗試調試。
訊息:您沒有調試伺服器的許可權。
圖 3. 無調試許可權
原因 1:確保已啟用 Integrated Windows Authentication。可能的原因是僅為 IIS 的 Directory 安全啟用了 Basic authentication。
原因 2:如果您在使用 Integrated Windows Authentication,則需要確保您的使用者帳戶能夠完全控制 IIS 的目錄。
原因 3:如果使用完整的機器名(如 machinename.domainname.something)建立 Web 項目,則該 Web 網站會被識別為 網際網路網站。因此,Internet Explorer 的預設設定將對登入行為產生影響。在這種情況下,您需要使用當前帳戶在具有 IE 設定的“Internet”地區啟用登入。
然而,這不是 Internet Explorer 的預設設定,因此最好僅使用機器名來建立項目,將圖 4 用作 Security Settings 的指南。
圖 4. 設定 Internet Explorer 身分識別驗證
訊息:發送調試 HTTP 請求時發生伺服器端錯誤。
圖 5. 調試期間的伺服器端錯誤
原因 1:Web 應用程式沒有應用程式名稱。為此,請使用 IIS MMC 來檢查 Web 項目的屬性,確保 Web 項目具有應用程式名稱。當圖 6 中的紅色輪廓出現時,應該出現應用程式名稱。
圖 6. 設定應用程式名稱
原因 2:如果使用的是 NTFS 檔案格式,則確保“aspnet”具有“wwwroot”或虛擬目錄檔案夾上的適當許可權,才能訪問和寫入這些檔案夾。
訊息:沒有對項目進行配置以接受調試。
圖 7. 未針對調試設定項目
如果出現這一錯誤訊息,則需要針對調試配置 Web。為此,需要在 web.config 檔案中設定 debug = true。此檔案位於 Web 專案檔夾中。
您可以啟動調試,同時不出現錯誤訊息,但是不能到達斷點。
您使用 F5 鍵啟動了調試,看起來好像正確啟動了調試並且也正確啟動了 Internet Explorer,但是您不能到達程式碼後置的代碼中的斷點。
原因 1: 在項目屬性中未啟用 Asp.net 調試。按照圖 8 所示將該項設定為 True。
圖 8. 啟用 ASP.NET 調試
在 VB 項目中,UI 有所不同,但可以輕鬆地識別等效項。
原因 2:請確保使用匹配的偵錯符號檔案載入期望的 DLL。可以使用 Modules 視窗來檢查這一點。
訊息:未正確安裝調試器。
圖 9. 未正確安裝調試器
如果看到這一問題,請在 Console Application 項目中檢查調試功能。如果控制台應用程式項目顯示 10 所示的錯誤訊息,則表示未正確安裝 .NET Framework 應用程式。
圖 10. 無法啟動調試
需要通過執行“regsvr32 mscordbi.dll”來手動註冊“mscordbi.dll”。
訊息:伺服器不支援對 ASP.NET 或 ATL 伺服器應用程式的調試。
圖 11. 無法啟動調試
如果您在機器上安裝了 Windows XP Pro 或 Windows 2000 Pro,則可能需要考慮 Visual Studio 7 和 IIS 之間的安裝順序。如果在 Visual Studio 7 之後安裝 IIS,則會發生這一錯誤。在這種情況下,請使用“aspnet_regiis.exe –i”註冊“aspnet_isapi.dll”。
訊息:訪問被拒絕。檢驗您是否是管理員或某個群組成員。
圖 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 伺服器調試。
圖 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 檔案的 中的值太大。預設單位是KB而非位元組,因此如果更改此數字,使用了錯誤的單位,則可能導致調試問題。
訊息:訪問被拒絕。
圖 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 位於
常規調試
這些案例基於 Console application 項目類型。
訊息:無法啟動調試。
圖 15. 無法啟動程式
導致圖 15 中所示問題的原因是沒有正確註冊 mscordbi.dll。此問題的補救辦法是手動註冊該檔案。
訊息:無法啟動調試。訪問被拒絕。
圖 16. 拒絕訪問錯誤訊息
確保正確啟動 Machine Debugger Manager 服務,並且確保您是 Debugger Users 或 Administrators 的成員。
我可以啟動託管調試,但是 PDB 不載入,並且不能遇到任何斷點。
如果正確啟動了調試器,但不能遇到任何斷點,則您可能需要檢查 diasymreader.dll 的安裝。可能沒有註冊該檔案。要註冊該檔案,需要執行以下操作:
regsvr32 \diasymreader.dll
託管調試不運行
在進程建立 CLR 對象前,以 CLR 模式串連本地進程。託管調試不運行。
解決方案 1:在進程中使用了 CLR 代碼後再串連進程。
解決方案 2:以 InterOp 模式串連進程。在這種情況下,不必在調用 CLR 代碼之後再串連進程。
託管調試器不響應
使用Managed 程式碼啟動調試時,調試器不響應。
解決方案:確保已停止並禁用 .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],0e jne CConsole.WriteLine("what's up?");mov ecx,dword ptr ds:[01C50070h]call dword ptr ds:[02F0257Ch]c jmpcatch(Exception e)e mov dword ptr [ebp-1Ch],eaxcall C0846jmp}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 theweb server. Not enough storage is available to complete this operation.
或者在進行 ASP.NET 調試期間看到這一訊息:
Error while trying to run project: Unable to start debugging on the webserver. 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 物件共用出來,其他機器上的任何匹配使用者(具有相同使用者名稱和相同密碼)都可能可以訪問您的共用對象。
我極力建議,如果您要使用這一變通方法,則請確保所有使用者帳戶都具有強密碼,否則應該設定一個網路孤島來調試機器,以防止惡意攻擊。