Comment générer le symbole de débogage gcc en dehors de la cible de construction?

Je sais que je peux générer un symbole de débogage en utilisant l’option -g. Cependant, le symbole est intégré dans le fichier cible. Gcc pourrait-il générer un symbole de débogage en dehors de l’exécutable / bibliothèque? Comme le fichier .pdb de Windows VC ++ comstackr fait.

Vous devez utiliser objcopy pour séparer les informations de débogage :

objcopy --only-keep-debug "${tossortingpfile}" "${debugdir}/${debugfile}" ssortingp --ssortingp-debug --ssortingp-unneeded "${tossortingpfile}" objcopy --add-gnu-debuglink="${debugdir}/${debugfile}" "${tossortingpfile}" 

J’utilise le script bash ci-dessous pour séparer les informations de débogage en fichiers avec une extension .debug dans un répertoire .debug. De cette façon, je peux utiliser les bibliothèques et les exécutables dans un fichier tar et les répertoires .debug dans un autre. Si je veux append les informations de débogage plus tard, j’extrais simplement le fichier tar de débogage et voilà, j’ai des informations de débogage symboliques.

Ceci est le script bash:

 #!/bin/bash scriptdir=`dirname ${0}` scriptdir=`(cd ${scriptdir}; pwd)` scriptname=`basename ${0}` set -e function errorexit() { errorcode=${1} shift echo $@ exit ${errorcode} } function usage() { echo "USAGE ${scriptname} " } tossortingpdir=`dirname "$1"` tossortingpfile=`basename "$1"` if [ -z ${tossortingpfile} ] ; then usage errorexit 0 "tossortingp must be specified" fi cd "${tossortingpdir}" debugdir=.debug debugfile="${tossortingpfile}.debug" if [ ! -d "${debugdir}" ] ; then echo "creating dir ${tossortingpdir}/${debugdir}" mkdir -p "${debugdir}" fi echo "ssortingpping ${tossortingpfile}, putting debug info into ${debugfile}" objcopy --only-keep-debug "${tossortingpfile}" "${debugdir}/${debugfile}" ssortingp --ssortingp-debug --ssortingp-unneeded "${tossortingpfile}" objcopy --add-gnu-debuglink="${debugdir}/${debugfile}" "${tossortingpfile}" chmod -x "${debugdir}/${debugfile}" 

Comstackr avec les informations de débogage:

 gcc -g -o main main.c 

Séparez les informations de débogage:

 objcopy --only-keep-debug main main.debug 

ou

 cp main main.debug ssortingp --only-keep-debug main.debug 

Supprimez les informations de débogage du fichier d’origine:

 objcopy --ssortingp-debug main 

ou

 ssortingp --ssortingp-debug --ssortingp-unneeded main 

debug par le mode debuglink:

 objcopy --add-gnu-debuglink main.debug main gdb main 

Vous pouvez également utiliser le fichier exec et le fichier de symboles séparément:

 gdb -s main.debug -e main 

ou

 gdb (gdb) exec-file main (gdb) symbol-file main.debug 

Pour plus de détails:

 (gdb) help exec-file (gdb) help symbol-file 

Ref:
https://sourceware.org/gdb/onlinedocs/gdb/Files.html#Files https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html

Découvrez l’option “–only-keep-debug” de la commande ssortingp .

À partir du lien:

L’intention est que cette option soit utilisée avec –add-gnu-debuglink pour créer un exécutable en deux parties. Un binary dépouillé qui occupera moins d’espace dans la RAM et dans une dissortingbution et le second un fichier d’information de débogage qui n’est nécessaire que si des capacités de débogage sont requirejses.

REMARQUE: 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 alignées et les boucles déroulées, quels que soient les symboles incorporés (-g) ou extraits (objcopy) dans un Fichier ‘.debug’.

Les approches alternatives sont

  1. Intégrez les données de gestion des versions (VCS, git, svn) dans le programme pour les exécutables optimisés pour le compilateur (-O3, -O4).
  2. Construisez une 2ème version non optimisée de l’exécutable.

La première option fournit un moyen de reconstruire le code de production avec un débogage complet et des symboles à une date ultérieure. Pouvoir reconstruire le code de production d’origine sans optimisation est une aide considérable pour le débogage. (REMARQUE: cela suppose que les tests ont été effectués avec la version optimisée du programme).

Votre système de génération peut créer un fichier .c chargé avec la date de compilation, la validation et d’autres détails VCS. Voici un exemple «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 comstackr 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: ssortingngs -a my_program | grep VCS ssortingngs -a my_program | grep VCS

 VCS: PROGRAM_NAME=my_program VCS: Commit=190aa9cace3b12e2b58b692f068d4f5cf22b0145 VCS: BRANCH=refs/heads/PRJ123_feature_desc VCS: AUTHOR=Joe Developer [email protected] VCS: COMMIT_DATE=2013-12-19 

Il ne rest plus qu’à extraire le code d’origine, à le recomstackr sans optimisation et à démarrer le débogage.