c++ - OS X 10.9 : cannot debug c++ dynamic library made with g++

标签 c++ macos gdb shared-libraries

我在这里阅读了多篇有关 os x 上的动态库和使用 gdb 进行调试的文章。但是我还是不明白为什么我不能调试一个简单的测试用例。

主要问题是当我启动 GDB 时它从不加载任何共享库。

更新:我已经在 macports、homebrew 和从源代码构建的 GDB 中尝试过这个,行为是相同的。

我有一个编译到库中的类。

测试.hpp

class Test {
public:
  void set(int i);
  void out() const;
private:
  int i;
};

测试.cpp

#include "Test.hpp"
#include <iostream>

void Test::set(int ii) { i = ii; }

void Test::out() const {
  auto j = i * 100;
  std::cout << i << ", " << j << "\n";
  ++j;
  std::cout << i << ", " << j << "\n";
}

我编译它并用 g++ 创建一个库。 注意:行为与 macports gcc 和 xcode 的 gcc 相同。

/opt/local/bin/g++-mp-4.8 -O0 -g -ggdb -Wall -c -std=c++11 -o Test.o Test.cpp
/opt/local/bin/g++-mp-4.8 -dynamiclib -o libTest.dylib Test.o

然后我用这个简单的 main 测试它

#include "Test.hpp"

int main() {
  Test t;
  auto x = 4;
  t.set(x);
  t.out();
  return 0;
}

这是编译和链接

/opt/local/bin/g++-mp-4.8 -O0 -g -ggdb -Wall -c -std=c++11 -o main.o main.cpp
/opt/local/bin/g++-mp-4.8 -L . -o testing main.o -lTest

一切都按预期编译和运行。但是当我尝试使用 gdb 调试它时(从 macports 安装,或从源代码安装,行为是相同的),我遇到了问题。

当我单步执行 main 时,如果我调用 info sharedlibrary,它总是说“此时没有加载共享库。”,所以它显然从不加载 libTest.dylib .因此,我无法进入任何 Test 成员函数或在 libTest.dylib 中的任何位置创建断点。

最佳答案

事实上,出于某种原因从 macports 安装的 ggdb 不遵守 DYLD_LIBRARY_PATH。但是,如果您使用 .dylib 的正确路径“修补”您的可执行文件,您应该能够使用 ggdb 进行调试。看看this question尤其是 Akos Cz 的回答。

关于c++ - OS X 10.9 : cannot debug c++ dynamic library made with g++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21647461/

相关文章:

c++ - 用C++排序时的 map 会产生巨大的错误

macos - IBOutlet 何时初始化?

gdb - 如何将 gdb 调试一次限制为一个线程

c++ - 如何使用 GDB 捕获除一种异常类型之外的所有异常类型?

当在变量声明上设置断点时,GDB 获取正确的停止点

java - C++ 与 Java 中的多重继承

c++ - opencv和tesseract有冲突吗?

c++ - C++ 中的函数调用栈

ios - 是否可以在不询问用户的情况下注册 CKSubscription 推送通知?

macos - 从 Mac OSX 访问 Centos Apache 服务器(在 Parallels 10 中托管)