2010-05-12 18 views
6

Además, el programa se ejecuta en un dispositivo de brazo que ejecuta Linux, puedo imprimir información de pila y registrar valores en el controlador sig-seg asignado. El problema es que no puedo agregar la opción -g al archivo fuente, ya que es posible que el error no se reproduzca debido a la degradación del rendimiento.Cómo sé a qué dirección ilegal accede el programa cuando ocurre una falla de segmentación

+2

Al menos con GCC puede agregar -g sin deshabilitar la optimización. Y en los objetivos ELF, GCC coloca la información de depuración en secciones separadas, por lo que ni siquiera se cargarán desde el disco hasta que sea necesario. – janneb

Respuesta

12

Compilar con la opción -g-gcc hace no causa una "rebaja el rendimiento". Todo lo que hace es provocar que se incluyan símbolos de depuración; lo hace no afecta la optimización o generación de código.

Si instala el controlador utilizando el SIGSEGVsa_sigaction miembro de la estructura sigaction pasó a sigaction(), entonces el si_addr miembro de la estructura siginfo_t pasado a su manejador contiene la dirección de fallas.

+1

He tenido problemas en los que apareció un segfault causado por escribir en un puntero no inicializado, y desapareció dependiendo de si usé -g, o qué -o nivel que tenía . Tiene que ver con qué memoria está dónde. Del mismo modo, he tenido que agregar o borrar una printf hizo que aparezca el error. segfaults en C pueden ser astutos bastardos. –

1

Esto parece funcionar http://tlug.up.ac.za/wiki/index.php/Obtaining_a_stack_trace_in_C_upon_SIGSEGV

static void signal_segv(int signum, siginfo_t* info, void*ptr) { 
// info->si_addr is the illegal address 
} 
+0

'info-> si_addr' es la dirección de memoria de fallas. Como se indica en el enlace que proporcionó, la dirección en el momento en que se levantó la señal se puede recuperar de 'void * ptr'. Vea mi respuesta aquí para el código que he usado con ARM - http://stackoverflow.com/questions/77005/how-to-generate-a-stacktrace-when-my-gcc-c-app-crashes/1925461#1925461 – jschmier

3

que tienden a utilizar valgrind que indica fugas y fallos de acceso a memoria .

+0

valgrind es para X86, AMD64 y PPC: el cuestionario se ejecuta en ARM. Sin embargo, estoy gratamente sorprendido de leer que el soporte de ARM está en progreso. – crazyscot

+0

@crazyscot De hecho, me perdí la parte del "brazo" de la pregunta.Pero es bueno saber que valgrind está a punto de apoyar esta arquitectura;) – ereOn

1

Si le preocupa usar -g en el binario que carga en el dispositivo, puede usar gdbserver en el dispositivo ARM con una versión reducida del ejecutable y ejecutar arm-gdb en su máquina de desarrollo con la versión sin trinchar del ejecutable. La versión simplificada y la versión sin pelar tienen que coincidir para hacer esto, así que hacer esto:

# You may add your own optimization flags 
arm-gcc -g program.c -o program.debug 
arm-strip --strip-debug program.debug -o program 
# or 
arm-strip --strip-unneeded program.debug -o program 

Tendrá que leer la documentación del BGF y gdbserver de averiguar cómo usarlos. No es tan difícil, pero no está tan pulido como podría ser. Principalmente es muy fácil decirle accidentalmente a gdb que haga algo que termine pensando que pretendía hacer localmente, por lo que se desconectará del modo de depuración remota.

1

Es posible que también desee utilizar la función backtrace() si está disponible, que proporcionará la pila de llamadas en el momento del bloqueo. Esto se puede usar para volcar la pila como sucede en un lenguaje de programación de alto nivel cuando un programa C obtiene un error de segmentación, error de bus u otro error de violación de memoria.

traza inversa() está disponible tanto en Linux y Mac OS X

0

Si la opción -g hace desaparecer el error, a continuación, saber dónde se estrella es poco probable que sea útil de todos modos. Probablemente esté escribiendo en un puntero no inicializado en la función A, y luego la función B intenta usar legítimamente esa memoria, y muere. Los errores de memoria son un dolor.

Cuestiones relacionadas