2012-12-03 20 views
6

Tôi có cảm giác lạ như đây là sự cố gần đây và xảy ra trên hai máy tính riêng biệt.Visual C++ 2010 từ chối hiển thị std :: string value khi gỡ lỗi. Hiển thị <Bad Ptr>

Khi tôi đang gỡ lỗi và cố xem xét giá trị của chuỗi std :: STL, nó hiển thị dưới dạng giá trị. Nó nói kích thước của nó là 15 và công suất là một số số lượng lớn bị cắt xén.

Tất cả các giá trị mảng đều nói CXX0030: Lỗi: biểu thức không thể được đánh giá. Điều này là cực kỳ bực bội và tôi vẫn có thể truy cập các giá trị chuỗi trong khi gỡ lỗi nếu tôi gọi c_str trên chuỗi và gán nó vào một char * hoặc sử dụng biểu thức xem nếu tôi cần, nhưng nó rất tẻ nhạt và làm cho cuộc sống rất khó khi gỡ lỗi các vấn đề phức tạp trong 3 ngày liền.

Nội dung các hộp chứa STL khác chỉ hiển thị tốt.

Điều này xảy ra trên nhiều dự án trên hai máy tính khác nhau và tôi chắc chắn rằng tôi có tất cả các tùy chọn gỡ lỗi được đặt cho dự án. Không có tối ưu hóa, và tạo ra thông tin gỡ lỗi cho chắc chắn.

+2

để trả lời câu hỏi này chúng ta cần một số mã compilable nơi lỗi này xảy ra. –

+0

Điều này xảy ra trên tất cả các mã không có vấn đề gì. Nếu tôi đang sử dụng std :: string nó hiển thị như trong trình gỡ rối. Đây có thể là một số vấn đề với cấu hình dự án của tôi và một số tối ưu hóa được kích hoạt ở đâu đó hoặc các biểu tượng gỡ lỗi của tôi không được tải đúng cách. Tôi đã thực hiện một số tìm kiếm trên Google và chưa tìm thấy câu trả lời. Tôi cũng tìm thấy một cái gì đó về autoexp.dat đó là gỡ lỗi hình dung dữ liệu để làm cho các loại phức tạp dễ dàng debuggable. Tôi nghĩ rằng autoexp.dat sẽ nhận được xung quanh tối ưu hóa chuỗi nhỏ bằng cách nào đó và hiển thị nó đúng trong mọi trường hợp. Tôi sẽ xem xét nó một số chi tiết. – iseletsky

+0

Bạn có thể sử dụng const char * test = str.c_str(); Sau khi các giá trị này tuyên bố sẽ được avaible cho trình gỡ lỗi để hiển thị. –

Trả lời

0

Âm thanh như tối ưu hóa chuỗi nhỏ tại nơi làm việc. VS2010 có tối đa 16 ký tự. Trong trường hợp đó, không có con trỏ đến đầu chuỗi, cũng không phải là thành viên dung lượng, nhưng thay vào đó các byte đó được sử dụng cho chính nội dung chuỗi.

+1

Trình hiển thị gỡ lỗi của Visual Studio không phải là xấu. Chúng hoàn toàn có khả năng xử lý tối ưu hóa của riêng Microsoft và hiển thị std :: chuỗi có độ dài bất kỳ một cách chính xác trong cài đặt dự án mặc định. – Kirinyale

2

Đây có thể là một phiên bản của Microsoft-confirmed bug (không may, không được sửa trong VS2010) liên quan đến mức gỡ lỗi trình vòng lặp tùy chỉnh. Tôi đã gặp phải vấn đề này, và, theo như các thử nghiệm của tôi, lỗi này được gây ra bằng cách định nghĩa _HAS_ITERATOR_DEBUGGING = 0 trong khi sử dụng thời gian chạy "Multithreaded Debug DLL" mặc định (cái yêu cầu VC redist để chạy exe của bạn trên các PC khác) .

Nếu đó thực sự là trường hợp, sau đó có ít nhất 2 cách sửa chữa nó (viết tắt của nâng cấp lên VS2012) - cả hai thử nghiệm và làm việc trong trường hợp của tôi:

1) Di _HAS_ITERATOR_DEBUGGING = 0 xác định. Điều này có thể làm giảm đáng kể hiệu suất của bản dựng gỡ lỗi của bạn nếu bạn đang sử dụng STL nhiều trong mã thời gian quan trọng. Như một định nghĩa như vậy không hiện diện theo mặc định, tôi cho rằng bất cứ ai thêm nó đã làm điều đó vì một lý do chính đáng (giống như tôi).

2) Chuyển cấu hình gỡ lỗi của bạn để sử dụng thời gian chạy "Gỡ lỗi đa luồng" (tức là liên kết CRT tĩnh). Vì bạn có thể chỉ sử dụng cấu hình gỡ lỗi để phát triển và gỡ lỗi trong nhà nên việc này không gây ra bất kỳ sự cố nào. Bạn có thể giữ thời gian chạy được chia sẻ cho cấu hình phát hành (vì có thể bạn không thể gỡ lỗi đúng cách). Lưu ý rằng cả hai giải pháp cũng sẽ yêu cầu điều chỉnh cài đặt tương ứng trong TẤT CẢ các phụ thuộc của bạn (thư viện tĩnh/động) và xây dựng lại chúng, nếu không bạn sẽ không thể liên kết với chúng nữa.

3

Có cùng sự cố và khắc phục sự cố bằng cách thay đổi trình hiển thị trong autoexp.dat. Nó được tìm thấy ở đây: "C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ Common7 \ Packages \ Debugger \ autoexp.dat" hoặc một nơi nào đó tương tự tùy thuộc vào Visual Studio và phiên bản Windows của bạn.

thay đổi cho "std :: basic_string":

thay thế $ e._BUF_SIZE

bởi sizeof ($ e._Bx._Buf)/sizeof (char)

hoặc sizeof ($ e._Bx._Buf)/sizeof (wchar_t)

https://connect.microsoft.com/VisualStudio/feedback/details/677683/std-string-incorrectly-displayed-in-debugger

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