2011-10-04 15 views
5

He encontrado un error de segmentación por cable. Estoy desarrollando un software en C usando Eclipse CDT. Cuando ejecuto mi programa en la terminal (Ubuntu 10, 64bits), simplemente informa "Error de segmentación". Sin embargo, cuando depuro usando gdb en Eclipse, va hasta el final y el resultado es correcto.Error de segmentación al ejecutar, pero éxito al depurar

Entiendo que podría haber muchas razones para las fallas de segmentación. Y lamento no poder mostrar mi código, ya que no sé dónde podría estar el problema ...

Pero, ¿alguien podría ayudarme? ¿Hay alguna situación que pueda suceder como mi caso? Error de segmentación en los terminales, aunque está bien en la depuración? Muchas gracias.


Gracias, todos. Pasaría algún tiempo aprendiendo valgrind. Acabo de arreglar el error reemplazando un malloc() por realloc(). La llamada es seguida por dos memcpy. ¿Esa es la razón? Aquí está el código de fragmento:

bwa_seq_t *merge_seq (bwa_seq_t *s1, bwa_seq_t *s2) { 
    ubyte_t *seq1, *seq2, *tmp; 
    if (!s1 || !s2) 
    return 0; 
    seq1 = s1->seq; 
    seq2 = s2->seq; 
    tmp = (ubyte_t*) calloc (sizeof(ubyte_t), (s2->len + s1->len + 1)); 
    memcpy(tmp, seq1, sizeof(ubyte_t) * s1->len); 
    memcpy(&tmp[s1->len], seq2, sizeof(ubyte_t) * s2->len); 
    s1->len += s2->len; 
    tmp[s1->len] = '\0'; 
    s1->seq = tmp; 
    return s1; 
} 

¿Alguien podría ayudar a explicar por qué?

+0

Es probable que haya una acumulación de pila y/o montón. Asegúrese de habilitar advertencias completas en su compilador y tratar con todas ellas. Argumentos incompatibles con 'printf' y cosas por el estilo son cosas que hay que tener en cuenta. – Mat

+2

Ejecute su programa en [valgrind] (http://valgrind.org/), el problema probablemente sea evidente. – Hasturkun

Respuesta

9

prueba los siguientes pasos:

  • tipo ulimit -c unlimited en un xterm (esto permite la creación de núcleo/archivos postmorterm)

  • lanzamiento de su programa (y deja que choque): un archivo de núcleo ahora debería estar presente en el directorio.

  • lanzamiento del depurador con gdb <yourprogram> <corefile>

  • tipo bt en el indicador de GDB para ver en qué línea se hizo accidente.

  • (opcional) corrigen el error.

+0

Esto básicamente es la respuesta de lsalamon. 1 minuto después ^^ –

+2

Er, sí. Pero esta respuesta parece más completa para mí. – Joy

0

Esto es probablemente el resultado de una variable no inicializada. (En la línea 14 de su programa)

+0

¿Por qué la línea 14, específicamente? – Hasturkun

+2

Tuve que adivinar; el OP no mostró ninguna fuente relevante. – wildplasser

5

Si sabe cómo se cuelgue desde el terminal, puede hacer que crear un fichero de núcleo e inspeccionar el punto donde se estrelló la siguiente manera:

$ ulimit -c unlimited # to create a corefile 
$ yourprogram 
... 
crash     # this will create file "core" in the current directory 
$ gdb yourprogram core # shows the state at the moment of the crash 

Pregunta sobre el que se tema:

0

Compila con información de depuración y usa gdb para identificar dónde ocurre el error al usar el volcado.

0

Es muy probable que esté alcanzando algún tipo de Comportamiento Indefinido. Como ya han dicho otros, use Valgrind para depurar este problema. En primer lugar, busque los errores de ESCRIBIR NO VÁLIDO, ESCRIBIR NO VÁLIDO en la salida Valgrind. También emitirá pilas de llamadas adicionales cuando sucedan cosas malas en su código. Esto debería ayudar a entender la razón del error.

0

También me enfrenté a este problema antes. No en Linux con el compilador de GCC pero en Visual Studio 2005. Era como si mi código se ejecutara correctamente en el modo de depuración mientras estaba en modo de lanzamiento (ejecución directa). El hecho es que cuando se depura el código, el depurador se ocupa de excepciones como Violación de acceso, matriz fuera de límite, etc., y no permite que el código se cuelgue. En el modo de ejecución directa, no hay nadie que se encargue de las excepciones y, por lo tanto, el código se cuelga.

Le sugiero que use printf para mostrar el resultado de la operación intermedia, ya que es la mejor forma de solucionar el problema de su código.

la esperanza que esto ayudaría a que .. :-)

0

Por cierto: se filtra la memoria aquí. s1-> seq básicamente se está reasignando, pero se te olvida liberar el viejo recuerdo. Cambio:

s1->len += s2->len; 
tmp[s1->len] = '\0'; 
s1->seq = tmp; 
return s1; 

en:

void *del; // <<-- 
s1->len += s2->len; 
tmp[s1->len] = '\0'; 
del = s1->seq; // <<-- 
s1->seq = tmp; 
free (del); // <-- 
return s1; 

, y al menos dejarás de fugas.

Cuestiones relacionadas