2012-04-10 20 views
13

Tengo un código complejo de C++.¿Cómo se puede depurar 'Stack smashing detected'?

Es un programa FastCGI, utilizando http://althenia.net/fcgicc

Cuando pregunto por una dirección URL muuucho, me sale

*** stack smashing detected ***: ./tileserve terminated 
Erreur de segmentation 

para la vida real, no es un problema ya que nunca se utilizan URLs tanto tiempo, pero significa que cualquiera puede terminar mi servidor ... No me gusta eso.

¿Hay alguna herramienta (y cómo usarla) para averiguar dónde aparece el problema?

EDIT: SOLVIDO

Ok resolved.

que estaba haciendo

int len; 
char uri[200]; 

len = strlen(request.params[std::string("REQUEST_URI")].c_str()); 
printf("%d\n", len); 

if (len > 200) return 1; 

strcpy(uri, request.params[std::string("REQUEST_URI")].c_str()); 

Parece que 200 era demasiado altura para la prueba len. En realidad, falla en 194.

Así que lo hice:

if (len > 190) return 1; 

Ahora, está bien.

+2

El seguimiento de pila puede darle una pista. – Mahesh

+4

+1 para 'Erreur de segmentation' – trojanfoe

+0

¿Qué es Stack trace? – user1219721

Respuesta

14

Si lee el sitio web, se dará cuenta de que se trata de un simple contenedor de C++ sobre una biblioteca de C.

Un problema típico con la biblioteca C son desbordamientos de búfer:

#include <cstring> 
#include <cstdio> 

int main(int argc, char* argv[]) { 
    char buffer[16]; // ought to be sufficient 

    strcpy(buffer, argv[1]); 
    printf("%s", buffer); 
} 

probar este programa:

> ./test "a" 
a 
> ./test "abcdefghijklmnoprqstuvwxyz" 
??? 

Debido a que la memoria intermedia sólo puede contener 16 caracteres, los caracteres restantes se escribirán allá de su final . Esto es stack smashing, y comportamiento indefinido.

Varias implementaciones de la biblioteca de tiempo de ejecución o su sistema operativo pueden detectar esta situación en algunas condiciones y finalizar el programa.

De cualquier que está haciendo algo mal o la biblioteca es.

Para localizar el problema, puede usar Valgrind o ejecutar su programa en un depurador. Alternativamente, si su sistema lo permite, es posible que tenga un volcado de memoria en el momento en que se mató el programa. También puede ver este volcado de memoria en un depurador.

+0

Sí, entiendo cuál es el problema. El problema es localizarlo ... – user1219721

+0

@ user1219721: oups perdón, se perdió esa parte. Use un depurador (integrado en VC++ o gdb en Linux). –

+0

Valgrind es inútil aquí, ya que no detecta errores de memoria basados ​​en pila, solo corrupción de memoria de pila. –

0

Puede usar algo como valgrind, o su compilador puede tener un análisis estático que puede encontrar lugares donde puede estar saturando los búferes.

También puede simplemente auditar su código para usos de funciones propensas a errores como strcpy y reemplazarlos por funciones seguras como strncpy, o mejor aún usar objetos que administren su propia memoria como std :: string.

Cuestiones relacionadas