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 到它们在共享中的定义图书馆。

动态加载器中的代码缺少调试信息(无论如何也不是您要单步执行的代码)。

解决此问题的几种方法:

  1. 不要使用stepi,使用step(这将在被调用的函数内停止)。
  2. 在您遇到此功能时第一次使用步骤。第一次之后,函数就已经解决了,可以用stepi.
  3. 在环境中设置LD_BIND_NOW=1。这将导致动态加载程序在启动时解析所有符号,因此当您执行 stepis 时,符号已经被解析。
  4. 在没有共享库的情况下构建您的可执行文件(以便所有内容都链接到主二进制文件中)——这样加载程序就没有什么要解析的了。

更新:

我只回答了问题的"why is stepi weird"部分,但你的主要问题是"why aren't breakpoints getting set"。

答案是:您的 libgvc.so.6 构建(您尝试设置断点的地方)缺少调试信息。

有两种可能:

  1. 您正在调试 系统/usr/lib/ 中提供的版本,而不是您构建的版本,或者
  2. 当您执行 make install 时,库将被剥离。

要修复 #1,请使用 LD_LIBRARY_PATH 指向您自己的版本。 要修复 #2,请使用 LD_LIBRARY_PATH 的 "as built" 版本(即与上面相同),或将 Makefile 更改为不剥离。 运行

make install STRIP=/bin/true

也可以。