首页 > 解决方案 > 如何打印特定可共享的变量?

问题描述

为了简化事情,假设我在 xxx.c 中有以下内容:

int foo = 0;

void bar() {
   ...
}

条件编译里面吧让我用两种方式编译。我使用第一种方式编译,并创建一个共享库,我们称之为lib1.so。然后我使用第二种方式编译,并创建另一个共享库,我们称之为lib2.so。现在我运行我的主程序,并动态加载(dlopen)lib1.so 和 lib2.so。如果我让 gdb “打印 foo”,它会打印出一个值,但它是哪个值?我不能用文件名 ('xxx.c'::foo) 限定 foo,因为两个可共享文件的源名称相同。有没有办法告诉 gdb 专门从 lib1.so 打印 foo,或者从 lib2.so 打印 foo?

如果我在“bar”上设置断点,gdb 足够聪明,可以设置 2 个断点,每个断点一个可共享。所以我有点惊讶“print foo”并没有类似地打印两个值,一个用于每个可共享的值。

标签: gdb

解决方案


如何打印特定可共享的变量?

我不相信目前有办法做到这一点。这个错误是相关的。

注意:如果您有外部变量(也就是说,您没有使用任何特殊标志,例如-fvisibility-hidden或链接描述文件来标记foo隐藏),那么所有对的引用都foo将绑定到首先编辑的任何库dlopen,所以只有一个实例foowill可以从任何一个实例中使用bar(这是 UNIX 共享库和 Windows DLL 工作方式之间的一个主要区别)。

您当然可以通过dlsym(..., "foo").


推荐阅读