2009-11-24 5 views
11

Trong Visual Studio, hầu hết các đối tượng và biến của tôi không thể được giải quyết trong phiên gỡ lỗi vì nhiều lý do khác nhau. Điều này có nghĩa là tôi không thể kiểm tra hoặc xem các đối tượng hoặc gọi hàm của họ khiến việc gỡ lỗi mã của tôi trở nên vô cùng khó khăn vì hầu hết các biểu thức của tôi không hoạt động. Một số lỗi điển hình tôi nhận được khi thêm một biểu thức vào cửa sổ đồng hồ bao gồm:Visual Studio không hiển thị một số biểu thức đã xem

  • CXX0019: Lỗi: loại xấu đúc
  • CXX0059: Lỗi: toán hạng bên trái là lớp không phải là một tên hàm
  • CXX0058: Lỗi: toán tử quá tải không được tìm thấy

Thông thường các biểu thức này liên quan đến các toán tử quá tải và/hoặc đối tượng lớp mẫu.

Tại sao điều này lại xảy ra? Làm thế nào để bạn sửa chữa nó?

+0

bạn có thể đăng một số biểu thức không? bằng cách sử dụng các cửa sổ đồng hồ với algeritms phức tạp (nhà khai thác) là yêu cầu cho những rắc rối imho – RvdK

Trả lời

8

Các lỗi bạn có là do giới hạn trong trình gỡ lỗi, không có lỗi như Daniel ngụ ý.

Cửa sổ xem không thể gọi các toán tử quá tải. Nếu bạn có, ví dụ: a std::vector<int> vecSomething bạn không thể đặt vecSomething[0] vào cửa sổ xem, vì std::vector<int>::operator[] là toán tử bị quá tải. Do đó, đối với một vectơ các đối tượng, bạn không thể thực hiện vecObject[0].SomeMemberVariableOfObject trong cửa sổ xem. Bạn có thể viết vecObject._Myfirst[0].SomeMemberVariableOfObject. Trong thực hiện STL của Visual Studio, _Myfirst là một thành viên của vector trỏ ở phần tử đầu tiên.

Nếu bạn thêm biến và loại của riêng mình vào cửa sổ xem, hãy thêm đồng hồ trực tiếp vào thành viên dữ liệu. Không có vấn đề gì khi đi theo chuỗi các con trỏ như member.memberStruct.ptrToObj->memberOfObj.

Edit:

Trên thực tế Visual Studio có thể gọi mã trong cửa sổ Watch: http://geekswithblogs.net/sdorman/archive/2009/02/14/visual-studio-2008-debugging-ndash-the-watch-window.aspx

Vì vậy, nó là hơi bí ẩn tại sao các nhà khai thác quá tải không thể được sử dụng.

+3

cửa sổ xem thực thi mã – stijn

+0

@stijn: Bạn có thể xây dựng không? Nó đánh giá các biểu thức, tức là bạn có thể xem "(a + b)/2", nó đánh giá mã để định dạng các biểu thức theo các quy tắc được đưa ra trong autoexp.dat, nhưng khi nào nó thực thi mã của tôi? – Sebastian

+0

@stijn: Đã cập nhật bài đăng của tôi. Tôi phát hiện ra rằng bạn đúng, các chức năng gọi điện được cho phép trong cửa sổ xem. Tôi không biết điều đó. – Sebastian

4

Why is this happening?

Công cụ này có những hạn chế của nó. Ví dụ, nhiều lần tôi "đi đến định nghĩa" và định nghĩa không được tìm thấy. Tôi phải "tìm trong các tập tin". Không ngạc nhiên khi một số biểu thức không được đánh giá trong các phiên gỡ rối.

How do you fix it?

  • Giữ biểu thức đơn giản. Không được ghép chúng trực tiếp, sử dụng các biến số có tên giải thích cho kết quả trung gian .
  • Hỗ trợ mã của bạn với xác nhận rõ ràng. Nếu đó là "sai", một khẳng định sẽ thất bại.
+0

Tôi không thể nhớ, là có một nhà điều hành khẳng định bản địa trong C + +? Hay phải tự mình tạo ra? Hơn nữa, bạn có nghĩ rằng nó sẽ hoạt động để viết các hàm bao bọc làm giao diện cho các biểu thức thường được kiểm tra để làm việc xung quanh giới hạn trình gỡ lỗi này? Điều đó phải chịu thêm một chút chi phí lập trình, nhưng tôi không thể nghĩ ra cách tiếp cận tốt hơn. –

+0

@Jonny khẳng định là một macro. Nó thường được định nghĩa bởi nhà cung cấp trình biên dịch. Và có, viết các hàm bổ sung sẽ giúp làm rõ những gì đang diễn ra. –

5

Các vấn đề và cách giải quyết có thể được mô tả một cách chính xác trong Microsoft Documentation

The managed expression evaluator accepts most expressions written in Visual C++. The following topics offer specific information and discuss some of the expression types that are not supported:

Identifiers and Types 
Function Evaluation 
Operators 
Overloaded Operators 
Strings 
Casts 
Object Comparison and Assignment 
typeof and sizeof Operators 
Boxing 
Property Evaluation 
+0

Cảm ơn, tuy nhiên tôi lưu ý rằng tài liệu có vẻ sai đối với VS2008: nó nói rằng quá trình 'operator []()' sẽ hoạt động, nhưng thêm một đồng hồ 'v [42]' cho một biến 'vectơ v' cho Lỗi CXX0058 - ngay cả khi '42' được thay đổi thành' 42U' hoặc '42L' hoặc' 42LU' để đáp ứng yêu cầu đối sánh chính xác loại đối số. Có thể nó không hoạt động w.r.t. mẫu? –

+0

@j_random_hacker Có lẽ đó là vì các mẫu, tôi không biết kể từ khi tôi không bao giờ được sử dụng VS2008. Khi toán tử '[]' không hoạt động trong cửa sổ đồng hồ, bạn có thể hiển thị các thành viên nội bộ của lớp vector và thêm một bù đắp để xem dữ liệu bạn muốn xem, nhưng điều này khá chậm hơn so với nhập 'v [42] '. –

2

quản lý tập tin PDB này còn xa mới hoàn hảo, chắc chắn trong các dự án lớn hơn. Đặc biệt, VS có hành vi khá ngu ngốc khi hợp nhất tất cả các ký hiệu trong VSxx.PDB, ngay cả trên các dự án khác nhau. Công tắc/Fd có thể dễ dàng sửa lỗi này; vượt qua $(TargetDir)$(TargetName).pdb hoặc một cái gì đó tương tự.

1

Tôi đã tìm thấy một giải pháp giúp giải quyết vấn đề về các toán tử quá tải. Nó dường như không phụ thuộc vào nội bộ của lớp. Bạn phải sử dụng dạng mở rộng của cuộc gọi của nhà điều hành. Dưới đây là một ví dụ cho vector<int> v:

v.operator[](0) 

Tôi đã thử nghiệm nó trong Visual C++ 2012.

1

Nó có thể là do các lớp lồng nhau
Ví dụ:

 
    class A 
    { 
     class B 
     { 
      int i; 
     }; 
    }; 

dàn diễn viên như (B *) (0x12345678) sẽ không thành công, nhưng (A :: B *) (0x12345678) sẽ thành công