GDB找不到来源

时间:2013-11-20 12:57:03

标签: c debugging gcc gdb

我使用这个启动gdb(工作目录是/ home / leon / Develop / tests / atomic /):

 gdb ./bin/lin64/httpress

然后我添加了包含源文件的目录,它理解我:

Source directories searched: /home/leon/Develop/tests/atomic/third/http_parser:/home/leon/Develop/tests/atomic/src/tools:$cdir:$cwd

当我运行我的二进制文件时,gdb无法识别我的源代码中发生segfault的行。 如何设置gdb的源文件?

该程序由gcc编译:

gcc -D_AMD64_ -D_LIN_ -D_LARGEFILE64_SOURCE -D_GNU_SOURCE -m64 -march=core2 -O2   -Wall -I. -I src/include -I src/lib/zlib/ -I src/lib/otg -I third/openssl/include/ -I src/lib/otg/Tools/HostTime/Interfaces/ -I src/lib/otg/Tools/OpenToolsGate/Guest/Interfaces/ -I src/lib/otg/Tools/OpenToolsGate/Guest/Cross -I src/lib/otg/Tools/OpenToolsGate/Common/Interfaces/ -o bin/lin64/httpress -std=c99  -lpthread -lev -lgnutls -O2 -s -DWITH_SSL -Wno-strict-aliasing \
        -I /usr/include/libev src/tools/httpress.c -I third/http_parser/ third/http_parser/http_parser.c

好的,我做了一些改变:

gcc -g -ggdb -D_AMD64_ -D_LIN_ -D_LARGEFILE64_SOURCE -D_GNU_SOURCE -m64 -march=core2 -Wall -I. -I src/include -I src/lib/zlib/ -I src/lib/otg -I third/openssl/include/ -I src/lib/otg/Tools/HostTime/Interfaces/ -I src/lib/otg/Tools/OpenToolsGate/Guest/Interfaces/ -I src/lib/otg/Tools/OpenToolsGate/Guest/Cross -I src/lib/otg/Tools/OpenToolsGate/Common/Interfaces/ -o bin/lin64/httpress -std=c99  -lpthread -lev -lgnutls -s -DWITH_SSL -Wno-strict-aliasing \
        -I /usr/include/libev src/tools/httpress.c -I third/http_parser/ third/http_parser/http_parser.c

在这种情况下,它仍然无法在二进制文件中找到符号。 但是,如果我从gcc调用中删除-s选项。它写道:

Reading symbols from /home/leon/Develop/tests/atomic/bin/lin64/httpress...done.

但是调试器仍然这样说:

(gdb) info source
No current source file.

...在我用源代码指向他的目录之后。

3 个答案:

答案 0 :(得分:6)

您错过-g电话中的gcc以包含调试信息。

另一方面,我建议将优化级别从-O2降低到-O0并仅使用一次(包括gcc调用有2 -O2)。

除此之外,您可以使用dir命令将目录添加到gdb的源路径:Source_Path。但是,只有在httpress

中提供适当的调试信息时,这才有效

答案 1 :(得分:2)

删除优化标记:

-O2

并添加标志:

-g -ggdb

答案 2 :(得分:2)

  

但是调试器仍然这样说:

     

(gdb)信息来源
  没有当前的源文件   ...在我用源代码指向他的目录之后。

这是预期。由于您尚未开始执行二进制文件,因此没有当前来源。

您想要startrun您的二进制文件并将其带到执行中的某个位置(例如main或崩溃点)。