我尝试在使用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.
答案 0 :(得分:4)
当我尝试继续我的方式时,我得到了这个:
问题是你正在进入动态加载器中的代码 - 负责将导入的符号解析的代码,例如gvNextInputGraph@plt
到共享库中的定义。
动态加载程序中的代码缺少调试信息(并且不是您想要单步执行的代码)。
有几种解决方法:
stepi
,请使用step
(这将在被调用函数内停止)。stepi
。LD_BIND_NOW=1
。这将导致动态加载程序在启动时解析所有符号,因此当您执行stepi
时,该符号将已解析。<强>更新强>
我只回答了“为什么是stepi怪异”问题的一部分,但你的主要问题是“为什么不设置断点”。
答案是:您构建的libgvc.so.6
(您尝试设置断点的地方)缺少调试信息。
有两种可能的可能性:
/usr/lib/
调试系统提供的版本,而不是您构建的版本,或make install
时,会删除库。要修复#1,请使用LD_LIBRARY_PATH
指向您自己的版本。
要修复#2,请使用{as {内置版)使用LD_LIBRARY_PATH
(即与上面相同),或将Makefile
更改为不剥离。运行
make install STRIP=/bin/true
也可以。