C++ 使用dlmopen打开的库的调试策略
我有一个可执行文件,可以加载带有C++ 使用dlmopen打开的库的调试策略,c++,c,gdb,shared-libraries,dbx,C++,C,Gdb,Shared Libraries,Dbx,我有一个可执行文件,可以加载带有dlmopen的共享库 以下是main.cpp: int main(int argc, char* argv[]) { void* h=dlmopen(LM_ID_NEWLM,"libA.so", RTLD_LOCAL | RTLD_NOW); if(h != 0) { void (*pPrint)() = (void (*)())dlsym(h, "printA"); if (pPrint != 0)
dlmopen
的共享库
以下是main.cpp:
int main(int argc, char* argv[]) {
void* h=dlmopen(LM_ID_NEWLM,"libA.so", RTLD_LOCAL | RTLD_NOW);
if(h != 0) {
void (*pPrint)() = (void (*)())dlsym(h, "printA");
if (pPrint != 0)
pPrint();
else
std::cerr << "Did not find function\n";
} else {
std::cerr << "Cannot load shared library\n";
return 100;
}
return 0;
}
我用g++6.3.1编译了这段代码。
如果您尝试使用GDB(我尝试使用8.1.0)或DBX跟踪代码的执行,您将注意到无法深入到printA()
。在网上寻找调试这段代码的方法时,我在这里和那里找到了预期的注释。似乎有些人在不久前(2011年左右)就做了这件事,但我并不清楚他们走了多远
除了打印语句(这在我的实际案例中不是一个真正的选项)之外,还有人看到我可以遵循的调试策略吗?在调试时,使用
dlopen
而不是dlmopen
。(您可以使用命令行参数或环境变量。)@LorinczyZsigmond这将适用于这里的小问题,但不适用于我的实际问题,因为可执行文件和库链接到不同(不兼容)版本的公共共享库gdb中的dlmopen
支持确实从未完成,主要是因为我们当时找不到真正使用dlmopen
的人。我的信念是,它需要一个glibc更改和一些gdb更改才能工作。同时,我认为printf调试是所有可用的。
extern "C" void printA() {
std::cout << "Hello world!\n";
return;
}