【问题标题】:How do I use the MinGW gdb debugger to debug a C++ program in Windows?如何使用 MinGW gdb 调试器在 Windows 中调试 C++ 程序?
【发布时间】:2011-06-07 23:58:18
【问题描述】:

我已经查找了这方面的文档,但一无所获。我安装了 MinGW,效果很好。我只是不知道如何使用调试器。

给定一些简单的代码,比如在一个名为“mycode.cpp”的文件中:

int main()
{
    int temp = 0;

    for (int i = 0; i < 5; ++i)
        temp += i;

    return 0;
}

...我将如何调试它。我在 Windows 中使用 MinGW 和 GDB 调试代码的命令是什么?我可以像在 Visual Studio 中那样通过命令行单步执行代码吗?如果是这样,我使用什么命令来做到这一点?

那里有使用 GDB 的教程吗?我找不到任何东西,但如果有人能指导我找到一个,那也很棒。我已经厌倦了编写大量的 std::cout 语句来调试复杂的代码。

【问题讨论】:

    标签: c++ windows debugging gdb mingw


    【解决方案1】:

    第一步是使用-g 编译您的程序以在可执行文件中包含调试信息:

    g++ -g -o myprog.exe mycode.cpp
    

    然后程序就可以加载到gdb

    gdb myprog.exe
    

    一些命令可以帮助您入门:

    • break main 将导致调试器在调用 main 时中断。您还可以使用break FILENAME:LINENO 中断代码行。例如,每当程序到达mycode.cpp 的第 4 行时,break mycode.cpp:4 就会中断执行。
    • start 启动程序。在您的情况下,您需要在启动程序之前设置断点,因为它会快速退出。

    在断点处:

    • print VARNAME。这就是您打印变量值的方式,无论是局部的、静态的还是全局的。例如,在for 循环中,您可以键入print temp 以打印出temp 变量的值。
    • step这相当于“步入”。
    • nextadv +1 前进到下一行(如“跳过”)。您还可以使用例如adv mycode.cpp:8 前进到特定文件的特定行。
    • bt 打印回溯。这本质上是一个堆栈跟踪。
    • continue 完全像可视化调试器的“继续”操作。它会导致程序继续执行,直到下一个断点或程序退出。

    最好阅读的是GDB users' manual

    【讨论】:

    • 还有一些您应该熟悉的命令:runcontinuenextlisthelp。当一切都失败时,尝试使用help
    • 试过g++ -g helloworld.c,它只生成了一个.exe。是否应该生成更多文件来帮助使用 gdb 进行调试。运行gdb a.exe 给出消息:not in executable format: File format not recognized 并启动(gdb) 命令提示符。运行(gdb) break main 给出No symbol table is loaded. Use the "file" command.。运行(gdb) start 给出相同的No symbol table is loaded. Use the "file" command.。我做错了什么?
    • @Mahesha999 没有生成其他文件;调试信息存储在可执行文件中。您可以尝试直接运行a.exe 吗? “不是可执行格式:文件格式无法识别”意味着a.exe 不是可执行文件。
    • @Mahesha999 启动gdb 时“This GDB was configured as ...”消息中列出了什么目标(如果您没有看到这样的消息,那么show configuration 命令)?也许a.exe 是64 位的,而gdb 配置为32 位,反之亦然?
    • @Mahesha999 感谢您提供这些详细信息。我的猜测是因为你的编译器是 64 位的,所以它会生成 64 位的二进制文件(除非你有一个交叉编译器)。您可以尝试使用-m32 GCC 编译器选项编译您的程序。至于检查一个exe是32位还是64位,这里列出了很多方法:superuser.com/q/358434/40712我个人在Dependency Walker的32位和64位版本中打开二进制文件(@987654324 @ 讨论这种技术)。
    【解决方案2】:

    在这个问题windows version of the GDB frontend DDD中有一些用于windows的gdb guis

    虽然DDD还没有被移植

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-05
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多