NOTA: Los programas compilados con niveles de alta optimización (-O3, -O4) no pueden generar muchos símbolos de depuración para variables optimizadas, funciones alineadas y bucles desenrollados, independientemente de los símbolos que se incrustan (-g) o se extraen (objcopy) en un archivo '.debug'.
Los enfoques alternativos son
- Incruste los datos de control de versiones (VCS, git, svn) en el programa, para los ejecutables optimizados del compilador (-O3, -O4).
- Cree una segunda versión no optimizada del ejecutable.
La primera opción proporciona un medio para reconstruir el código de producción con depuración completa y símbolos en una fecha posterior. Poder reconstruir el código de producción original sin optimizaciones es una gran ayuda para la depuración. (NOTA: Esto supone que las pruebas se realizaron con la versión optimizada del programa).
Su sistema de compilación puede crear un archivo .c cargado con la fecha de compilación, el compromiso y otros detalles de VCS. Aquí hay un ejemplo de 'make + git':
program: program.o version.o
program.o: program.cpp program.h
build_version.o: build_version.c
build_version.c:
@echo "const char *build1=\"VCS: Commit: $(shell git log -1 --pretty=%H)\";" > "$@"
@echo "const char *build2=\"VCS: Date: $(shell git log -1 --pretty=%cd)\";" >> "$@"
@echo "const char *build3=\"VCS: Author: $(shell git log -1 --pretty="%an %ae")\";" >> "$@"
@echo "const char *build4=\"VCS: Branch: $(shell git symbolic-ref HEAD)\";" >> "$@"
# TODO: Add compiler options and other build details
.TEMPORARY: build_version.c
Después de compilar el programa, puede ubicar el 'commit' original para su código utilizando el comando: strings -a my_program | grep VCS
VCS: PROGRAM_NAME=my_program
VCS: Commit=190aa9cace3b12e2b58b692f068d4f5cf22b0145
VCS: BRANCH=refs/heads/PRJ123_feature_desc
VCS: AUTHOR=Joe Developer joe.developer@somewhere.com
VCS: COMMIT_DATE=2013-12-19
Todo lo que queda es verificar el código original, volver a compilar sin optimizaciones y comenzar a depurar.
--build-id
opción de enlazador ?