【问题标题】:gdb No source file named input.cgdb 没有名为 input.c 的源文件
【发布时间】:2018-01-24 12:32:32
【问题描述】:

在使用 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 个。 (起初它看起来像this post,但我添加了开头并且没有更改):

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

并且包的构建没有错误,但是缺少一些可执行文件(包括我的)。所以我猜这个选项不在桌面上(?) 之后我尝试设置变量 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

然后我也询问了info 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.

【问题讨论】:

  • graphviz 共享库很可能是在没有调试信息的情况下构建的。
  • @ks1322, old CFLAGS=-g -O2 ...所以我用 CFLAGS=-ggdb ../graphviz.2.34.0/configure 重新构建,但结果仍然相同...另外,由于我能够调试三个文件之一(dot.c),它可能是其他一些东西...
  • 在您尝试stepi 之前,您还可以发布info sharedlibrary 的输出吗?操作系统版本、编译器版本、gdb 版本?
  • @ks1322,我添加了信息共享库

标签: gdb shared-libraries graphviz


【解决方案1】:

当我尝试逐步完成时,我得到了这个:

问题在于您正在步入动态加载器中的代码——负责将导入的符号(例如gvNextInputGraph@plt)解析为它们在共享库中的定义的代码。

动态加载器中的代码缺少调试信息(而且不是您想要单步执行的代码)。

解决这个问题的几种方法:

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

更新:

我只回答了问题的“为什么 stepi 很奇怪”部分,但您的主要问题是“为什么不设置断点”。

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

有两种可能:

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

要修复 #1,请使用 LD_LIBRARY_PATH 指向您自己的版本。 要修复 #2,请使用使用 LD_LIBRARY_PATH 的“内置”版本(即与上述相同),或将 Makefile 更改为不剥离。跑步

make install STRIP=/bin/true

也可以工作。

【讨论】:

  • 是的!我确实在调试系统版本!当我为新构建的版本执行“sudo make install”时,我现在可以调试它了!非常感谢!!
猜你喜欢
  • 2011-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
相关资源
最近更新 更多