2015-05-23 14 views
7

Tôi đang sử dụng Windows 8.1 64 bit với Visual Studio 2013 Ultimate. Tôi đang chuyển một chương trình từ Linux sang Windows sử dụng C++, OpenGL và SDL. Tôi có các thư viện thích hợp tùy chỉnh được biên dịch thông qua cmake trên 64-bit trên Windows. Khi tôi chạy chương trình từ Visual Studio, IDE nói rằng có một tham nhũng đầu. Điều này là không có gì ngạc nhiên khi tôi đang sử dụng con trỏ để khởi tạo các đối tượng, và tôi đang sử dụng con trỏ thô mà tôi có kế hoạch thay đổi thành con trỏ thông minh vì lợi ích của đối số. Tôi sẽ làm phép thuật tăng cường sau.Làm cách nào để chẩn đoán lỗi tham nhũng heap trên Windows?

Trong thời gian chờ đợi, tôi đã sử dụng máy tính Linux để chẩn đoán bất kỳ rò rỉ bộ nhớ nào thông qua Valgrind và không có báo cáo nghiêm trọng nào từ Valgrind. Tôi sau đó tiến hành sử dụng CppCheck nhưng không có gì nghiêm trọng trên đó. Có lẽ tôi đang quá khoan dung ở đây và Windows thực sự có thể được dùng những thứ ít nghiêm trọng hơn nghiêm trọng hơn Linux, đó là một bất ngờ kể từ khi MSVC có xu hướng tha thứ hơn GCC.

Vì vậy, chương trình hoạt động trên Linux và không chạy trên Windows. (Chỉ cần tuyệt vời!) Và Visual Studio không phải là giúp đỡ bằng cách ném ngoại lệ trên tất cả các nơi mà làm cho tôi ghét Windows nhiều hơn. Tôi bắt đầu googling xung quanh cho một giải pháp và đi qua điều này được gọi là gflags hoặc helper trang, vì vậy tôi cài đặt các công cụ gỡ lỗi và cố gắng để khởi động gflags nhưng tôi không có ý tưởng làm thế nào để sử dụng nó! Sau đó tôi thấy rằng bạn phải sử dụng một số công cụ khác được gọi là adp và sau đó đính kèm gflags vào nó, vì vậy khi tôi khởi chạy adp nó bị treo. Vì vậy, bây giờ tôi không có ý tưởng phải làm gì và đang trên bờ vực hủy bỏ cổng (điều này là buồn cười vì nhiều người phàn nàn rằng nó khó khăn như thế nào đối với các chương trình cổng từ Windows sang Linux trong khi ngược lại là đúng).

Vì vậy, bây giờ tôi khiếu nại với cộng đồng này để được trợ giúp: làm thế nào để tôi gỡ lỗi/chẩn đoán lỗi tham nhũng heap xảy ra trên Windows nhưng không phải trên Linux? Tôi thực sự có nghĩa vụ phải sử dụng gflags hay tôi chỉ nên sử dụng can đảm của tôi về điều này?

+1

VS có bộ dò tìm rò rỉ bộ nhớ nội tại: https://msdn.microsoft.com/en-us/library/x98tx3cf(v=vs.120).aspx –

+0

Bạn đã sử dụng trình gỡ lỗi chưa? Bạn cũng có thể thử clat sanatizers trên Linux. Có lẽ họ tìm thấy một cái gì đó valgrind và cpp kiểm tra không. – MikeMB

+0

Xin lỗi tôi đã không trả lời trong một thời gian. Tôi vẫn có vấn đề này, nhưng nó dường như đến từ một tập tin .dll bên ngoài. Tôi không chắc liệu đó có phải là một vấn đề về kết thúc của tôi hay không, đủ để nói rằng các lỗi vi phạm truy cập 0xFF gây phiền toái! – Poriferous

Trả lời

6

Sử dụng heap gỡ lỗi và gọi nó ngay từ đầu trong main().

_CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF);

Nó sẽ làm chậm chương trình rất nhiều nhưng nó phải phá vỡ càng sớm càng tham nhũng xảy ra.

Tham khảo bài viết này để biết chi tiết: giải pháp https://msdn.microsoft.com/en-us/library/974tc9t1.aspx#BKMK_Check_for_heap_integrity_and_memory_leaks

+0

Cảm ơn bạn đã trả lời. Tôi không bao giờ gặp chức năng gỡ rối này nên nó sẽ rất thú vị. Công cụ tuyệt vời! – Poriferous

1

Các @ Carlos là hoàn hảo cho vấn đề nhỏ hơn. Nhưng đối với những vấn đề lớn, kết quả chậm lại đôi khi là một cái gì đó bạn không thể dạ dày.

Trong trường hợp này, người ta có thể đặt

ASSERT(_CrtCheckMemory()); 

ở đâu đó trong các mã, nơi người ta nghi ngờ vấn đề đã có mặt. Lệnh này kiểm tra heap tại (và chỉ tại) tại chỗ nó được chèn vào, và không sau mỗi cuộc gọi new hoặc delete như trong trường hợp _CRTDBG_CHECK_ALWAYS_DF. Điều này giúp thời gian thực hiện hợp lý, so với tùy chọn _CRTDBG_CHECK_ALWAYS_DF.

Bạn có thể tìm thấy dòng mã có vấn đề khá nhanh chóng bằng cách sử dụng phương pháp tìm kiếm nhị phân để đặt xác nhận.

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