我正在尝试调试一个将动态库作为插件加载的应用程序,并遇到gdb问题以找到源文件并在源级别放置断点。
我构建了一个动态库(libFoo.so
),它是用静态库(libBar.a
)编译的。
在构建libFoo.so之后,它被移动到我的主应用程序的plugins目录中,该目录位于不同的文件夹中。
在运行时,应用程序启动并查找此目录,然后加载libFoo.so。所有代码都使用调试信息构建,并为动态库正确加载调试信息。
让我感到困惑的是,源代码信息没有加载到libFoo的gdb中。这意味着当代码破解为libFoo函数时,我无法看到带有list
的源代码或设置断点
但是,来自libBar的源代码信息(在libFoo.so中静态链接)是完全加载的,当从libBar破解代码并在libBar的代码中放置断点时我可以看到源代码......
更准确地说,这是gdb向我展示共享库的内容:
(gdb) info sharedlibrary Foo
From To Syms Read Shared Object Library
0x... 0x... Yes /path/to/mainapp/plugins/libFoo.so
好的,所以我的lib加载了调试符号。
(gdb) info sources
Source files for which symbols have been read in:
...
/path/to/mainapp/src/main.cpp
/path/to/plugins/libs/bar/bar.cpp
...
因此,gdb正确加载了来自libBar.a
的源代码,即使它与可执行文件位于不同的文件夹中,但不是来自与它一起构建的libFoo?
我还尝试在gdb中添加libFoo
的{{1}}源代码目录,但无济于事。
在哪里可以帮助gdb建立libFoo与其源之间的链接?
我可以显式指定源文件(而不仅仅是dir
的目录)吗?或者我有一些选择吗?