Saya tahu saya bisa membuat simbol debug menggunakan opsi -g. Namun simbol tertanam dalam file target. Bisakah gcc membuat simbol debug di luar hasil executable / library? Seperti file .pdb dari kompiler windows VC ++ lakukan.
176
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:
Pisahkan informasi debug:
atau
Hapus informasi debug dari file asal:
atau
debug dengan mode debuglink:
Anda juga dapat menggunakan file exec dan file simbol secara terpisah:
atau
Untuk detail:
Ref:
https://sourceware.org/gdb/onlinedocs/gdb/Files.html#Files https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html
sumber
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:
sumber
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':
Setelah program dikompilasi, Anda dapat menemukan 'komit' asli untuk kode Anda dengan menggunakan perintah:
strings -a my_program | grep VCS
Yang tersisa hanyalah memeriksa kode asli, mengkompilasi ulang tanpa optimisasi, dan mulai debugging.
sumber
-O4
bahkan tidak ada.Tidak ada jawaban yang disebutkan sejauh ini
eu-strip --strip-debug -f <out.debug> <input>
.elfutils
paket.<input>
file tersebut telah dilucuti dari simbol debug yang sekarang semuanya ada<out.debug>
.sumber