【问题标题】:gdb: set breakpoint in specific librarygdb:在特定库中设置断点
【发布时间】:2018-12-15 06:57:53
【问题描述】:

假设我有一个名为 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 只在一个库中设置断点?

【问题讨论】:

    标签: c gdb shared-libraries dlopen


    【解决方案1】:

    为什么不使用“break if”?类似的东西

    break library.c:<line_no> if libname == "./library1.so"
    

    如果libname不起作用,也可以使用第二个参数n。

    【讨论】:

    • 您的意思是与 callFunc 的 libname 参数进行比较吗?我只是提供了一个简单的例子。在实际项目中,它会有更深的调用堆栈。在 someFunc 中也看不到 libname。如果在二进制名称上,我可以以某种方式中断吗?
    【解决方案2】:

    在 gdb 中,我想调试某个库中的函数(例如 library1.so),而不必担心另一个 (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 的全自动方式,但在这种情况下,这可能是您能做的最好的事情。

    【讨论】:

      猜你喜欢
      • 2021-04-01
      • 2020-02-25
      • 1970-01-01
      • 2014-09-22
      • 2016-11-26
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多