如何在Ubuntu上使用debugging库

我目前的问题是libwebkitgtk-3.0-0,但我想这个问题是足够通用的。

我的应用程序崩溃在webkit代码中的某个地方。 我的假设是我们正在做一些愚蠢的事情,想知道是什么。 最简单的事情是设置断点或使用库的debugging版本。

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

  2. 我已经安装了webkit库的debugging版本。 这些debugging版本是否具有相同的function,就像使用–enable-debug标志编译webkit一样? Webkit的debugging版本启用基于WEBKIT_DEBUG环境variables的日志logging,但即使使用库的debugging版本,我也无法获得相同的日志logging。

  3. 如何使用我设法编译的debugging版本? 我设法在我的机器上编译webkit,并试着加载path等。 我的应用程序不会拾取新的共享库,无论我做什么 – 我可以告诉基于用户代理签名。 有一次,我设法拿起图书馆,但后来SSL停止工作。 GtkLauncher也会出现同样的SSL问题。 所以我在某个地方犯错了。

感谢指针。

1)当我需要挖掘一个通过包安装的库时,我所做的第一件事就是从源代码安装它。 我的意思是config / make / make install。 我通常将源代码放在/ usr / local / src中,并将其安装在/ usr / local中。 这在我看来是运行你有源代码的确切代码的最可靠的方法。

3)

如何使用我设法编译的调试版本?

这听起来像你做了我上面所描述的。 你需要做的是确保你的软件使用包含你的编译,启用调试的库的包含和链接目录。 确保-I / usr / local / include和-L / usr / local / lib标志被设置,并且在/ usr / include和/ usr / lib之前。

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

2)通常是的。 但是这取决于如何编写这个库,以及ubuntu打包者决定做什么。

一旦你使用本地构建的库来编译程序,看看你是否首先得到相同的确切的错误。 如果不是,那么这也是一个数据点。 也许这个问题从上次Ubuntu打包库的时候就已经修复了。 也许图书馆没有妥善包装,这就是问题所在。 你甚至可能会得到新的错误,因为Ubuntu的包装者以某种方式配置了库,这样它就可以工作,而你也没有做同样的事情。 无论如何,你会得到有趣的线索。

祝你好运

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

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

如您所知,要获得您正在构建的软件的调试符号,可以使用-g运行GCC。

对于通过操作系统的软件包管理器(这里包括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 

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

-dbgsym

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

-dbg软件包不同, -dbgsym软件包:

  • 几乎总是简单(可预测地)命名为X -dbgsym ,其中X是提供程序或库本身的包。
  • 由特殊的软件源(库)提供,与提供相应的程序/库软件包和-dbg软件包的软件源-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 

要启用它们,您可以运行这些命令(由DebuggingProgramCrash “Ubuntu文档wiki的贡献者” , 第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. 从哪里更新系统有关哪些软件包和版本可用于安装的信息。

因此,如果您想要使用-dbg提供的符号而不是-dbg提供的符号,则libwebkitgtk-3.0-0-dbgsym软件包(符合上述简单命名约定) libwebkitgtk-3.0-0-dbgsym

您可以在同一个系统上安装-dbg-dbgsym包, 但是如果它们为相同的文件提供符号,则不会 。 所以libwebkitgtk-3.0-0-dbglibwebkitgtk-3.0-0-dbgsym相互冲突; 他们不能同时安装(同时)。

使用符号

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

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

@埃利亚的回答告诉我们如何以方便的方式获取符号。

问题依然存在, “我如何得到确切的源代码?”

我通常做apt-get source <pkgname>这是好的,除了那么我必须手动告诉gdb dir <path-to-wherever-I-put-the-source> where dir <path-to-wherever-I-put-the-source> ,如果它是一个eglibc这样的软件包,必须弄清楚路径引用来自nss子目录,而不是根目录。

在RHEL上,一个简单yum install --enable-repo rhel-debuginfo libX11-debuginfo就是yum install --enable-repo rhel-debuginfo libX11-debuginfo (只要yum install libX11-debuginfo在CentOS 7上yum install libX11-debuginfo ),立刻就能在gdb中获得完整的符号和源代码,而且不会有任何额外的麻烦。 我仍然在Ubuntu上寻找这种便利。