假设我有一个名为 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/