2010-04-21 8 views
10

Tengo un std :: map < std :: string, std :: string> que se inicializó con alguna llamada API. Cuando trato de usar este mapa, obtengo un error de segmentación. ¿Cómo puedo detectar un código inválido o qué es inválido o algún detalle que pueda ayudarme a solucionar el problema? Código es el siguiente:Cómo detectar detalles de fallas de segmentación usando Valgrind?

std::map< std::string, std::string> cont; 

some_func(cont); // getting parameter by reference and initialize it, someone corrupted memory (cont) inside this function 

std::cout << cont[ "some_key" ] << '\n'; // segmentation fault here, cannot access "some_key" 
+0

'cont' no sería un global al que se accede en algún constructor de objetos globales, ¿verdad? –

+0

@Davit: Por cierto, es posible que desee aceptar una respuesta de vez en cuando. Permitir que todos sepan qué respuesta resolvió su problema es un aspecto importante de la comunidad SO. –

+0

ok Escribiré sobre el código de revisión –

Respuesta

3

En general, no estoy seguro de cómo esa línea podría estar generando un fallo seg: el operador de corchete siempre devolverá una std :: string (creando una vacía si es necesario) y siempre será válida para la impresión.

¿Es posible que, en cambio, la pila de llamadas que ves apunte a la siguiente línea para ejecutar y se esté muriendo en some_func? No vemos el código para él, así que no puedo decir si podría estar causando el problema.

Alternativamente es some_func utilizando char * (invoca temp std :: string) para inicializar cadenas en el mapa? Es posible que pueda estar introduciendo una cadena no válida en el mapa que "funcione" por un tiempo, pero cuando devuelve some_func no interactúa bien con la impresión.

2

iniciar su aplicación (compilado en modo depuración) con la sintaxis:

valgrind yourapp 

Valgrind le mostrará la traza de la pila donde se produjo fallo de segmentación. Después de eso depende de ti encontrar lo que sucedió y corregirlo.

En su código, independientemente de valgrind, me gustaría comprobar lo que vuelve cont[ "some_key" ] la causa más probable de su violación de segmento es que el valor devuelto es un poco de puntero salvaje o no inicializado en absoluto. Si es así, cualquier intento de acceder a él como cont["some_key"][0] también causaría un error de segmentación.

Otra idea: ¿qué pasa con las teclas de secuencia en el mapa? ¿Es posible que algunos de ellos silenciosamente (sin excepción) no hayan podido asignar la parte de datos de la cadena utilizada como clave? El std :: map no es una tabla hash, sino solo un contenedor ordenado. Al buscar una tecla, es posible que necesite acceder a otras teclas y puede que ocurra una mierda allí. Para verificar que puede intentar repetir todas las teclas en su mapa y mostrar contenido (para ver si el problema ocurre específicamente con "some_key" o si no puede acceder a nada en el mapa.

También podría intentar con un mapa desordenado si programa no necesita pedir para ver si el comportamiento es el mismo.

+0

de nuevo, lo actualicé, agregué nuevos comentarios que deben describir el problema –

0

Además de valgrind, se podría tratar de usar un depurador con el fin de centrarse en su problema.

Establecer un punto de interrupción en some_func(cont) línea, y examinar si cont es una referencia válida.

Además, tenga ¿Consideró lo que cont["some_key"] está devolviendo si alguna clave no está presente?

Cuestiones relacionadas