如何在特定共享中打印变量?

时间:2019-06-25 20:59:16

标签: gdb

为简化起见,假设我在xxx.c中具有以下内容:

int foo = 0;

void bar() {
   ...
}

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

如果我在'bar'上设置一个断点,则gdb足够聪明,可以设置2个断点,每个共享点一个。因此,令我有些惊讶的是,“ print foo”不会类似地打印两个值,每个可共享的值。

1 个答案:

答案 0 :(得分:0)

  

如何在特定共享中打印变量?

我不认为目前有一种方法可以做到这一点。 This bug是相关的。

注意:如果您有 external 变量(也就是说,您没有使用任何特殊标志,例如-fvisibility-hidden或链接程序脚本将foo标记为隐藏) ,那么对foo all 引用将绑定到首先dlopen创建的那个库,因此只有foo一个实例将被绑定。在bar的任何一个实例中使用(这是UNIX共享库和Windows DLL的工作方式之间的一个主要区别)。

您当然可以通过dlsym(..., "foo")查找其他实例。