Vous devez utiliser objcopy pour séparer les informations de débogage :
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 en 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 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.
Voici 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} <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}"
--build-id
option de l'éditeur de liens ?Compilez avec les informations de débogage:
Séparez les informations de débogage:
ou
Supprimez les informations de débogage du fichier d'origine:
ou
débogage par mode debuglink:
Vous pouvez également utiliser séparément le fichier exécutable et le fichier symbole:
ou
Pour plus de détails:
Réf:
https://sourceware.org/gdb/onlinedocs/gdb/Files.html#Files https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html
la source
objcopy --add-gnu-debuglink main main.debug
pour incorporer le nom du fichier de débogage créé et une somme de contrôle. Dans ce cas, gdb essaiera 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.Découvrez l'option "--only-keep-debug" de la bande commande .
Depuis le lien:
la source
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 intégrées et les boucles déroulées, quels que soient les symboles incorporés (-g) ou extraits (objcopy) dans un Fichier '.debug'.
D'autres approches sont
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. Être capable de reconstruire le code de production d'origine sans optimisation est une aide considérable pour le débogage. (REMARQUE: cela suppose que le test a été effectué avec la version optimisée du programme).
Votre système de construction peut créer un fichier .c chargé avec la date de compilation, la validation et d'autres détails du VCS. Voici un exemple 'make + git':
Une fois le programme compilé, vous pouvez localiser le 'commit' d'origine de votre code en utilisant la commande:
strings -a my_program | grep VCS
Il ne reste plus qu'à extraire le code d'origine, à recompiler sans optimisations et à démarrer le débogage.
la source
-O4
n'existe même pas.Aucune réponse à ce jour mentionne
eu-strip --strip-debug -f <out.debug> <input>
.elfutils
package.<input>
fichier a été dépouillé des symboles de débogage qui sont maintenant tous inclus<out.debug>
.la source