如何在ubuntu上使用调试库

use*_*720 7 gtk debugging ubuntu webkit

我目前的问题是libwebkitgtk-3.0-0,但我想这个问题很通用.

我的应用程序在webkit代码中崩溃了.我的假设是我们做了一些愚蠢的事情,想要找出什么.最简单的方法是设置断点或使用库的调试版本.

  1. 如何获得构建库的确切源代码?我在转储核心后得到堆栈跟踪,但行号gdb说与我在代码中看到的不匹配.换句话说,如果我安装libwebkitgtk-3.0-0,我想获得它的确切源代码.

  2. 我已经安装了webkit库的调试版本.这些调试版本是否具有与使用--enable-debug标志编译webkit相同的功能?webkit的调试版本基于WEBKIT_DEBUG环境变量启用日志记录,但即使使用库的调试版本,我也无法获得相同的日志记录.

  3. 如何使用我设法编译的调试版本?我设法在我的机器上编译webkit并尝试摆弄负载路径等.无论我做什么,我的应用程序都不会获取新的共享库 - 我可以根据用户代理签名来判断.有一次,我设法拿起了库,但是SSL停止了工作.GtkLauncher确实发生了同样的SSL问题.所以我在某个地方犯了错误.

谢谢你的指点.

Eli*_*gan 24

TL; DR:安装libwebkitgtk-3.0-0-dbg安装libwebkitgtk-3.0-0-dbg http://hostmar.co/software-small,然后你有必要的调试符号.

对于调试符号,通常不必从源代码安装.

如您所知,要获得自己构建的软件的调试符号,可以运行GCC -g.

对于通过操作系统的软件包管理器(此处包括libwebkitgtk-3.0-0)安装的软件,至少对于官方软件包,通常还有提供调试符号的软件包.

实际上,您不需要使用程序或库的调试版本来获取符号堆栈跟踪gdb.gdb还支持提供"附加"调试符号的文件/usr/lib/debug.

根据你问题上的标签,你使用Ubuntu.在Ubuntu上,调试符号包有两种类型:-dbg-dbgsym.位于获取调试符号的程序或库./path/usr/lib/debug/path

-dbg

这些包的名称通常与提供实际可执行文件或库文件的相应包的名称不同.它们通常与-dev包(提供头文件)和-doc包类似地命名.一个-dbg包,有时在名称中比实际库包少库的版本号,有时覆盖多个其他软件包提供的二进制文件.

例如,libgtkmm-3.0-1相应的-dbg包是libgtkmm-3.0-dbg.

另一方面,有时-dbg包名称与其提供符号的包名称相同(-dbg后缀除外).例如,libwebkitgtk-3.0-0相应的-dbg包是libwebkitgtk-3.0-0-dbg. 这就是你想要的那个.

您可以将其安装在软件中心或运行:

sudo apt-get update && sudo apt-get install libwebkitgtk-3.0-0-dbg
Run Code Online (Sandbox Code Playgroud)

现在,当您调试链接到提供的库的程序时libwebkitgtk-3.0-0,gdb将自动从提供的文件中加载符号libwebkitgtk-3.0-0-dbg.

-dbgsym

有时,官方软件包提供的二进制可执行文件没有在任何-dbg软件包中提供的符号.发生这种情况时,通常可以安装-dbgsym软件包.

-dbg包,-dbgsym包不同:

  • 几乎总是简单的(和可预测)命名的X-dbgsym地方X是包提供程序或库本身.
  • 由特殊的软件源(存储库)提供,而不是提供相应的程序/库包和-dbg软件包的软件源.

由于-dbgsym包位于不同的存储库中,因此必须启用这些存储库.他们的DEB线是:

deb http://ddebs.ubuntu.com YOUR_RELEASE main restricted universe multiverse
deb http://ddebs.ubuntu.com YOUR_RELEASE-updates main restricted universe multiverse
deb http://ddebs.ubuntu.com YOUR_RELEASE-security main restricted universe multiverse
deb http://ddebs.ubuntu.com YOUR_RELEASE-proposed main restricted universe multiverse
Run Code Online (Sandbox Code Playgroud)

要启用它们,您可以运行这些命令(改编自DebuggingProgramCrash,"Ubuntu文档维基的贡献者",第2部分):

echo "deb http://ddebs.ubuntu.com $(lsb_release -cs) main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-updates main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-security main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-proposed main restricted universe multiverse
" | sudo tee -a /etc/apt/sources.list.d/ddebs.list
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 428D7C01
sudo apt-get update

如果您正处于开发版本(alpha或beta),请忽略斜体.但是,如果您继续使用稳定版本,请务必添加它们.

这些命令做了三件事:

  1. 创建文件/etc/apt/sources.list.d/ddebs.list(包含DEB行).
  2. 导入这些存储库的签名密钥.
  3. 从哪里更新系统有关可安装的软件包和版本的信息.

因此,如果您希望使用提供的-dbgsym符号而不是-dbg提供的符号,则-dbgsym包为libwebkitgtk-3.0-0(根据上面的简单命名约定)libwebkitgtk-3.0-0-dbgsym.

您可以同时-dbg-dbgsym安装在同一系统上的软件包,但如果他们任何的相同文件提供的符号.所以libwebkitgtk-3.0-0-dbglibwebkitgtk-3.0-0-dbgsym彼此冲突; 它们不能同时安装(同时).

使用符号

在大多数类Unix操作系统上,调试器将自动查找已安装的符号.Ubuntu也不例外 - 在Ubuntu中,gdb自动查找它们/usr/lib/debug.所以你不需要做任何特别的事情.

但是,如果您确实需要告诉gdb加载特定的调试符号文件,则可以使用该标志.有关详细信息,请参阅GNU手册gdb(1).-s file


Spu*_*dun 5

1)当我需要深入研究通过包安装的库时,我要做的第一件事就是从源代码安装它。我的意思是配置/制作/制作安装。我通常将源代码放在 /usr/local/src 中并将其安装在 /usr/local 中。在我看来,这是运行您拥有源代码的确切代码的最可靠方法。

3)

如何使用我编译出来的调试版本?

这听起来就像你做了我上面描述的那样。您需要做的是确保您的软件正在使用托管已编译的、启用调试的库的包含目录和链接目录。意思是确保设置了 -I/usr/local/include 和 -L /usr/local/lib 标志,并且它们位于 /usr/include 和 /usr/lib 之前。

您可以通过从 ubuntu 安装中删除库的二进制版本来更加确定,确保您构建和安装的版本是硬盘上存在的唯一版本。这样您就可以确定您能够配置您的应用程序以使用该库。否则它只会失败,而不是你不断地想知道它是使用新库还是旧库。

2)通常是的。但这取决于库的编写方式以及 ubuntu 打包程序决定做什么。

使用本地构建的库编译程序后,首先查看是否收到相同的错误。如果不是,那么这也是一个数据点。也许自上次 ubuntu 打包该库以来该问题已得到解决。也许该库没有正确打包,这就是问题所在。您甚至可能会遇到新的错误,因为 ubuntu 打包程序以某种方式配置了库,以便它可以工作,而您没有做同样的事情。无论如何,你都会得到有趣的线索。

祝你好运