Sie müssen objcopy verwenden , um die Debug-Informationen zu trennen :
objcopy --only-keep-debug "${tostripfile}" "${debugdir}/${debugfile}"
strip --strip-debug --strip-unneeded "${tostripfile}"
objcopy --add-gnu-debuglink="${debugdir}/${debugfile}" "${tostripfile}"
Ich verwende das folgende Bash-Skript, um die Debug-Informationen in Dateien mit der Erweiterung .debug in einem .debug-Verzeichnis zu unterteilen. Auf diese Weise kann ich die Bibliotheken und ausführbaren Dateien in einer TAR-Datei und die .debug-Verzeichnisse in einer anderen tarieren. Wenn ich die Debug-Informationen später hinzufügen möchte, extrahiere ich einfach die Debug-Tar-Datei und voila, ich habe symbolische Debug-Informationen.
Dies ist das Bash-Skript:
#!/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
Linker-Option ?Kompilieren Sie mit Debug-Informationen:
Trennen Sie die Debug-Informationen:
oder
Debug-Informationen aus der Ursprungsdatei entfernen:
oder
Debugging im Debuglink-Modus:
Sie können die Exec-Datei und die Symboldatei auch separat verwenden:
oder
Für Details:
Ref:
https://sourceware.org/gdb/onlinedocs/gdb/Files.html#Files https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html
quelle
objcopy --add-gnu-debuglink main main.debug
, um den Namen der erstellten Debug-Datei und eine Prüfsumme einzubetten. In diesem Fall versucht gdb, den Debug-Code selbst an einigen verteilungsabhängigen Orten zu finden. Die Option -s wird nicht mehr benötigt.Überprüfen Sie die Option "--only-keep-debug" des Befehls strip .
Über den Link:
quelle
HINWEIS: Programme, die mit hohen Optimierungsstufen (-O3, -O4) kompiliert wurden, können nicht viele Debugging-Symbole für optimierte Variablen, Inline-Funktionen und entrollte Schleifen generieren, unabhängig davon, welche Symbole in a eingebettet (-g) oder extrahiert (objcopy) werden '.debug' Datei.
Alternative Ansätze sind
Die erste Option bietet die Möglichkeit, den Produktionscode zu einem späteren Zeitpunkt mit vollständigem Debugging und Symbolen neu zu erstellen. Die Möglichkeit, den ursprünglichen Produktionscode ohne Optimierungen neu zu erstellen, ist eine enorme Hilfe beim Debuggen. (HINWEIS: Dies setzt voraus, dass die Tests mit der optimierten Version des Programms durchgeführt wurden.)
Ihr Build-System kann eine C-Datei erstellen, die mit dem Kompilierungsdatum, dem Commit und anderen VCS-Details geladen ist. Hier ist ein Beispiel für 'make + git':
Nachdem das Programm kompiliert wurde, können Sie das ursprüngliche 'Commit' für Ihren Code mithilfe des folgenden Befehls suchen:
strings -a my_program | grep VCS
Sie müssen nur noch den Originalcode auschecken, ohne Optimierungen neu kompilieren und mit dem Debuggen beginnen.
quelle
-O4
existiert nicht einmal.Bisher keine Antwort erwähnt
eu-strip --strip-debug -f <out.debug> <input>
.elfutils
Paket bereitgestellt .<input>
Datei von Debug-Symbolen befreit wurde, die jetzt alle enthalten sind<out.debug>
.quelle