GDB共享对象无法在当前上下文中获取符号

时间:2018-12-06 19:09:55

标签: c++ debugging gdb shared-libraries

我有一个用几个共享库编译的软件。我的代码正在共享对象内部调用一个函数,并在内部崩溃。我相信我的问题是如何为此函数构造参数。我想通过查看.so内部发生的事情来验证这一点,以便可以对构造参数的方式进行正确的更改。

我遇到的问题是无法解析共享库中的局部变量。例如gdb将输出:

0x<addr> in <function>(int const* , int, int const*)

基于此,我知道我在.so内部的位置。当我在此处导航并尝试查找将哪些不同的变量设置为gdb时,抱怨如下:

No symbol <var> in current context.

现在我知道我在代码中的位置。另外,我检查了.so是否已打开了符号,并确保gdb正在加载这些符号。

有人可以告诉我为什么gdb无法看到这些局部变量吗?

请注意-我已经有一段时间没有使用过gdb了,而且还没有进行此级别的调试,因此,对不起,这只是我不知道的gdb限制。

GDB版本:7.7.1

编辑评论:

是的.so是用符号编译的。我已经通过以下方式对此进行了验证:

file <.so>

这告诉我它是动态链接的,没有被剥离。

对于命令,我只是尝试打印变量。

总的来说,我不确定为什么gdb无法解析.so的源代码/精确函数,当我显式加载它并确保.so用符号编译时。

1 个答案:

答案 0 :(得分:0)

  

我已经检查过,以确保.so上的符号已编译

每个 .so都带有符号进行编译-如果没有符号,它将毫无用处。

这是您无需编译的调试信息。在编译行中添加-g标志,并确保链接行上的任何地方都没有-s--strip

  

并且我还确保gdb正在加载这些符号。

是的,此输出<function>(int const* , int, int const*)告诉我们GDB读取了符号,并且它没有加载调试信息(这是两个完全独立的内容)。