【问题标题】:GDB doesn't find sourcesGDB 找不到源
【发布时间】:2013-12-04 11:38:18
【问题描述】:

我使用这个启动 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 无法识别我的源代码中发生段错误的行。 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.

...在我给他指出目录之后。

【问题讨论】:

  • 如果你没有运行程序,info source返回No current source file是正常的。你试过info sources吗?

标签: c debugging gcc gdb


【解决方案1】:

您在gcc 调用中错过了包含调试信息的-g。

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

除此之外,您还可以使用dir 命令将目录添加到gdb 的源路径:Source_Path。但这只有在 httpress 中提供适当的调试信息时才有效

【讨论】:

  • gdb 似乎已经看到了调试符号(删除了 -s 选项),但它没有找到源代码。
  • @Leonidas 请检查我对问题更新的评论。试试info sources 而不是info source
【解决方案2】:

但调试器仍然这样说:

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

这是预期的。没有当前源,因为您还没有开始执行您的二进制文件。

您希望 start 或 run 您的二进制文件并将其放到执行中的某个位置(例如 main 或崩溃点)。

【讨论】:

    【解决方案3】:

    移除优化标志:

    -O2
    

    并添加标志:

    -g -ggdb
    

    【讨论】:

      猜你喜欢
      • 2015-09-11
      • 2016-03-27
      • 2020-07-06
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      • 2016-01-03
      • 1970-01-01
      相关资源
      最近更新 更多