我在这里阅读了多篇有关 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/