【问题标题】:gdb full file not being loadedgdb 完整文件未加载
【发布时间】:2019-10-14 10:35:47
【问题描述】:

我使用 Visual Studio 2013 编译和调试 C 程序。然后在 gcc 中编译相同的程序并尝试调试,但由于某种原因,我无法 跳转 到特定行。我得到的消息是当前文件中没有行 line_number

这是 C 代码

#include<stdio.h>

int main() {
    while (1) { 
    }
    printf("Hello World!");
    printf("Bye World!");
    return 0;
}

现在对于 VS 2013 中的上述代码,我可以移动黄色箭头并使其指向打印功能,但在 GDB 的情况下,我无法使用 jump 移动到打印功能。

我使用 gcc -g file.c -o file 来编译我的 C 文件。我的猜测是因为它是一个无限循环,一些优化只显示指令直到循环。

编辑:

我使用的 GDB 命令是

1) gdb 2) 文件 exec_name 3) 断行号 4) 运行 5) 跳转行号

如果我将循环修改为

int x = 1;
while (x) {
}

跳跃效果很好

【问题讨论】:

  • 你到底是怎么做到的?
  • GCC 可以优化这些行。
  • @Shawn 我没听懂你?你是在问我如何使用 gdb
  • @ks1322 有什么办法不这样做吗?如果我将循环更改为 int x = 1; while (x) {} 我可以跳转到打印功能
  • @AAB 为什么你需要这样编程?为什么不以更“常见”的方式以适合您需求的方式构建源代码呢?你的目标到底是什么?

标签: c visual-studio gcc gdb


【解决方案1】:

在 GDB 的情况下,我无法使用跳转来移动到打印功能

这是因为即使使用-O0 禁用优化,GCC 也不会发出无法访问的代码。在 Godbolt 上查看:https://godbolt.org/z/lpXNmn。您可以在 Visual Studio 中跳转,因为代码已发出:https://godbolt.org/z/7452oP。似乎没有办法强制 GCC 也发出这种无法访问的代码。实际上,对于这个人为的例子来说,发出它是没有意义的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-23
    • 2012-08-04
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多