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
Respuesta
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 SIGSEGV
sa_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.
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. –
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
}
'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
que tienden a utilizar valgrind
que indica fugas y fallos de acceso a memoria .
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
@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
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.
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
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.
- 1. ¿Por qué recibo una falla de segmentación?
- 2. ¿Qué causa una falla de segmentación de Python?
- 3. falla de segmentación: 11
- 4. falla de segmentación getopt_long_only
- 5. ¿Por qué mi programa no falla cuando escribo después del final de una matriz?
- 6. Falla de segmentación de Sprintf
- 7. Manejo de falla de segmentación
- 8. falla de segmentación node.js: 11
- 9. falla de segmentación con strcpy
- 10. ¿Qué registrar cuando ocurre una excepción?
- 11. Ejecución de printf() y falla de segmentación
- 12. fallo de segmentación en el programa c
- 13. Cuando ordeno una Lista, ¿qué ocurre con sus iteradores?
- 14. Cómo depurar un programa cuando falla sin excepción?
- 15. Número de línea de falla de segmentación
- 16. ¿Por qué aparece una falla de segmentación al iterar a través de esta cadena?
- 17. Programa recibió SIGSEGV señal, Fallo de segmentación
- 18. ¿Por qué replaceAll falla con "referencia de grupo ilegal"?
- 19. GHC: falla de segmentación en condiciones extrañas
- 20. Problema con strtok y falla de segmentación
- 21. función de ordenación C++ falla de segmentación
- 22. ¿Qué ocurre con "Microsoft.Practices.EnterpriseLibrary.Caching" cuando intenta acceder a "CacheFactory.GetCacheManager();"?
- 23. accediendo a un mapa estático de una función de miembro estático - falla de segmentación - C++
- 24. ¿Cómo puedo encontrar una falla de segmentación de múltiples archivos usando GDB
- 25. Un simple programa de memoria compartida en C++ escrito en Linux: falla de segmentación
- 26. ¿Cómo obtener un seguimiento de pila cuando falla el programa C++? (usando msvc8/2005)
- 27. Fallo de segmentación cuando al buscar el nombre de host y la dirección IP
- 28. ¿Qué sucede en la arquitectura x86 cuando ocurre una interrupción?
- 29. glGenBuffers() bloqueando con falla de Segmentación. (C++/GLFW/GLEW)
- 30. ¿Cómo sé cuando HTML ha rendido totalmente
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