Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用dlmopen打开的库的调试策略_C++_C_Gdb_Shared Libraries_Dbx - Fatal编程技术网

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;
}