crtexe.c - проблема отладки файлов C / C ++ в VSCode - PullRequest
0 голосов
/ 29 апреля 2018

enter image description here

При отладке файлов C / C ++ с помощью кода Visual Studio поток программы переходит в crtexe.c при нажатии клавиши «step over» или «step into» из строки с «}» главной функции.

enter image description here

Однако, если продолжить отладку в crtexe.c, поток просто останавливается на строке if (!managedapp) и не возвращается к функции main ().

Если я нажму кнопку «выйти» в строке «}» функции main (), появится сообщение об ошибке «Невозможно выйти. Операция завершилась ошибкой с кодом ошибки 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;
}

launch.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:/"
            }
        }
    ]
}

1 Ответ

0 голосов
/ 29 апреля 2018

С картинки вижу звонок до состояния:

mainret = main(argc, argv);

Вы объявили основную функцию:

int main();

Поскольку программа была успешно связана, программа написана на языке Си. Таким образом, кадр стека поврежден после выхода main. В Windows это соглашение о вызовах по умолчанию, согласно которому вызываемая функция отвечает за очистку аргументов функции из стека, а вызывающий получает недопустимый кадр стека (регистр стека) после main. Вы должны правильно объявить основную функцию:

int main(int argc, char** argv);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...