Як генерувати символ налагодження gcc поза ціллю збирання?


176

Я знаю, що можу створити символ налагодження за допомогою параметра -g. Однак символ вбудований у цільовий файл. Чи може gcc генерувати символ налагодження поза виконуваним результатом / бібліотекою? Як і .pdb файл компілятора Windows VC ++.

Відповіді:


184

Для розділення інформації про налагодження потрібно використовувати 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}"

8
Якщо у вас є проблеми у виробництві і вам потрібно приєднати процес за допомогою gdb, чи зможете ви надати файл символу налагодження в GDB? А як, якщо так? thnx
yves Baumes

3
@yves Baumes Просто додайте до вашої виробничої скриньки каталог .debug з файлами .debug, і GDB повинен забрати їх. Після сеансу налагодження ви можете їх знову видалити.
лотар

Зверніться до коментаря відповіді @Lance Richardson для прикладу.
GuruM

7
Чи можливо також відновити вихідний бінарний файл (наприклад, позбавлений файл бінарного + .debug = оригінальний двійковий)?
Пол Прает

1
Чи є у вас проблеми з пропуском --build-idопції лінкера ?
jww

110

Компілювати інформацію про налагодження:

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


2
І вам слід скористатися objcopy --add-gnu-debuglink main main.debugдля вставки імені створеного файлу налагодження та контрольної суми. У цьому випадку gdb спробує знайти сам код налагодження у кількох місцях, що залежать від розподілу, опція -s більше не потрібна.
Лотар

9

Ознайомтеся з опцією "--only-Keep-debug" команди strip .

За посиланням:

Намір полягає в тому, що ця опція буде використовуватися спільно з --add-gnu-debuglink для створення виконуваного з двох частин. Один позбавлений бінарного файлу, який займе менше місця в оперативній пам’яті та в дистрибутиві, а другий - файл інформації про налагодження, який потрібен лише в тому випадку, якщо потрібні злагоджені здібності.


1
Так, я спробував це: gcc -ggdb -o test test.c; cp test test.debug; strip - тільки-тримати-налагоджувати test.debug; стрип-тест; objcopy --add-gnu-debuglink = test.debug test; Тоді нормально тестувати налагодження
zhaorufei

8

ПРИМІТКА: Програми, складені з високими рівнями оптимізації (-O3, -O4), не можуть генерувати багато символів налагодження для оптимізованих змінних, вбудованих функцій та розкручених циклів, незалежно від вбудованих символів (-g) або вилучення (objcopy) у Файл '.debug'.

Альтернативні підходи є

  1. Вставити дані програми (VCS, git, svn) у програму для оптимізованих виконувачем файлів (-O3, -O4).
  2. Створіть 2-ю неоптимізовану версію виконуваного файлу.

Перший варіант передбачає можливість відновити виробничий код з повною налагодженням та символами на більш пізній час. Можливість відновити початковий виробничий код без оптимізацій - це надзвичайна допомога для налагодження. (ПРИМІТКА. Це передбачає, що тестування проводилося в оптимізованій версії програми).

Ваша система збирання може створити .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

Залишилося лише перевірити оригінальний код, перекомпілювати без оптимізацій та почати налагодження.


3
-O4навіть не існує.
Привіт-Ангел

3
На жаль, це може бути з "suncc" днів, коли "-O5" було навіть можливим. Ось посилання на параметри gcc4.4.7 -O: gcc.gnu.org/onlinedocs/gcc-4.4.7/gcc/…
J Jorgenson

3
Це не вирішує поширену проблему спроби інтерпретувати основний дамп, який може бути легко відтворюваним. Порада у цій відповіді слушна, але вона не стосується питання.
Девід Родрігес - дрибес

4

На сьогодні жодної відповіді не згадується eu-strip --strip-debug -f <out.debug> <input>.

  • Це забезпечується elfutilsпакетом.
  • Результатом буде те, що у <input>файлі було позбавлено символів налагодження, які зараз усі <out.debug>.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.