Je sais que je peux générer un symbole de débogage en utilisant l'option -g. Cependant, le symbole est incorporé dans le fichier cible. Gcc pourrait-il générer un symbole de débogage en dehors de l'exécutable/de la bibliothèque de résultats? Comme fichier .pdb de Windows VC++ compilateur fait.Comment générer un symbole de débogage gcc en dehors de la cible de génération?
Répondre
Vous devez utiliser objcopy-separate the debug information:
objcopy --only-keep-debug "${tostripfile}" "${debugdir}/${debugfile}"
strip --strip-debug --strip-unneeded "${tostripfile}"
objcopy --add-gnu-debuglink="${debugdir}/${debugfile}" "${tostripfile}"
J'utilise le script bash ci-dessous pour séparer les informations de débogage dans les fichiers avec une extension .debug dans un répertoire .debug. De cette façon, je peux tarer les bibliothèques et les exécutables dans un fichier tar et les répertoires .debug dans un autre. Si je veux ajouter l'information de débogage plus tard, j'extrais simplement le fichier tar de débogage et voila j'ai des informations de débogage symboliques.
Voici le script bash:
#!/bin/bash
scriptdir=`dirname ${0}`
scriptdir=`(cd ${scriptdir}; pwd)`
scriptname=`basename ${0}`
set -e
function errorexit()
{
errorcode=${1}
shift
echo [email protected]
exit ${errorcode}
}
function usage()
{
echo "USAGE ${scriptname} <tostrip>"
}
tostripdir=`dirname "$1"`
tostripfile=`basename "$1"`
if [ -z ${tostripfile} ] ; then
usage
errorexit 0 "tostrip must be specified"
fi
cd "${tostripdir}"
debugdir=.debug
debugfile="${tostripfile}.debug"
if [ ! -d "${debugdir}" ] ; then
echo "creating dir ${tostripdir}/${debugdir}"
mkdir -p "${debugdir}"
fi
echo "stripping ${tostripfile}, putting debug info into ${debugfile}"
objcopy --only-keep-debug "${tostripfile}" "${debugdir}/${debugfile}"
strip --strip-debug --strip-unneeded "${tostripfile}"
objcopy --add-gnu-debuglink="${debugdir}/${debugfile}" "${tostripfile}"
chmod -x "${debugdir}/${debugfile}"
Découvrez l'option "--only-keep-debug" de la commande strip.
À partir du lien:
L'intention est que cette option sera utilisée conjointement avec --add-gnu-debuglink pour créer un exécutable en deux parties. Un binaire dépouillé qui occupera moins d'espace dans la RAM et dans une distribution et le second un fichier d'information de débogage qui n'est nécessaire que si des capacités de débogage sont requises.
Oui, je l'ai essayé: gcc -ggdb -o test test.c; cp test test.debug; strip --only-keep-debug test.debug; test de bande; Objcopy --add-gnu-debuglink = test.debug test; Ensuite, il est bon de déboguer le test – zhaorufei
Compile avec des informations de débogage:
gcc -g -o main main.c
séparé les informations de débogage:
objcopy --only-keep-debug main main.debug
ou
cp main main.debug
strip --only-keep-debug main.debug
bande des informations de débogage du fichier d'origine:
objcopy --strip-debug main
ou
strip --strip-debug --strip-unneeded main
débogage en mode debuglink:
objcopy --add-gnu-debuglink main.debug main
gdb main
Vous pouvez également utiliser le fichier exec et le fichier symbole séparemment :
gdb -s main.debug -e main
ou
gdb
(gdb) exec-file main
(gdb) symbol-file main.debug
Pour en savoir plus:
(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
Et vous devriez utiliser '' 'objcopy --add-gnu-debuglink principal main.debug''' pour intégrer le nom du fichier de débogage créé et une somme de contrôle. Dans ce cas, gdb essayera de trouver le code de débogage lui-même dans quelques emplacements dépendants de la distribution, aucune option -s n'est plus nécessaire. – Lothar
NOTE: Les programmes compilés avec haut niveau de l'optimisation s (-O3, -O4) ne peut pas générer beaucoup de symboles de débogage pour les variables optimisées, les fonctions intégrées et les boucles déroulées, quels que soient les symboles incorporés (-g) ou extraits (objcopy) dans un fichier '.debug'. A) Incorporer les données de versionnement (VCS, git, svn) dans le programme, pour les exécutables optimisés par compilateur (-O3, -O4).
b) Construire une deuxiè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. Etre capable de reconstruire le code de production original sans optimisations est une aide précieuse pour le débogage. (NOTE: Cela suppose que le test a été fait 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 make + git 'exemple:
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)\";" > "[email protected]"
@echo "const char *build2=\"VCS: Date: $(shell git log -1 --pretty=%cd)\";" >> "[email protected]"
@echo "const char *build3=\"VCS: Author: $(shell git log -1 --pretty="%an %ae")\";" >> "[email protected]"
@echo "const char *build4=\"VCS: Branch: $(shell git symbolic-ref HEAD)\";" >> "[email protected]"
# TODO: Add compiler options and other build details
.TEMPORARY: build_version.c
Une fois le programme compilé, vous pouvez localiser le « commit » original pour 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 [email protected]
VCS: COMMIT_DATE=2013-12-19
Tout ce qui reste est de vérifier le code d'origine, recompiler sans optimisations, et commencer le débogage.
'-O4' n'existe même pas. –
Oups, cela peut être de mai 'suncc' jours, où '-O5' était même une option. Voici un lien vers les options gcc4.4.7 -O: https://gcc.gnu.org/onlinedocs/gcc-4.4.7/gcc/Optimize-Options.html#Optimize-Options –
Cela ne résout pas le problème commun de essayer d'interpréter un vidage de base qui peut ne pas être facilement reproductible. Le conseil dans cette réponse est solide, * mais * il n'aborde pas la question. –
Si vous rencontrez un problème en production et que vous devez joindre le processus à gdb, seriez-vous en mesure de fournir le fichier de symboles de débogage à GDB? Et comment, si oui? thnx –
@yves Baumes Ajoutez simplement le répertoire .debug avec les fichiers .debug à votre boîte de production et GDB devrait les récupérer. Après la session de débogage, vous pouvez les supprimer à nouveau. – lothar
Référez @Lance Richardson répondre aux commentaires pour un exemple. – GuruM