Câu hỏi Gỡ lỗi mã C ++ liên quan đến việc sử dụng: vector, chuỗi, STL


Tôi là người mới bắt đầu sử dụng C ++. Khi tôi cố gắng gỡ lỗi mã C ++ bằng cách sử dụng các cấu trúc sau như chuỗi, vectơ của một số kiểu gốc, STL, vv, gỡ lỗi sẽ trở nên tẻ nhạt. Tôi sử dụng MS Visual Studio 2010 / Visual C ++ 2010 Express.

ví dụ.

- Trong khi sử dụng chuỗi như sau:

string str;

getline(cin, str);

for(i=0; i<str.size();i++)

Cửa sổ xem không hiển thị giá trị cho str [i]. Nó nói rằng toán tử quá tải không được tìm thấy. Tôi phải tự sụp đổ toàn bộ biến chuỗi str và xem char elem tại chỉ số cụ thể đó, mà được cồng kềnh.

- Trong khi sử dụng vector như dưới đây, cùng một vấn đề. Nếu tôi đặt biến v1 [k] trong cửa sổ xem cùng một lỗi.

vector<int> v1(100);


for(int k=0;k<100;k++)
{
    v1.push_back(k);
}

- Đã thử sử dụng các trình lặp STL đơn giản như it.begin (), it.end () và các thuật toán như sort (), reverse (), tôi không thể gỡ lỗi bên trong các hàm đó bằng cách bước, hoặc không thể đặt điểm ngắt thành các hàm đó. Tôi biết họ đang ở trong STL hoặc một số thư viện chuẩn như vậy, họ sẽ được đảm bảo là không có lỗi, nhưng người ta vẫn có thể sử dụng chúng không chính xác bằng cách truyền một cái gì đó không hợp lệ / không chính xác)

Đến từ việc sử dụng ngôn ngữ C trong nhiều năm, với C ++, tôi thấy sự thiếu hụt 'khả năng gỡ rối' này, hoặc một số hạn chế trong đó, đau đớn, trong khi tôi đang cố gắng hiểu những đoạn mã C ++ lớn được viết bởi người khác, tại nơi làm việc.

Những câu hỏi của tôi -

Cách hiệu quả để gỡ lỗi mã làm việc để hiểu chức năng của nó khi sử dụng thành ngữ như bước vào, điểm ngắt, điểm xem, cửa sổ xem là gì. Có bất kỳ trình gỡ lỗi cụ thể nào tốt hơn / tệ hơn các trình gỡ lỗi khác (như nói gdb là tốt hơn) hay có bất kỳ thủ thuật / mẹo cụ thể nào để hỗ trợ gỡ lỗi.

Nói chung làm thế nào để phân tích một mã C + + để hiểu nó làm việc?


12
2017-09-24 17:44


gốc


Tôi tự hỏi điều gì là quá chủ đề mà ai đó đã bỏ phiếu cho nó để đóng! - goldenmean
Tôi đã bỏ phiếu để đóng vì yêu cầu "những gì có hiệu quả", "những gì cụ thể trình gỡ lỗi là tốt hơn / tồi tệ hơn khác", và về cơ bản phần còn lại của câu hỏi của bạn là hoàn toàn chủ quan. - Marlon
@Marlon - Những câu hỏi chính không phải là, nếu bạn thấy. - goldenmean
@Marlon: Có gì sai khi hỏi về các cách hiệu quả để gỡ lỗi sử dụng STL? Đó là một câu hỏi rất quan trọng (và khách quan)! - Peter Alexander


Các câu trả lời:


Như bạn đã phát hiện ra, cố gắng sử dụng các toán tử quá tải trong cửa sổ đồng hồ sẽ không hoạt động. Bạn cần phải mở các đối tượng và rút ra các biến thành viên.

Trong MSVC, std::vector có một biến thành viên _Myfirst trỏ đến phần tử đầu tiên của bộ đệm của nó. Để lấy mục tại chỉ mục i bạn có thể thêm

(v._Myfirst)[i]

Tới cửa sổ xem. Bạn cũng có thể dùng

(v._Myfirst),10

Để hiển thị 10 phần tử đầu tiên của mảng.

Phải có biến thành viên tương tự cho std::string.


14
2017-09-24 17:56



Cảm ơn. Điều đó thực sự sẽ hữu ích Nhưng trong trình biên dịch My Visual Studio 2010, khi tôi thấy một biến vector trong cửa sổ xem, tất cả những gì tôi thấy là - Phần tử đầu tiên có tên là kích thước, đó là kích thước của phần tử vector.Second là dung lượng. Và sau đó các yếu tố cá nhân trong vector.Do không thấy bất kỳ con trỏ đến yếu tố đầu tiên: ( - goldenmean
@ goldermean: Ah, vì vậy họ đã thay đổi nó cho năm 2010, tôi đã chỉ sử dụng 2008. Chắc chắn phải có một tùy chọn ở đâu đó để hiển thị các biến thành viên thô? (Tôi đang chụp trong bóng tối bây giờ). - Peter Alexander
Thiết lập v1._Myfirst, 10 đã làm các trick. - goldenmean
@ goldenmean Đó là điều bình thường đối với VC10. Họ đã triển khai các công cụ gỡ lỗi hữu ích để chuyển đổi các thành viên khá bí truyền thành các mảng vật phẩm thực sự. Cấp, điều này không giúp của bạn trường hợp, nhưng nếu bạn cần xem xét vector như một mảng, nó có bạn được bảo hiểm khá hợp lý. - Nicol Bolas
@ goldermean: Tôi tìm thấy một cái gì đó nói rằng bằng cách sử dụng ((v)._Myfirst)[i] nên làm việc cho bất cứ điều gì i bạn chọn. - Peter Alexander


Một số lượng rất nhỏ các loại có "trình hiển thị lỗi" được chỉ định để chúng hỗ trợ gỡ lỗi. Họ nói chung là một trợ giúp tuyệt vời và tôi thấy nó gần như không thể có được bất cứ điều gì được thực hiện mà không có họ ngay bây giờ (tại sao tôi quan tâm đến việc thực hiện một vector .. Tôi chỉ muốn biết những gì trong đó!)

Tuy nhiên, nếu bạn làm muốn vô hiệu hóa chúng, google xung quanh cho tệp "autoexp.dat" kiểm soát điều đó. Bạn chỉ có thể xóa một vài dòng trong đó và mọi thứ sẽ quay trở lại loại phẳng. Tôi sẽ cảnh báo bạn rằng những thứ như bản đồ và bộ bản chất trở nên không thể gỡ bỏ mà không có người trực quan.

Ngoài ra, hãy chuyển sang C ++ / CLI. VS2010 không hỗ trợ gỡ lỗi visualisers trong C + + / CLI, mà thường là một thất vọng to lớn, nhưng tôi đoán có thể là những gì bạn đang tìm kiếm.


3
2017-09-24 19:42



+1 cho autoexp.dat - Alessandro Jacopson


Trong Công cụ> Tùy chọn ..> Gỡ lỗi> Chung, bỏ chọn các mục sau:

  • Hiển thị cấu trúc nguyên của đối tượng trong cửa sổ biến
  • Sử dụng Chế độ tương thích gốc

Sau đó, bạn sẽ thấy đầu ra được định dạng.


1
2017-08-23 08:41