首页 > 解决方案 > crtexe.c - 关于在 VSCode 中调试 C/C++ 文件的问题

问题描述

在此处输入图像描述

在使用 Visual Studio Code 调试 C/C++ 文件时,当从主函数的 '}' 行中按 'step over' 或 'step into' 键时,程序流程进入 crtexe.c。

在此处输入图像描述

但是,当在 crtexe.c 中继续调试时,流程只是停在if (!managedapp)line 上并且不会返回到 main() 函数。

如果我在 main() 的 '}' 行中按 'step out' 键,则会出现错误消息“无法退出。操作失败,错误代码 0x80004004”

我在另一个 IDE(如 CLion 或 NetBeans)中测试了相同的代码,但没有出现这些问题。

我正在使用 MinGW-w64 GCC 和 GDB。我该如何解决这个问题?

示例代码(main.c):

#include <stdio.h>

int main()
{
    printf("Call main()\n");

    int num1 = 1;
    int num2 = 20;
    int num3 = num1 + num2;

    printf("%d\n", num3);

    return 0;
}

启动.json:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "GDB Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "C:/Users/.../main.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "C:/Users/...",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "C:/msys2/mingw64/bin/gdb.exe",
            "sourceFileMap": {
                "/c/": "C:/"
            }
        }
    ]
}

标签: cvisual-studio-code

解决方案


从图像中我看到条件之前的调用:

mainret = main(argc, argv);

您声明了主要功能:

int main();

由于程序已成功链接,因此程序是 C 语言的。main因此堆栈帧在退出后被破坏。在 Windows 上,默认调用约定是被调用函数负责从堆栈中清除函数参数,并且调用者在main. 您应该正确声明 main 函数:

int main(int argc, char** argv);

推荐阅读