2011-12-18 11 views
6

Un proyecto de C++ en el que estoy trabajando termina al arrojar una excepción de primera oportunidad. Esto ocurre en Visual Studio 2008 en modo de depuración cuando intento acceder a un map<pair<int,int>, int> que contiene un único par de clave-valor. No hay nada lógicamente incorrecto con el código.C++: ¿Cómo puedo resolver una excepción de primera oportunidad provocada en un punto desconocido?

He leído las excepciones de primera oportunidad y entiendo que no siempre son problemáticas. Sin embargo, intenté romper todas esas excepciones, y como se esperaba, se generaron varias que no causan ningún problema.

La clase en la que estoy trabajando es muy grande y contiene muchas asignaciones de memoria personalizadas. Supongo que de alguna manera uno de estos está causando el problema. Sin embargo, he pasado varias horas tratando de encontrar una manera de identificar qué está pasando mal y no he podido hacerlo.

La salida de excepción de la primera oportunidad se enumera a continuación. ¡No es muy útil!

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. 

Realmente estoy luchando en este punto, y no estoy seguro de cómo proceder.

¿Alguien puede sugerirme cómo podría abordar este problema e identificar exactamente qué está pasando mal? Estaría muy agradecido por tu consejo.

ACTUALIZACIÓN

Aquí está el código relacionado. Los descansos depurador en la primera instrucción cout que aparece en la anidados PARA:

 // 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... 

ACTUALIZACIÓN 2

Aquí está una imagen de la descripción encima del ratón para el mapa en cuestión; parece corrupto como sugirió Michael Burr.

enter image description here

+2

No son las excepciones de la primera oportunidad que lo hacen terminar, es la excepción no controlada. –

+1

No sé MSVS, pero de alguna manera "violación de acceso" me hace dudar de que "no haya nada malo con el código" ... –

+0

Usted dice "No hay nada lógicamente incorrecto con el código". Todas las indicaciones hasta ahora es que hay algo mal con el código. ¿Podría mostrarnos la línea de código (con las líneas precedentes pertinentes). –

Respuesta

9

En general, para localizar el punto de código en la aplicación se bloquea, se puede convertir en el manejo de excepciones en virtud de depuración/excepción. En este caso, expandiría la última rama y verificaría la Infracción de acceso. Por supuesto, eso se detendrá en todas las violaciones de acceso, y no solo en las malas (accediendo a 0x10). Puede minimizar esto encendiendo la trampa en el último momento conocido.

Normalmente, descubrirá algunos errores de uso de la memoria. La forma más fácil de determinar la causa de este tipo de error es una herramienta de terceros como BoundChecker que le gritará tan pronto como corrompa la memoria. Sin eso, el consejo de Raymond Chen es acertado. Averigüe qué objeto está equivocado y use la ventana de observación para ver cuándo cambió. O de manera más eficiente, use la función Data Breakpoint para que el programa se detenga cuando cambien los datos en una dirección particular.

+0

Gracias por esta información, Alan. ¡Mis disculpas por tomar tanto tiempo para marcar tu respuesta! – KomodoDave

Cuestiones relacionadas