Jawaban:
Anda perlu menggunakan keberatan untuk memisahkan informasi debug :
objcopy --only-keep-debug "${tostripfile}" "${debugdir}/${debugfile}"
strip --strip-debug --strip-unneeded "${tostripfile}"
objcopy --add-gnu-debuglink="${debugdir}/${debugfile}" "${tostripfile}"
Saya menggunakan skrip bash di bawah ini untuk memisahkan informasi debug ke dalam file dengan ekstensi .debug di direktori .debug. Dengan cara ini saya bisa tar pustaka dan executables dalam satu file tar dan direktori .debug di yang lain. Jika saya ingin menambahkan info debug nanti saya cukup mengekstrak file tar debug dan voila saya memiliki informasi debug simbolis.
Ini skrip 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
opsi tautan ?
Kompilasi dengan informasi debug:
gcc -g -o main main.c
Pisahkan informasi debug:
objcopy --only-keep-debug main main.debug
atau
cp main main.debug
strip --only-keep-debug main.debug
Hapus informasi debug dari file asal:
objcopy --strip-debug main
atau
strip --strip-debug --strip-unneeded main
debug dengan mode debuglink:
objcopy --add-gnu-debuglink main.debug main
gdb main
Anda juga dapat menggunakan file exec dan file simbol secara terpisah:
gdb -s main.debug -e main
atau
gdb
(gdb) exec-file main
(gdb) symbol-file main.debug
Untuk detail:
(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
objcopy --add-gnu-debuglink main main.debug
untuk menanamkan nama file debug yang dibuat dan checksum. Dalam hal ini gdb akan mencoba menemukan kode debug itu sendiri di beberapa lokasi tergantung distribusi, opsi no -s diperlukan lagi.
Periksa opsi "--only-keep-debug" dari perintah strip .
Dari tautan:
Tujuannya adalah bahwa opsi ini akan digunakan bersama dengan --add-gnu-debuglink untuk membuat dua bagian yang dapat dieksekusi. Satu biner yang dilucuti yang akan menempati lebih sedikit ruang dalam RAM dan dalam distribusi dan yang kedua file informasi debugging yang hanya diperlukan jika kemampuan debugging diperlukan.
CATATAN: Program yang dikompilasi dengan level optimisasi tinggi (-O3, -O4) tidak dapat menghasilkan banyak simbol debug untuk variabel yang dioptimalkan, fungsi in-lined dan loop yang tidak dikontrol, terlepas dari simbol yang tertanam (-g) atau diekstraksi (keberatan) ke dalam File '.debug'.
Pendekatan alternatif adalah
Opsi pertama menyediakan sarana untuk membangun kembali kode produksi dengan debugging penuh dan simbol di kemudian hari. Mampu membangun kembali kode produksi asli tanpa optimasi adalah bantuan luar biasa untuk debugging. (CATATAN: Ini mengasumsikan pengujian dilakukan dengan versi program yang dioptimalkan).
Sistem build Anda dapat membuat file .c yang dimuat dengan tanggal kompilasi, komit, dan detail VCS lainnya. Berikut ini contoh '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
Setelah program dikompilasi, Anda dapat menemukan 'komit' asli untuk kode Anda dengan menggunakan perintah: 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
Yang tersisa hanyalah memeriksa kode asli, mengkompilasi ulang tanpa optimisasi, dan mulai debugging.
-O4
bahkan tidak ada.