gdb 没有名为 input.c 的源文件
gdb No source file named input.c
在使用 configure+make 从源代码构建后,我正在尝试调试 Graphviz 2.34.0。
这是我正在使用的 gdb 脚本:
####################
# Pagination = off #
####################
set pagination off
#######################
# Initial breakpoints #
#######################
dir /home/oren/GIT/klee/benchmarks/graphviz/graphviz-2.34.0/lib/cgraph
dir /home/oren/GIT/klee/benchmarks/graphviz/graphviz-2.34.0/lib/common
start
break input.c:570
break grammar.c:1281
break dot.c:210
run
但由于某些原因,gdb 无法添加 3 个断点中的 2 个。
(起初它看起来像 但我已经添加了开始并且没有改变):
No source file named input.c.
Make breakpoint pending on future shared library load? (y or [n]) [answered N; input not from terminal]
No source file named grammar.c.
Make breakpoint pending on future shared library load? (y or [n]) [answered N; input not from terminal]
当我尝试逐步完成时,我得到了这个:
210 while ((G = gvNextInputGraph(Gvc))) {
(gdb) stepi
0x0000000000400fba 210 while ((G = gvNextInputGraph(Gvc))) {
(gdb) stepi
0x0000000000400be0 in gvNextInputGraph@plt ()
(gdb) stepi
0x0000000000400be6 in gvNextInputGraph@plt ()
(gdb) stepi
0x0000000000400beb in gvNextInputGraph@plt ()
(gdb) stepi
0x0000000000400b80 in ?? ()
(gdb) stepi
0x0000000000400b86 in ?? ()
非常感谢任何帮助,谢谢!
编辑:
我尝试在没有共享库的情况下构建:
../graphviz-2.34.0/configure --disable-shared
并且包构建没有错误,但缺少一些 executables(包括我的)。所以我猜这个选项不在 table (?)
之后我尝试设置变量 LD_BIND_NOW:
LD_BIND_NOW=1 gdb -x ./gdbCommands.txt --args ./build2/cmd/dot/.libs/dot -Tjpeg -oInput.jpeg Input.txt
然后我得到(使用 step 或 stepi):
(gdb) stepi
0x0000000000400fba 210 while ((G = gvNextInputGraph(Gvc))) {
(gdb)
0x0000000000400be0 in gvNextInputGraph@plt ()
(gdb)
0x00007ffff7b7e200 in gvNextInputGraph () from /usr/lib/libgvc.so.6
(gdb)
0x00007ffff7b7e202 in gvNextInputGraph () from /usr/lib/libgvc.so.6
然后我也询问信息sharedlibrary并得到:
(gdb) info sharedlibrary
From To Syms Read Shared Object Library
0x00007ffff7ddab00 0x00007ffff7df5660 Yes /lib64/ld-linux-x86-64.so.2
0x00007ffff7b601a0 0x00007ffff7bb04b8 Yes (*) /usr/lib/libgvc.so.6
0x00007ffff792e310 0x00007ffff7938722 Yes (*) /usr/lib/libcgraph.so.6
(*): Shared library is missing debugging information.
When I try to stepi my way through I get this:
问题是您正在进入动态加载程序内部的代码——负责解析 导入的 符号的代码,例如 gvNextInputGraph@plt
到它们在共享中的定义图书馆。
动态加载器中的代码缺少调试信息(无论如何也不是您要单步执行的代码)。
解决此问题的几种方法:
- 不要使用
stepi
,使用step
(这将在被调用的函数内停止)。
- 在您遇到此功能时第一次使用步骤。第一次之后,函数就已经解决了,可以用
stepi
.
- 在环境中设置
LD_BIND_NOW=1
。这将导致动态加载程序在启动时解析所有符号,因此当您执行 stepi
s 时,符号已经被解析。
- 在没有共享库的情况下构建您的可执行文件(以便所有内容都链接到主二进制文件中)——这样加载程序就没有什么要解析的了。
更新:
我只回答了问题的"why is stepi weird"部分,但你的主要问题是"why aren't breakpoints getting set"。
答案是:您的 libgvc.so.6
构建(您尝试设置断点的地方)缺少调试信息。
有两种可能:
- 您正在调试 系统 在
/usr/lib/
中提供的版本,而不是您构建的版本,或者
- 当您执行
make install
时,库将被剥离。
要修复 #1,请使用 LD_LIBRARY_PATH
指向您自己的版本。
要修复 #2,请使用 LD_LIBRARY_PATH
的 "as built" 版本(即与上面相同),或将 Makefile
更改为不剥离。 运行
make install STRIP=/bin/true
也可以。
在使用 configure+make 从源代码构建后,我正在尝试调试 Graphviz 2.34.0。
这是我正在使用的 gdb 脚本:
####################
# Pagination = off #
####################
set pagination off
#######################
# Initial breakpoints #
#######################
dir /home/oren/GIT/klee/benchmarks/graphviz/graphviz-2.34.0/lib/cgraph
dir /home/oren/GIT/klee/benchmarks/graphviz/graphviz-2.34.0/lib/common
start
break input.c:570
break grammar.c:1281
break dot.c:210
run
但由于某些原因,gdb 无法添加 3 个断点中的 2 个。
(起初它看起来像
No source file named input.c.
Make breakpoint pending on future shared library load? (y or [n]) [answered N; input not from terminal]
No source file named grammar.c.
Make breakpoint pending on future shared library load? (y or [n]) [answered N; input not from terminal]
当我尝试逐步完成时,我得到了这个:
210 while ((G = gvNextInputGraph(Gvc))) {
(gdb) stepi
0x0000000000400fba 210 while ((G = gvNextInputGraph(Gvc))) {
(gdb) stepi
0x0000000000400be0 in gvNextInputGraph@plt ()
(gdb) stepi
0x0000000000400be6 in gvNextInputGraph@plt ()
(gdb) stepi
0x0000000000400beb in gvNextInputGraph@plt ()
(gdb) stepi
0x0000000000400b80 in ?? ()
(gdb) stepi
0x0000000000400b86 in ?? ()
非常感谢任何帮助,谢谢!
编辑:
我尝试在没有共享库的情况下构建:
../graphviz-2.34.0/configure --disable-shared
并且包构建没有错误,但缺少一些 executables(包括我的)。所以我猜这个选项不在 table (?) 之后我尝试设置变量 LD_BIND_NOW:
LD_BIND_NOW=1 gdb -x ./gdbCommands.txt --args ./build2/cmd/dot/.libs/dot -Tjpeg -oInput.jpeg Input.txt
然后我得到(使用 step 或 stepi):
(gdb) stepi
0x0000000000400fba 210 while ((G = gvNextInputGraph(Gvc))) {
(gdb)
0x0000000000400be0 in gvNextInputGraph@plt ()
(gdb)
0x00007ffff7b7e200 in gvNextInputGraph () from /usr/lib/libgvc.so.6
(gdb)
0x00007ffff7b7e202 in gvNextInputGraph () from /usr/lib/libgvc.so.6
然后我也询问信息sharedlibrary并得到:
(gdb) info sharedlibrary
From To Syms Read Shared Object Library
0x00007ffff7ddab00 0x00007ffff7df5660 Yes /lib64/ld-linux-x86-64.so.2
0x00007ffff7b601a0 0x00007ffff7bb04b8 Yes (*) /usr/lib/libgvc.so.6
0x00007ffff792e310 0x00007ffff7938722 Yes (*) /usr/lib/libcgraph.so.6
(*): Shared library is missing debugging information.
When I try to stepi my way through I get this:
问题是您正在进入动态加载程序内部的代码——负责解析 导入的 符号的代码,例如 gvNextInputGraph@plt
到它们在共享中的定义图书馆。
动态加载器中的代码缺少调试信息(无论如何也不是您要单步执行的代码)。
解决此问题的几种方法:
- 不要使用
stepi
,使用step
(这将在被调用的函数内停止)。 - 在您遇到此功能时第一次使用步骤。第一次之后,函数就已经解决了,可以用
stepi
. - 在环境中设置
LD_BIND_NOW=1
。这将导致动态加载程序在启动时解析所有符号,因此当您执行stepi
s 时,符号已经被解析。 - 在没有共享库的情况下构建您的可执行文件(以便所有内容都链接到主二进制文件中)——这样加载程序就没有什么要解析的了。
更新:
我只回答了问题的"why is stepi weird"部分,但你的主要问题是"why aren't breakpoints getting set"。
答案是:您的 libgvc.so.6
构建(您尝试设置断点的地方)缺少调试信息。
有两种可能:
- 您正在调试 系统 在
/usr/lib/
中提供的版本,而不是您构建的版本,或者 - 当您执行
make install
时,库将被剥离。
要修复 #1,请使用 LD_LIBRARY_PATH
指向您自己的版本。
要修复 #2,请使用 LD_LIBRARY_PATH
的 "as built" 版本(即与上面相同),或将 Makefile
更改为不剥离。 运行
make install STRIP=/bin/true
也可以。