我有一个用几个共享库编译的软件。我的代码正在共享对象内部调用一个函数,并在内部崩溃。我相信我的问题是如何为此函数构造参数。我想通过查看.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用符号编译时。
答案 0 :(得分:0)
我已经检查过,以确保.so上的符号已编译
每个 .so
都带有符号进行编译-如果没有符号,它将毫无用处。
这是您无需编译的调试信息。在编译行中添加-g
标志,并确保链接行上的任何地方都没有-s
或--strip
。
并且我还确保gdb正在加载这些符号。
是的,此输出<function>(int const* , int, int const*)
告诉我们GDB读取了符号,并且它没有不加载调试信息(这是两个完全独立的内容)。