gdb没有名为input.c的源文件

时间:2018-01-24 12:32:32

标签: gdb shared-libraries graphviz

我尝试在使用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.

1 个答案:

答案 0 :(得分:4)

  

当我尝试继续我的方式时,我得到了这个:

问题是你正在进入动态加载器中的代码 - 负责将导入的符号解析的代码,例如gvNextInputGraph@plt到共享库中的定义。

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

有几种解决方法:

  1. 请勿使用stepi,请使用step(这将在被调用函数内停止)。
  2. 使用步骤第一次时间遇到此功能。在第一次之后,该功能将被解决,您可以使用stepi
  3. 在环境中设置LD_BIND_NOW=1。这将导致动态加载程序在启动时解析所有符号,因此当您执行stepi时,该符号将已解析。
  4. 构建没有共享库的可执行文件(以便所有内容都链接到主二进制文件中) - 加载器将无需解决任何问题。
  5. <强>更新

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

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

    有两种可能的可能性:

    1. 您正在/usr/lib/调试系统提供的版本,而不是您构建的版本,或
    2. 执行make install时,会删除库。
    3. 要修复#1,请使用LD_LIBRARY_PATH指向您自己的版本。 要修复#2,请使用{as {内置版)使用LD_LIBRARY_PATH(即与上面相同),或将Makefile更改为不剥离。运行

      make install STRIP=/bin/true
      

      也可以。