2011-12-18 21 views
6

Một dự án C++ tôi đang làm việc trên chấm dứt khi ném một ngoại lệ cơ hội đầu tiên. Điều này xảy ra trong Visual Studio 2008 trong chế độ gỡ lỗi khi tôi lần đầu tiên cố gắng truy cập vào một map<pair<int,int>, int> có chứa một cặp khóa-giá trị duy nhất. Không có gì sai về mặt logic với mã.C++: Làm thế nào tôi có thể giải quyết ngoại lệ cơ hội đầu tiên gây ra tại một điểm không xác định?

Tôi đã đọc các trường hợp ngoại lệ đầu tiên và hiểu rằng chúng có thể không phải lúc nào cũng có vấn đề. Tuy nhiên tôi đã cố gắng phá vỡ tất cả các trường hợp ngoại lệ như vậy, và như mong đợi tìm thấy một số trường hợp được tạo ra mà không gây ra vấn đề gì.

Lớp tôi đang làm việc rất lớn và chứa nhiều phân bổ bộ nhớ tùy chỉnh. Tôi phỏng đoán rằng bằng cách nào đó một trong số đó đang gây ra vấn đề. Tuy nhiên tôi đã dành vài giờ cố gắng tìm cách để xác định những gì đang xảy ra, và đã không thể làm như vậy.

Xuất ngoại lệ đầu tiên có thể được liệt kê bên dưới. Nó không phải là rất hữu ích!

First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00. 
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00. 
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00. 
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00. 
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00. 
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00. 
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00. 
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00. 
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00. 
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00. 
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00. 
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00. 
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00. 
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00. 
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00. 
First-chance exception at 0x0050ae33 in theapp.exe: 0xC0000005: Access violation reading location 0x00000010. 
Unhandled exception at 0x0050ae33 in theapp.exe: 0xC0000005: Access violation reading location 0x00000010. 

Tôi thực sự đang gặp khó khăn vào thời điểm này và không chắc chắn cách tiếp tục.

Có ai có thể đề xuất cách tôi có thể giải quyết vấn đề này và xác định chính xác những gì đang xảy ra không? Tôi rất biết ơn lời khuyên của bạn.

CẬP NHẬT

Dưới đây là các mã có liên quan. Vỡ debugger trên báo cáo kết quả cout đầu tiên được liệt kê trong lồng CHO:

 // Inside operator() : 

     map<pair<int,int>,int> resultIdByStructIds; 
     pair<int,int> spair (-1,-1); // Structure pair ids reusable reference. 

     int nextMapEntryId = 0; 
     int nextNumCandidates = 0; 
     // For each remaining candidate. 
     for (int ci = 0; ci < numCandidates;) { 
      // If candidate has been mapped or found not viable this mapping round, 
      // move past it. 
      if (candidatesDoneThisRound[ci] == currentMappingRoundId) { 
       ++ci; 
       continue; 
      } 

      Candidate candidate = candidates[ci]; 
      const int tId = candidate.tVertexId; 
      const int pId = candidate.pVertexId; 

      // Grab the result for this structure pair. 
      // Create it if it doesn't exist. 
      // Avoid copying as slight optimisation; simply 
      // store pointer to true result instead. 
      spair.first = tInfos[tId].structure->id; 
      spair.second = pInfos[pId].structure->id; 

      // DEBUG 
      cout << "resultIdByStructIds size: " << resultIdByStructIds.size() << endl; 
      for (map<pair<int,int>,int>::const_iterator ids_id = resultIdByStructIds.begin(); ids_id != resultIdByStructIds.end(); ++ids_id) { 
       cout << ids_id->first.first << endl; // * Debugger breaks here. 
       cout << ids_id->first.second << endl; 
       cout << ids_id->second << endl; 
       printf("Structures(%i,%i) => %i\n",ids_id->first.first,ids_id->first.second,ids_id->second); 
      } 
      // 

      // code continues... 

UPDATE 2

Dưới đây là một hình ảnh của mô tả di chuột qua cho bản đồ trong câu hỏi; nó dường như bị hỏng như Michael Burr gợi ý.

enter image description here

+2

Đó không phải là ngoại lệ đầu tiên có cơ hội khiến cho nó chấm dứt, đó là ngoại lệ chưa được giải quyết. –

+1

Tôi không biết MSVS, nhưng bằng cách nào đó "truy cập vi phạm" làm cho tôi nghi ngờ rằng có "không có gì sai với mã" ... –

+0

Bạn nói "Không có gì sai về mặt logic với mã." Tất cả các chỉ dẫn cho đến nay là có điều gì đó sai trái với mã. Bạn có thể cho chúng tôi thấy dòng mã (với các dòng tiền có liên quan) không. –

Trả lời

9

Nói chung, để xác định vị trí của mã nơi treo ứng dụng, bạn có thể bật xử lý theo Debug/Exceptions ngoại lệ. Trong trường hợp này, bạn sẽ mở rộng nhánh cuối cùng và kiểm tra Vi phạm Truy cập. Tất nhiên điều đó sẽ dừng lại trên tất cả các vi phạm truy cập, và không chỉ là một hành vi xấu (truy cập 0x10). Bạn có thể giảm thiểu điều này bằng cách bật bẫy tại thời điểm đã biết cuối cùng.

Thông thường, bạn sẽ phát hiện ra một số lỗi sử dụng bộ nhớ. Cách dễ nhất để xác định nguyên nhân của loại lỗi này là một công cụ của bên thứ ba như BoundChecker sẽ hét lên với bạn ngay sau khi bạn làm hỏng bộ nhớ. Thiếu điều đó, lời khuyên của Raymond Chen là tại chỗ. Tìm ra đối tượng nào là sai, và sử dụng cửa sổ xem để xem khi nào nó thay đổi. Hoặc hiệu quả hơn, sử dụng tính năng Data Breakpoint để chương trình dừng khi dữ liệu tại một địa chỉ cụ thể thay đổi.

+0

Cảm ơn bạn đã cung cấp thông tin này, Alan. Lời xin lỗi của tôi đã dành quá nhiều thời gian để đánh dấu câu trả lời của bạn! – KomodoDave

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