NOTE : Les programmes compilés avec des niveaux d'optimisation élevés (-O3, -O4) ne peuvent pas générer de nombreux symboles de débogage pour les variables optimisées, les fonctions in-lined et les boucles unrolled, que les symboles soient intégrés (-g) ou extraits (objcopy) dans un fichier '.debug'.
D'autres approches sont
- Intégrer les données de versionnement (VCS, git, svn) dans le programme, pour les exécutables optimisés pour le compilateur (-O3, -O4).
- Construire une 2ème version non optimisée de l'exécutable.
La première option permet de reconstruire le code de production avec un débogage complet et des symboles à une date ultérieure. La possibilité de reconstruire le code de production original sans optimisation est une aide précieuse pour le débogage. (NOTE : Ceci suppose que les tests ont été effectués avec la version optimisée du programme).
Votre système de construction peut créer un fichier .c chargé avec la date de compilation, le commit et d'autres détails VCS. Voici un exemple 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
Une fois le programme compilé, vous pouvez localiser le 'commit' original de votre code en utilisant la commande : 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
Il ne reste plus qu'à vérifier le code original, à le recompiler sans les optimisations et à commencer le débogage.