Bạn không thể đánh giá biểu thức vì mã của phương thức hiện tại được tối ưu hóa trong Visual Studio 2010


153

Tôi đang sử dụng Visual Studio 2010 trong chế độ gỡ lỗi và tôi đã bỏ chọn "tối ưu hóa mã". Tôi không thể xem nhanh (hoặc di chuột lên) bất kỳ biến nào trong trình gỡ lỗi. Tôi gặp lỗi này "Không thể đánh giá biểu thức vì mã của phương thức hiện tại được tối ưu hóa".

Ngay cả một dòng như: int i = -3, khi xem nhanh trên i, tôi nhận được "Không thể lấy giá trị của cục bộ hoặc đối số 'i' vì nó không có sẵn tại con trỏ chỉ dẫn này, có thể vì nó đã được tối ưu hóa."

Liên kết này được tham chiếu trong một câu hỏi tương tự dường như không áp dụng.

Có một thiết lập tôi đang thiếu?


4
torulflundgren.blogspot.com.au/2010/03/ Khăn Đây là giải pháp tốt nhất tôi tìm thấy cho việc này. Tôi đã thử nghiệm điều này trên visual studio 2013. và đã làm việc ....
Dulanjana Wickramatantri

Câu trả lời:


167

Trong khi dự án ở chế độ gỡ lỗi, giải pháp thì không. Khi tôi thay đổi nó, nó hoạt động.


9
Tôi đã gặp vấn đề này trong VS2012, tuy nhiên giải pháp và tất cả các dự án đã được đặt thành Debug mà không tối ưu hóa. Tôi làm sạch giải pháp / xây dựng lại cố định nó cho tôi.
saarp

20
Vậy ... Làm thế nào để bạn thiết lập giải pháp cho chế độ không gỡ lỗi?
dùng14 31072

user14 31072 - bạn nhấp chuột phải vào giải pháp hoặc dự án của bạn và chọn thuộc tính, sau đó bạn có thể đặt nó ở chế độ gỡ lỗi
Yevgraf Andreyevich Zhivago

48

Tôi gặp vấn đề này khi tôi đang sử dụng VS 2010. Cấu hình giải pháp của tôi đã được chọn (Gỡ lỗi). Tôi đã giải quyết điều này bằng cách bỏ chọn thuộc tính Optimize Code trong thuộc tính dự án. Dự án (Nhấp chuột phải) => Thuộc tính => Xây dựng (tab) => bỏ chọn Tối ưu hóa mã


29

Có vẻ như bạn đang gỡ lỗi bản dựng được tối ưu hóa / phát hành, mặc dù chưa kiểm tra hộp tối ưu hóa. Những điều bạn có thể thử là:

  • Thực hiện xây dựng lại hoàn toàn tệp giải pháp của bạn (nhấp chuột phải vào giải pháp và chọn Xây dựng lại tất cả)
  • Trong khi gỡ lỗi, mở cửa sổ mô-đun (Gỡ lỗi -> Windows -> Mô-đun) và tìm cụm của bạn trong danh sách các mô-đun được tải. Kiểm tra xem Đường dẫn được liệt kê đối với tập hợp đã tải của bạn có đúng như mong đợi không và dấu thời gian đã sửa đổi của tệp cho biết rằng tập hợp đã thực sự được xây dựng lại.
  • Cửa sổ mô-đun cũng sẽ cho bạn biết liệu mô-đun được tải có được tối ưu hóa hay không - đảm bảo rằng cửa sổ mô-đun chỉ ra rằng nó không được tối ưu hóa.

Nếu bạn không thấy mục menu Mô-đun trong menu Gỡ lỗi -> Windows thì bạn có thể cần thêm nó vào menu "Tùy chỉnh ...".


2
Giải pháp được xây dựng lại. Cửa sổ mô-đun cho thấy lắp ráp được tối ưu hóa. Tôi đã bỏ chọn hộp kiểm Tối ưu hóa để tôi không biết tại sao lắp ráp luôn được tối ưu hóa. Giải pháp có một dự án web nhưng mã tôi đang xem là trong một dự án thư viện lớp ở chế độ gỡ lỗi.
Tony_Henrich

