Debian 上调试的源代码位置?

Debian 上调试的源代码位置?

来自 Debian 的调试包,我知道在创建两部分可执行文件时,可执行文件的调试信息文件会进入/usr/lib/debug(即,剥离可执行文件的符号并将它们放在单独的文件中)。

但是,符号文件将引用源文件,并且我不知道源文件应该放置在哪里。在 Red Hat/Fedora 上,我知道它们位于/usr/src/debug(根据 Fedora 的打包:调试信息)。

在 Debian 上进行调试的源文件应该放在哪里?


一个具体的例子是 Crypto++。我有一个补丁,GNUMakefile添加了以下内容:

IS_DEBIAN = $(shell uname -a 2>&1 | $(EGREP) -i -c "debian|ubuntu|mint")
...

# https://wiki.debian.org/DebugPackage
ifeq ($(IS_DEBIAN),1)
  DEBUG_SYM_DIR ?= /usr/lib/debug/cryptopp
  DEBUG_SRC_DIR ?= /usr/src/debug/cryptopp
endif
...

然后有一个符号配方,如下所示:

symbol symbols:
    $(MKDIR) -p $(DEBUG_SYM_DIR) $(DEBUG_SRC_DIR)
    -objcopy --only-keep-debug cryptest.exe cryptest.exe.debug
    -objcopy --only-keep-debug libcryptopp.so libcryptopp.so.debug
    -strip --strip-debug --strip-unneeded cryptest.exe
    -strip --strip-debug --strip-unneeded libcryptopp.so
    -$(CP) cryptest.exe.debug $(DEBUG_SYM_DIR)/
    -$(CP) libcryptopp.so.debug $(DEBUG_SYM_DIR)/
    -objcopy --add-gnu-debuglink=$(DEBUG_SYM_DIR)/cryptest.exe.debug cryptest.exe
    -objcopy --add-gnu-debuglink=$(DEBUG_SYM_DIR)/libcryptopp.so.debug libcryptopp.so
    -$(CP) *.h *.cpp $(DEBUG_SRC_DIR)/

所以工作流程是:

cd cryptopp
make static dynamic test
sudo make symbols
sudo make install

相关,但不相关(以防有人想发表评论):我无法将符号添加为另一个食谱的依赖项,或者只是make symbols因为其中的错误objcopy(我相信它是一个错误 - 请参阅Binutil Bug 18064 - objcopy、add-gnu-debuglink 和“无法填充调试链接部分”)。

答案1

Debian 二进制包不包含源代码,除非在少数情况下源代码可用于构建其他包(例如 liblzo2-devfor minilzo.c、 或binutils-sourcegcc-4.9-source用于构建工具链),或者许多用户希望能够轻松安装源代码(例如内核源代码)。源代码以源代码包形式提供,该源代码由dpkg-buildpackage.

安装 Debian 软件包源代码的方法是使用apt-get source;在你的情况下

apt-get source cryptopp

用户可以在任何有写入权限的地方执行此操作,这意味着没有规范的源位置。此外,由于包可以在任何地方构建,所以存储的源位置也可能会改变...(Debian 中有一个有趣的功能可以提供帮助:/usr/src属于组并且是组可写的,因此组src中的任何用户src可以使用该目录,而无需将root提供源代码的二进制包安装在 中/usr/src。)

因此,要在 Debian 中使用带有相应源代码的调试包,您需要安装调试包,获取如上匹配的源代码,并告诉gdb如何使用directoryset substitute-path语句进行匹配(请参阅gdb文档了解详情)。

在打包方面,源包会自行处理,如果您使用debhelper,调试包也会自行处理(自版本 9.20151219 起)。

相关内容