gdb - 如何打印特定可共享的变量?
问题描述
为了简化事情,假设我在 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”并没有类似地打印两个值,一个用于每个可共享的值。
解决方案
如何打印特定可共享的变量?
我不相信目前有办法做到这一点。这个错误是相关的。
注意:如果您有外部变量(也就是说,您没有使用任何特殊标志,例如-fvisibility-hidden
或链接描述文件来标记foo
隐藏),那么所有对的引用都foo
将绑定到首先编辑的任何库dlopen
,所以只有一个实例foo
will可以从任何一个实例中使用bar
(这是 UNIX 共享库和 Windows DLL 工作方式之间的一个主要区别)。
您当然可以通过dlsym(..., "foo")
.
推荐阅读
- android - 我想在 android 中备份我的应用程序,比如 Whatsapp
- mongodb - MongoDB $exists 计数超过文档计数
- python - 如何在 mac 上使用 pandas 读取 CSV 文件?
- python - 根据数字列表检查字母
- swift - 我无法修复在 swiftUI 中谈论成员的错误
- c# - 调试时可以在 Quick Watch 中调用 C# 的本地函数吗?
- java - 我的博文 URL 中显示的奇怪字符
- internationalization - 谷歌多语言行动失败
- python - 使用 powershell 在 Windows 10 中安装 python VirtualEnv 时遇到问题
- javascript - 如何上传图片并保存ckeditor5