【问题标题】:gdb doesn't show the source filegdb 不显示源文件
【发布时间】:2014-08-12 13:45:58
【问题描述】:

我有一个奇怪的问题。当我调试我的代码时,我无法查看其中一个共享库中任何函数的源代码。当我在函数上设置断点时,我遇到了断点,但得到以下输出

Breakpoint 1, omx_isend (ep=0xd10120, buffer=0x7fffffffd1d0,
length=70, dest_endpoint=..., match_info=1311768467139281697,
context=0x0, requestp=0x7fffffffd160)
     at <command-line>:1027

1027    <command-line>: No such file or directory

如果我在 gdb 中运行 bt,我会看到以下内容

omx_isend (ep=0xd10120, buffer=0x7fffffffd1d0, length=70, dest_endpoint=..., match_info=1311768467139281697, context=0x0,
requestp=0x7fffffffd160) at <command-line>:1027

我不明白为什么它显示&lt;command-line&gt; 而不是源文件名。 共享库使用-g 构建,并包含调试符号。

【问题讨论】:

  • 看起来目标文件是通过在标准输入上将源代码通过管道传输到 GCC 构建的,因此它不知道文件名。
  • 有没有办法告诉 gdb 在哪里可以找到哪个函数?

标签: gcc gdb


【解决方案1】:

我不明白为什么它显示的不是源文件名&lt;command-line&gt;.

正如 Jonathan Wakely 正确指出的那样,这是因为 gcc 的输入来自管道。比如:

sed -e 's/foo/bar/' foo.c | gcc -g -o bar.o -xc -

有没有办法告诉 gdb 在哪里可以找到哪个函数?

您已经知道这是哪个函数:omx_isend。大概你想告诉 gdb 这个函数来自某个文件,例如foo.c.

我不相信在 GDB 中有办法做到这一点。你最好的选择是调整你的Makefile。而不是上面的sed,这样做:

sed -e 's/foo/bar/' foo.c > foo-subst.c && gcc -g -o bar.o foo-subst.c

然后 GDB 将正常工作 (TM)。

【讨论】:

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