c - gdb:在特定库中设置断点

标签 c gdb shared-libraries dlopen

假设我有一个名为 library.c 的文件

#include <stdio.h>
void someFunc(int n)
{
    printf("%s: %d\n", LIBNAME, n);
}

我将它编译成两个共享对象文件,使用不同的宏(因此生成的代码不同)。在此示例中,我提供了不同的 LIBNAME:

gcc -DLIBNAME=\"lib1\" -fPIC -shared -g -Og library.c -o library1.so
gcc -DLIBNAME=\"lib2\" -fPIC -shared -g -Og library.c -o library2.so

然后我从可执行文件加载两个库:

#include <dlfcn.h>
#include <stdio.h>

typedef void (*functype)(int);

int callFunc(const char* libname, int n)
{
    void* lib = dlopen(libname, RTLD_NOW|RTLD_LOCAL);
    if (!lib) {
        fprintf(stderr, "%s\n", dlerror());
        return -1;
    }
    functype func = dlsym(lib, "someFunc");
    if (!func) {
        fprintf(stderr, "%s\n", dlerror());
        dlclose(lib);
        return -1;
    }
    func(n);
    dlclose(lib);
    return 0;
}

int main()
{
    int res = callFunc("./library1.so", 42);
    if (res == 0)
        return callFunc("./library2.so", 13);
    else
        return res;
}

在 gdb 中,我想调试某个库(例如 library1.so)中的函数,而不必担心另一个库(library2.so)。我不能通过函数名设置断点,因为它在两个库中是相同的。我也不能用 sourcefile:linenumber 来做,因为两个库的源文件是相同的。如何告诉 gdb 只在一个库中设置断点?

最佳答案

In gdb I want to debug function from a certain library (e.g. library1.so), while not having to worry about another one (library2.so)

您可以在 someFunc 上设置挂起的断点,如果它是从 library2.so 调用的,则手动忽略它。您可以从 info sharedlibrary 输出中知道这一点:如果从 library2.so 调用了 someFunc,则 library2.so 将被加载,您将在 info sharedlibrary 输出中看到它。

(gdb) info sharedlibrary 
From                To                  Syms Read   Shared Object Library
0x00007ffff7dd6f60  0x00007ffff7df5030  Yes (*)     /lib64/ld-linux-x86-64.so.2
0x00007ffff7bd2ee0  0x00007ffff7bd3bbe  Yes (*)     /lib64/libdl.so.2
0x00007ffff7834340  0x00007ffff797b27f  Yes (*)     /lib64/libc.so.6
0x00007ffff7611550  0x00007ffff761162c  Yes         ./library2.so
(*): Shared library is missing debugging information.
(gdb) 

当你看到它加载时,你可以忽略这个断点并继续执行。虽然它不是完全自动化的调试 someFunc 的方法,但这可能是您在这种情况下可以做的最好的事情。

关于c - gdb:在特定库中设置断点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51214248/

相关文章:

c - 从不兼容的指针类型传递参数 3 of “fgets ”

c - 我的 C 程序出现段错误错误

c - GDB断点不停

linux - Mac OS X 共享库跨平台开发

通过链接到其他 .so 和 .a 文件的组合来创建 .so

c - 尺寸过大时 VBO + glBufferData 崩溃

c - 这个结构是一个结构数组吗?

c - 为什么下面的代码不能正确扫描所有输入?

c - 为什么 gdb 不能在没有二进制文件的情况下显示非符号堆栈跟踪?

c++ - 在 MacOS 上构建 conan/cmake 项目时的相对 RPATH