@Tony - Câu hỏi ngớ ngẩn, nhưng thư viện lớp có bỏ chọn hộp kiểm "Tối ưu hóa" không?
Justin

Đúng. Tôi đã đề cập đến thực tế này trong câu hỏi của tôi. Tôi đã trả lời câu hỏi của riêng tôi.
Tony_Henrich

1
Tôi Project.Webcó Optimization unticked nhưng nó vẫn hiển thị như Optimized khi tôi nhìn vào lắp ráp trong Debug > Modules:(
J86

Cách duy nhất tôi tìm thấy để buộc VS cập nhật thông tin gỡ lỗi là tăng phiên bản lắp ráp của mô-đun vẫn được coi là tối ưu hóa trong khi tùy chọn không được kiểm tra.
alphanoch

14

Trong VS2013, đi tới: Công cụ -> Tùy chọn -> Gỡ lỗi -> Chung và bật 'Sử dụng chế độ tương thích được quản lý'. Điều này vô hiệu hóa hành vi đánh giá chức năng mới.


Cảm ơn! Trong số các giải pháp khác được đưa ra, đây là giải pháp quan trọng đối với tôi. Điều kỳ lạ là nó đã xảy ra đột ngột, tôi tự hỏi điều gì đã khiến nó thay đổi.
mực ống vào

10

Cố gắng chạy trong chế độ gỡ lỗi. Nếu bạn đang chạy trong chế độ phát hành, bạn sẽ nhận được thông báo này.


5
Câu hỏi cho biết, rõ ràng như ngày nào, "Tôi đang sử dụng Visual Studio 2010 ở chế độ gỡ lỗi và tôi đã bỏ chọn" tối ưu hóa mã "." ... bạn nên xóa câu trả lời không trả lời này.
Jim Balter

Nghiêm túc. Anh ta nói điều đó trong câu hỏi rằng anh ta đang chạy trong gỡ lỗi. Tôi không hiểu tại sao các upvote. Câu trả lời này đang làm ô nhiễm các nghị quyết có thể
John Demetriou

1
FWIW, câu hỏi này được xếp hạng cao trên Google khi bạn tìm kiếm thông báo lỗi này. Câu trả lời này là chính xác đối với tôi (Tôi không nhận ra mình đang ở chế độ phát hành).
Nate Barbettini

Anh ta có thể có nhiều hơn một hội đồng và trong trình quản lý cấu hình, hội đồng mà anh ta đang gỡ lỗi có thể được thiết lập để phát hành hoặc sth.
madoxdev

8

Tình hình của tôi không được bao gồm trong bất kỳ câu trả lời trên. Tôi đã tìm thấy như sau: Bài viết MSDN về phân luồng giải thích rằng khi bị mắc kẹt trong một số hoạt động luồng gốc nguyên thủy, trình gỡ lỗi không thể truy cập dữ liệu. Ví dụ, khi một chủ đề đang ngồi trên Task.Wait (), điều này xuất hiện.


8

Tôi đã từng gặp vấn đề tương tự. Nhưng trong trường hợp của tôi, Debuggablethuộc tính đã được mã hóa cứng trong AssemblyInfo.cstệp của dự án của tôi và do đó không (được viết) bằng cách biên dịch. Nó hoạt động sau khi loại bỏ dòng chỉ định Debuggablethuộc tính.


8

Đối với tôi nó đã xảy ra trong VS2017 và VS2019. Nó đã dừng xảy ra sau khi tôi chọn tùy chọn "Bỏ tối ưu hóa JIT khi tải mô-đun".

nhập mô tả hình ảnh ở đây


+1, đây là nguyên nhân của vấn đề của tôi. VS dường như không thực sự hiểu các tùy chọn csproj vì tôi đã tối ưu hóa tắt trong XML khi cấu hình kết thúc bằng "Gỡ lỗi". Nó hoạt động tốt khi gọi MSBuild trực tiếp nhưng không hoàn toàn đúng trong chính VS.
TheBeardedQuack

5

Tôi đã có vấn đề tương tự trong VS2008. Trong trường hợp của tôi, nó đã được giải quyết thông qua xây dựng lại giải pháp.


4

Ngoài @Kragen đã đề cập, Nếu bạn đang gỡ lỗi một dự án web

đóng studio trực quan và thử xóa các tệp tạm thời tại C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Tệp ASP.NET tạm thời


Giải pháp có một dự án web nhưng mã nằm trong dự án thư viện lớp. Tôi đã xóa các tập tin tạm thời nhiều lần.
Tony_Henrich

4

Một điều khác mà bạn có thể làm là, tạo một tệp có cùng tên với dll được tối ưu hóa nhưng có phần mở rộng ini và thêm phần sau vào đó:

[Kiểm soát gỡ lỗi .NET Framework]
GenerateTrackingInfo = 1
AllowOptizes = 0

Điều này sẽ nói với JIT không tối ưu hóa các biến của bạn.

Lưu ý rằng bạn vẫn cần pdb, vì vậy bạn sẽ kết thúc với một cái gì đó như thế này: yourDll.dll yourDll.pdb yourDll.ini

Điều này hoạt động đặc biệt tốt trong các tình huống khi bạn không có quyền truy cập để tạo lại các dll với tùy chọn gỡ lỗi.

http://www.hanselman.com/blog/DebugVsReleaseTheBestOfBothWorlds.aspx


4

Khi bạn thấy thông báo " Không thể đánh giá biểu thức vì mã của phương thức hiện tại được tối ưu hóa. " Sau khi đưa ra Debugger.Break()câu lệnh, hãy đảm bảo bạn nhấn F10 để chuyển sang câu lệnh tiếp theo.

Khi bước đến câu lệnh tiếp theo và giả sử bạn đang chạy bản dựng Debug, thông báo này sẽ biến mất.


2
Điều đó là vậy đó. Tôi đã thử tất cả các giải pháp ở trên và điều nhỏ nhặt này đã có kết quả .. Cảm ơn bạn đã chia sẻ nó, tôi sẽ lãng phí nhiều giờ hơn nếu không thấy gợi ý tầm thường này ..
Krzysztof Szynter

Không. Đã không làm việc. Vs17 vẫn nghĩ rằng tôi đang gỡ lỗi bản dựng phát hành
John Demetriou

3

Liên quan đến vấn đề với thuộc tính "Tối ưu hóa mã" chưa được UNCHECKED nhưng mã vẫn biên dịch là tối ưu hóa: Điều cuối cùng đã giúp tôi sau khi thử mọi thứ là kiểm tra hộp kiểm "Bật gỡ lỗi mã không được quản lý" trên cùng trang cài đặt (Thuộc tính dự án - Gỡ lỗi). Nó không liên quan trực tiếp đến tối ưu hóa mã, nhưng với tính năng này được bật, VS không còn tối ưu hóa thư viện của tôi và tôi có thể gỡ lỗi.


3

Tôi đã có cùng một vấn đề trong khi gỡ lỗi một thư viện lớp từ một ứng dụng web thử nghiệm. Tôi đã tham khảo phiên bản phát hành trong thử nghiệm và nó đã được thiết lập để được tối ưu hóa trong các thuộc tính thư viện lớp.

Bỏ chọn hộp kiểm mã tối ưu hóa cho phiên bản phát hành trong thuộc tính thư viện lớp, ngay khi tôi đang viết nó, đã giải quyết được vấn đề.


Cảm ơn đã làm điều đó. Bạn có thể tìm thấy hộp kiểm này bằng cách nhấp chuột phải vào mọi dự án và chọn tùy chọn menua "Thuộc tính" của chúng, sau đó chọn tab "Xây dựng".
goamn

3

Tôi nhận ra đây là một câu trả lời sau, nhưng tôi đã tìm thấy một tài liệu tham khảo khác về cách giải quyết vấn đề này có thể giúp đỡ những người khác trong tương lai. Đây trang web mô tả cách thiết lập một biến môi trường (COMPLUS_ZapDisable = 1) có thể ngăn chặn tối ưu hóa, ít nhất nó đã làm cho tôi! (Đừng quên phần thứ hai của việc vô hiệu hóa quy trình lưu trữ Visual Studio.) Trong trường hợp của tôi, điều này có thể thậm chí còn phù hợp hơn vì tôi đã gỡ lỗi một DLL bên ngoài thông qua một máy chủ biểu tượng, nhưng tôi không chắc chắn.


3

Tôi gặp vấn đề này với một dự án F # đã từng ở đây và giữa Visual Studio và MonoDevelop, có lẽ bắt nguồn từ phần sau (tôi quên). Trong VS, hộp tối ưu hóa không được kiểm tra, nhưng tối ưu hóa chắc chắn dường như đang xảy ra khi có liên quan đến trình gỡ lỗi.

Sau khi so sánh XML của tệp dự án với tệp lành mạnh, vấn đề đã rõ ràng: dự án lành mạnh có một <optimize>false</optimize>dòng rõ ràng , trong khi đó tệp xấu lại hoàn toàn thiếu nó. VS rõ ràng đã suy luận từ sự vắng mặt của nó rằng tối ưu hóa đã bị vô hiệu hóa, trong khi trình biên dịch đang làm điều ngược lại.

Giải pháp là thêm thuộc tính này vào tệp dự án và tải lại.


1

Tôi bắt đầu nhận được thông báo này khi tôi chuyển sang Visual Studio 2017. Không có ý tưởng nào trên trang này mà tôi đã thử làm việc cho tôi. Trên một bài đăng khác tôi đã tìm thấy đề xuất này và nó DID hoạt động - xóa:

[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]

... từ tập tin AssociationInfo của bạn.


Yêu em @Crazy Cat. Nó đã xảy ra với tôi khi tôi chuyển sang VS2019.
Antonio Rodríguez

0

Tôi đã có cùng một vấn đề trong VS 2010. Dọn dẹp và xây dựng lại giải pháp và nó đã hoạt động.


0

Nhận xét của vickramds ở trên, tham khảo http://torulflundgren.blogspot.com.au/2010/03/cannot-obtain-value-of-local-or.html , đã làm điều đó cho tôi. Tôi đã kiểm tra mọi thứ - đã xóa tất cả các tệp dll, pdb khỏi các thư mục bin cục bộ, Clean, Rebuild, xóa tất cả các thư mục của Tệp ASP.NET tạm thời, các cờ TRACE / DEBUG được đảm bảo đã được đặt, kiểm tra các đường dẫn DLL, v.v.

Để đặt nó xuống để nó không bị mất, đối với (các) dự án bị ảnh hưởng:

Thuộc tính dự án -> Xây dựng -> Nâng cao -> Thông tin gỡ lỗi: Đầy đủ.

Bạn muốn kiểm tra xem bạn đã chọn cấu hình Gỡ lỗi trước khi thực hiện việc này chưa, trừ khi tất nhiên, bạn dự định khác.


0

Nếu bạn đang cố gắng gỡ lỗi một dự án ASP.NET, hãy đảm bảo rằng danh sách Thuộc tính> Web> Máy chủ của dự án được đặt thành "IIS Express" (ngoài việc kiểm tra mọi thứ khác ở đây).


0

Tôi đã trộn các dll mở rộng c ++ / cli mfc, được tối ưu hóa ngay cả khi cấu hình gỡ lỗi (nhìn từ cửa sổ Mô-đun VS 2017). Như câu trả lời trước đã đề xuất, tôi đã thay đổi "Trong VS2013, hãy chuyển đến: Công cụ -> Tùy chọn -> Gỡ lỗi -> Chung và bật 'Sử dụng chế độ tương thích được quản lý'. Điều này vô hiệu hóa hành vi đánh giá chức năng mới." Cài đặt đó cũng tìm thấy trong VS 2017.

Nhưng điều đó là không đủ, vì vậy tôi cũng đã sao chép cài đặt UseDebugL Library từ tệp dự án của ứng dụng MFC khác sang tệp dự án dll mở rộng.

    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
      ...
      <UseDebugLibraries>true</UseDebugLibraries>

Sau đó xây dựng lại và điều đó đã khắc phục vấn đề.


0

Trong Visual Studio 2012, cho phép tùy chọn " Được quản lý " từ Công cụ> Gỡ lỗi> Chỉ trong thời gian làm việc cho tôi.

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.