我有一个共享库(hlapi.so)在Linux系统上运行。这hlapi.so有很多模块(我的意思是.c文件)。其中一个被命名为hlapi.c定义这样的两个全球DATAS:GDB能否从xx.so解析全局数据而不执行?
static int hlapiInitialized = FALSE;
static struct hlapi_data app_sp;
当然也有这个hlapi.c模块在其他许多代码。 hlapi.so发布给基于我们的hlapi.so构建自己的应用程序(名为appbasehlapi)的客户。
现在我得到了一个核心转储,其客户解析的回溯显示核心位于我们的代码中。但客户只能向我们提供核心转储文件。 appbasehlapi可执行文件不会与我们共享。所以在我的手中,我只有核心转储文件+ hlapi.so。
为了调试这个核心,由我指挥
gdb --core=mycoredumpfile
装入核心转储文件,然后在gdb,我用
set solib-search-path .
指定包含hlapi.so这样的文件夹gdb可以从hlapi.so加载符号。然后我使用:
print hlapiInitialized
print app_sp
解析模块中的全局数据。但是输出值非常不正常。
我在这里的问题是,如果我可以解析全局数据通过gdb中定义的hlapi.so没有可执行文件?如果我通过gdb获得的输出是可信的? 我很欣赏任何评论。
顺便说一句,hlapi.so是用gcc选项“-g -fPIC”构建的。
是否知道核心转储是否由您正在用于调试的库的_exact_相同版本生成? – duskwuff
@duskwuff,是的。它与我们发布给客户的hlapi.so版本相同。 –