Відповіді:
Для розділення інформації про налагодження потрібно використовувати objcopy :
objcopy --only-keep-debug "${tostripfile}" "${debugdir}/${debugfile}"
strip --strip-debug --strip-unneeded "${tostripfile}"
objcopy --add-gnu-debuglink="${debugdir}/${debugfile}" "${tostripfile}"
Я використовую скрипт bash нижче, щоб розділити інформацію про налагодження у файли з розширенням .debug у каталозі .debug. Таким чином я можу орієнтувати бібліотеки та виконувані файли в одному файлі tar та .debug-каталогах в іншому. Якщо я хочу додати інформацію про налагодження пізніше, я просто витягую файл tar-файлу та вуаля, у мене є символічна інформація про налагодження.
Це сценарій 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
опції лінкера ?
Компілювати інформацію про налагодження:
gcc -g -o main main.c
Відокремте інформацію про налагодження:
objcopy --only-keep-debug main main.debug
або
cp main main.debug
strip --only-keep-debug main.debug
Зніміть інформацію про налагодження з файлу походження:
objcopy --strip-debug main
або
strip --strip-debug --strip-unneeded main
налагодження в режимі налагодження:
objcopy --add-gnu-debuglink main.debug main
gdb main
Ви також можете використовувати файл exec та файл символів окремо:
gdb -s main.debug -e main
або
gdb
(gdb) exec-file main
(gdb) symbol-file main.debug
Детальніше:
(gdb) help exec-file
(gdb) help symbol-file
Посилання:
https://sourceware.org/gdb/onlinedocs/gdb/Files.html#Files
https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html
objcopy --add-gnu-debuglink main main.debug
для вставки імені створеного файлу налагодження та контрольної суми. У цьому випадку gdb спробує знайти сам код налагодження у кількох місцях, що залежать від розподілу, опція -s більше не потрібна.
Ознайомтеся з опцією "--only-Keep-debug" команди strip .
За посиланням:
Намір полягає в тому, що ця опція буде використовуватися спільно з --add-gnu-debuglink для створення виконуваного з двох частин. Один позбавлений бінарного файлу, який займе менше місця в оперативній пам’яті та в дистрибутиві, а другий - файл інформації про налагодження, який потрібен лише в тому випадку, якщо потрібні злагоджені здібності.
ПРИМІТКА: Програми, складені з високими рівнями оптимізації (-O3, -O4), не можуть генерувати багато символів налагодження для оптимізованих змінних, вбудованих функцій та розкручених циклів, незалежно від вбудованих символів (-g) або вилучення (objcopy) у Файл '.debug'.
Альтернативні підходи є
Перший варіант передбачає можливість відновити виробничий код з повною налагодженням та символами на більш пізній час. Можливість відновити початковий виробничий код без оптимізацій - це надзвичайна допомога для налагодження. (ПРИМІТКА. Це передбачає, що тестування проводилося в оптимізованій версії програми).
Ваша система збирання може створити .c файл, завантажений із датою компіляції, фіксацією та іншими деталями VCS. Ось приклад "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
Після компіляції програми ви можете знайти оригінальний "фіксатор" свого коду за допомогою команди: 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
Залишилося лише перевірити оригінальний код, перекомпілювати без оптимізацій та почати налагодження.
-O4
навіть не існує.