2008-11-17 21 views
18

Khi tôi gỡ lỗi mã trang web ASP.NET của mình bằng cách sử dụng biểu tượng gỡ lỗi của Microsoft cho .NET .. Tôi tiếp tục nhận kết quả ngớ ngẩn này cho hầu hết các các biến khi tôi đang gỡ lỗi mã khuôn khổ .NET (tất nhiên là do Microsoft Symbol Server cung cấp, mà tôi đã nói với VS2008 để lấy thông tin, từ)Gỡ lỗi mã .NET với Máy chủ Biểu tượng của MS - VS không hiển thị các giá trị của biến

Cannot obtain value of local or argument 'cookie' as 
it is not available at this instruction pointer, possibly because 
it has been optimized away. 

Giống như mã tôi đang sử dụng đang sử dụng tối ưu, biên dịch mã. Nếu đó là trường hợp, tôi có thể nói nó KHÔNG để tối ưu hóa? Tôi đang ở trong cấu hình DEBUG. Nó rất bực bội vì tôi không thể gỡ lỗi .. vì tôi không thể nhìn thấy/lấy giá trị của các biến cục bộ khi tôi bước qua mã.

Bất kỳ manh mối/suy nghĩ nào?

Trả lời

19

Shawn Burke mô tả phương pháp vô hiệu hóa điều này trên blog của mình.

Đầu tiên, tạo CMD sẽ tải Visual Studio mà không cần tối ưu hóa JIT.

set COMPLUS_ZapDisable=1 
cd /d "%ProgramFiles%\Microsoft Visual Studio 9.0\Common7\ide\" 
start devenv.exe 
exit 

Khi trong dự án Visual Studio của bạn, hãy làm theo các bước sau:

1) Nhấp chuột phải vào tập tin dự án của bạn và chọn "Properties"

2) Chọn "Debug" tab và bỏ chọn "Bật quy trình Visual Studio Hosting"

3) Khởi chạy ứng dụng của bạn trong trình gỡ lỗi.

+0

Bạn làm tôi phấn khởi một thời gian, tôi thích điều này trong khi gỡ lỗi ứng dụng ASP.NET MVC 3 và nó đã tiết kiệm cho tôi rất nhiều thời gian, cảm ơn người đàn ông –

1

Mã khung công tác .NET được tối ưu hóa, vì vậy bạn sẽ không thể xem tất cả các biến vì chúng có thể không tồn tại trong mã được tối ưu hóa. Tôi giả sử bạn đang cố gắng gỡ lỗi bên trong khuôn khổ .NET. Không có gì nhiều bạn có thể làm về nó không may.

+0

Đúng Robert. Tôi đang ở trong mã được tải xuống từ Microsoft Symbol Server cho .NET. Ví dụ, ở trên xảy ra bên trong phương thức SetAuthCookie (..), bên trong lớp System.Web.Security.FormsAuthentication ... tất nhiên đã được tải xuống từ máy chủ biểu tượng của ms. –

+2

Điều này không chính xác 100%. Hầu hết các lỗi bạn đang thấy là kết quả của việc tối ưu hóa thời gian chạy JIT. Đây là những suppressable bởi một tập tin .INI (xem bài của tôi). Có một số opmitazation trong BCL nhưng hầu hết nó sẽ không ảnh hưởng đến gỡ lỗi nếu tối ưu hóa JIT bị đàn áp. – JaredPar

+1

Từ việc đọc, bạn cần đặt tệp ini bên cạnh tệp DLL/EXE mà bạn muốn tác động. Bạn đặt nó cho thư viện BCL ở đâu? –

7

Đối với ứng dụng .Net bình thường, bạn có thể vô hiệu hóa việc sử dụng tối ưu hóa JIT với tệp .INI bên cạnh nhị phân bắt đầu. Dưới đây là một liên kết đến cách này được thực hiện

http://blogs.msdn.com/jaredpar/archive/2008/08/29/disabling-jit-optimizations-while-debugging.aspx

Debugging ASP.Net là một chút khác nhau và mặc dù tôi không chắc chắn nếu điều này sẽ làm việc cho bạn. Nếu bạn đang gỡ lỗi cục bộ bằng cách sử dụng máy chủ web trọng lượng nhẹ (cassini), bạn có thể áp dụng thủ thuật này cho chính Cassini. Nếu bạn đang debuggin trực tiếp trên một máy chủ web mặc dù bên trong IIS Tôi không biết làm thế nào để có được thủ thuật này để làm việc nhưng hy vọng nó sẽ dẫn bạn đi đúng hướng.

+0

Xin chào JaredPar. Tôi biết tôi đang đúc 'resurect chết' khi thread này, nhưng u có thể cung cấp cho một số thông tin thêm nếu tôi gỡ lỗi tại địa phương chống lại cassini? –

+0

@ Pure.Krome, bạn đã thử thêm vào web.config chưa? Xem http://support.microsoft.com/kb/815157 – JaredPar

0

Cuối cùng, giải pháp này làm việc cho tôi khi đính kèm vào aspnet_wp.exe Visual Studio 2008, .NET framework 2.0: đi vào thuộc tính dự án, vào tab Xây dựng, Nút nâng cao -> đặt Thông tin gỡ lỗi đầu ra thành "đầy đủ". Hy vọng điều này sẽ giúp một ai đó.

3

Sau nhiều nghiên cứu, tôi đã có thể tìm cách làm cho kỹ thuật "COMPLUS_ZapDisable" này hoạt động khi gắn vào ứng dụng được lưu trữ trên IIS dưới IIS7/Windows 7 x64.

Trong trường hợp của tôi, tôi đang sử dụng các biểu tượng được xây dựng bởi Reflector Pro, mặc dù tôi đoán là nó cũng sẽ hoạt động cho các ký hiệu Microsoft mà OP hỏi.

Bí quyết là tìm đúng nơi để đặt biến môi trường đó để w3wp.exe của bạn được khởi chạy với cài đặt đó được bật. Để thực hiện việc này, hãy thêm một khóa chuỗi có tên "COMPLUS_ZAPDISABLE" vào sổ đăng ký của bạn tại "HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Environment".Đặt giá trị khóa thành "1" và điều đó sẽ thực hiện thủ thuật. Đừng làm điều này trên production =)

Kêu gọi Clive Tong, tác giả của this post từ Cổng đỏ, để chỉ cho tôi đi đúng hướng.

+0

lưu ý rằng trong khi hack đăng ký làm việc cho tôi, nó không hoạt động * tất cả * thời gian. Sau khi chọn lọc áp dụng giải pháp của @ JaredPar, tôi chưa gặp thêm bất kỳ vấn đề nào. – killthrush

Các vấn đề liên quan