为什么 GDB 不能识别我的库的符号?
Why doesn't GDB recognize my library's symbols?
我有一个类似于以下的项目层次结构:
src/
code.c
ext/
lib/
lib.c
lib.a
bin/
bin-code (+x)
obj/
code.o
lib.c
使用 -g2
标志编译成 lib.a
,然后 ar
.
code.c
使用 -g2
标志编译成 bin/obj/code.o
。
lib.a
和 code.o
然后链接成二进制 bin-code
.
我在 bin-code
中遇到一个错误,我正在尝试使用 GDB 为 lib
加载 symbols/source 所以我可以用 TUI 检查它。
我正在为 lib.c
中的函数添加一个断点,它似乎找到了它,因为它回显了一个地址并说它成功设置了断点。
当我 运行 程序遇到断点时,我用 CtrlX / [=44= 打开 TUI ]CtrlA,但它声称找不到源。
有两点值得一提:
- 我使用了
set substitute-path
,因为我的构建系统 (Tup) 使用 FUSE 文件系统来执行 read/write 操作。
- 我已尝试将
directory
个条目添加到搜索路径,但无济于事。
我是不是漏掉了什么?有没有我可以发出 GDB 的命令,以便它重新扫描目录或其他东西?我无法显示库的源代码,即使它显示符号已加载。
很可能是 gdb 无法找到您的静态库的源代码并且无法显示它的源代码。
如果二进制文件在构建后被移动到另一台机器或源被移动到另一个目录,则可能会发生这种情况。在这种情况下你应该适当地 set substitute-path
。您可以看到 gdb 尝试使用 info sources
命令查找静态库 (lib.c
) 源的位置。将此路径与 lib.c
实际所在的路径进行比较,这应该有助于设置正确的 path substitution.
我有一个类似于以下的项目层次结构:
src/
code.c
ext/
lib/
lib.c
lib.a
bin/
bin-code (+x)
obj/
code.o
lib.c
使用-g2
标志编译成lib.a
,然后ar
.code.c
使用-g2
标志编译成bin/obj/code.o
。lib.a
和code.o
然后链接成二进制bin-code
.
我在 bin-code
中遇到一个错误,我正在尝试使用 GDB 为 lib
加载 symbols/source 所以我可以用 TUI 检查它。
我正在为 lib.c
中的函数添加一个断点,它似乎找到了它,因为它回显了一个地址并说它成功设置了断点。
当我 运行 程序遇到断点时,我用 CtrlX / [=44= 打开 TUI ]CtrlA,但它声称找不到源。
有两点值得一提:
- 我使用了
set substitute-path
,因为我的构建系统 (Tup) 使用 FUSE 文件系统来执行 read/write 操作。 - 我已尝试将
directory
个条目添加到搜索路径,但无济于事。
我是不是漏掉了什么?有没有我可以发出 GDB 的命令,以便它重新扫描目录或其他东西?我无法显示库的源代码,即使它显示符号已加载。
很可能是 gdb 无法找到您的静态库的源代码并且无法显示它的源代码。
如果二进制文件在构建后被移动到另一台机器或源被移动到另一个目录,则可能会发生这种情况。在这种情况下你应该适当地 set substitute-path
。您可以看到 gdb 尝试使用 info sources
命令查找静态库 (lib.c
) 源的位置。将此路径与 lib.c
实际所在的路径进行比较,这应该有助于设置正确的 path substitution.