Yanıtlar:
Sen kullanmak gerekir objcopy için hata ayıklama bilgilerini ayırmak :
objcopy --only-keep-debug "${tostripfile}" "${debugdir}/${debugfile}"
strip --strip-debug --strip-unneeded "${tostripfile}"
objcopy --add-gnu-debuglink="${debugdir}/${debugfile}" "${tostripfile}"
Hata ayıklama bilgilerini bir .debug dizininde bir .debug uzantılı dosyalara ayırmak için aşağıdaki bash komut dosyasını kullanın. Bu şekilde bir tar dosyasındaki kütüphaneleri ve yürütülebilir dosyaları, başka bir dosyadaki .debug dizinlerini tarlayabilirim. Hata ayıklama bilgilerini daha sonra eklemek isterseniz, sadece hata ayıklama tar dosyasını ayıklayın ve sembolik hata ayıklama bilgim var.
Bu bash betiği:
#!/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
Bağlayıcı seçeneğini atlamakla ilgili herhangi bir sorun buluyor musunuz ?
Hata ayıklama bilgileriyle derleyin:
gcc -g -o main main.c
Hata ayıklama bilgilerini ayırın:
objcopy --only-keep-debug main main.debug
veya
cp main main.debug
strip --only-keep-debug main.debug
Kaynak dosyadaki hata ayıklama bilgilerini şeritle:
objcopy --strip-debug main
veya
strip --strip-debug --strip-unneeded main
hata ayıklama modu ile hata ayıklama:
objcopy --add-gnu-debuglink main.debug main
gdb main
Ayrıca exec ve sembol dosyalarını ayrı ayrı kullanabilirsiniz:
gdb -s main.debug -e main
veya
gdb
(gdb) exec-file main
(gdb) symbol-file main.debug
Detaylar için:
(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
oluşturulan hata ayıklama dosyasının adını ve bir sağlama toplamı eklemek için kullanmalısınız . Bu durumda gdb hata ayıklama kodunu birkaç dağıtıma bağlı konumda bulmaya çalışacaktır, artık -s seçeneğine gerek yoktur.
Strip komutunun "--only-keep-debug" seçeneğini işaretleyin .
Bağlantıdan:
Amaç, bu seçeneğin iki bölümlü yürütülebilir dosya oluşturmak için --add-gnu-debuglink ile birlikte kullanılmasıdır. Biri RAM'de ve bir dağıtımda daha az yer kaplayacak soyulmuş bir ikilik ve ikincisi sadece hata ayıklama yetenekleri gerektiğinde gerekli olan bir hata ayıklama bilgi dosyası.
NOT: Yüksek optimizasyon düzeyleriyle (-O3, -O4) derlenen programlar, gömülü (-g) veya ayıklanan (objkopi) sembollerden bağımsız olarak, '.debug' dosyası.
Alternatif yaklaşımlar
İlk seçenek, daha sonraki bir tarihte tam hata ayıklama ve sembollerle üretim kodunu yeniden oluşturmak için bir yol sağlar. Herhangi bir optimizasyon olmadan orijinal üretim kodunu yeniden oluşturabilmek hata ayıklama için muazzam bir yardımcıdır. (NOT: Bu, testin programın optimize edilmiş sürümü ile yapıldığını varsayar).
Derleme sisteminiz, derleme tarihi, işleme ve diğer VCS ayrıntılarıyla dolu bir .c dosyası oluşturabilir. İşte bir 'make + git' örneği:
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
Program derlendikten sonra, şu komutu kullanarak kodunuz için orijinal 'commit' kodunu bulabilirsiniz: 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
Geriye kalan tek şey orijinal kodu teslim almak, optimizasyon olmadan yeniden derlemek ve hata ayıklamaya başlamaktır.
-O4
bile yok.