Необычное поведение окна просмотра при отладке x86 exe, созданного с помощью clang-cl, через Visual Studio 2019 - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь отладить исполняемый файл x86, созданный с помощью clang-cl, с помощью Visual Studio 2019. Однако, когда я просматриваю код, я получаю действительно необычное поведение с окном просмотра. Переменные, которым я присваиваю значения, не обновляются, когда я выполняю команды присваивания, и вместо этого полностью несвязанные переменные выделяются в окне как измененные. Мне удалось сузить проблему до использования структуры Windows 'LARGE_INTEGER, которая, как мне кажется, использует расширение языка для создания анонимного гибрида объединения / структуры. Мне удалось воссоздать проблему с помощью действительно простого тестового примера:

struct MyStruct
{
    int variable;
};

int main(int argc, char **argv)
{
    // If this line is removed the watch window behaves as normal
    LARGE_INTEGER integer = {};

    MyStruct foo = {};
    foo.variable = 10;

    MyStruct *ptr = &foo
    ptr->varialbe = 100;

    return 0;
}

Я предполагаю, что использование структуры LARGE_INTEGER, которая использует расширение языка, приводит к искажению pdb и означает, что у Visual Studio есть жесткое отслеживание времени, что происходит. И просто чтобы прояснить, я думаю, что ЛЮБАЯ структура, использующая это расширение, вызовет эту проблему, я просто выбираю LARGE_INTEGER, поскольку это оказалась структура, которую я использовал, когда впервые заметил проблему.

Что еще более странно в этом, так это то, что если я использую среду x64 msv c и создаю исполняемый файл с помощью clang-cl, окно просмотра ведет себя так, как ожидалось! И как бы я ни хотел использовать среду x64, мое целевое оборудование не может ее поддерживать. это с clang-cl и знает какие-нибудь обходные пути? Я надеялся, что это ошибка компилятора x86, и что я могу использовать версию x64 для генерации кода x86, но судя по тому, что я копал, я не думаю, что это так.

Любое понимание Приветствуются / указатели / помощь.

PS Вот что вызывает clang-cl, когда я передаю ему аргумент -v:

clang version 11.0.0
Target: i686-pc-windows-msvc
Thread model: posix
InstalledDir: C:\Program Files (x86)\LLVM\bin
 (in-process)
 "C:\\Program Files (x86)\\LLVM\\bin\\clang-cl.exe" -cc1 -triple i686-pc-windows-msvc19.24.28314 -emit-obj -mrelax-all -mincremental-linker-compatible -disable-free -main-file-name main.cpp -mrelocation-model static -mthread-model posix -mframe-pointer=all -relaxed-aliasing -fmath-errno -fno-rounding-math -masm-verbose -mconstructor-aliases -target-cpu pentium4 -mllvm -x86-asm-syntax=intel -D_MT -flto-visibility-public-std --dependent-lib=libcmt --dependent-lib=oldnames -stack-protector 2 -fms-volatile -fdiagnostics-format msvc -gcodeview -debug-info-kind=limited -v -resource-dir "C:\\Program Files (x86)\\LLVM\\lib\\clang\\11.0.0" -internal-isystem "C:\\Program Files (x86)\\LLVM\\lib\\clang\\11.0.0\\include" -internal-isystem "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Professional\\VC\\Tools\\MSVC\\14.24.28314\\include" -internal-isystem "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Professional\\VC\\Tools\\MSVC\\14.24.28314\\atlmfc\\include" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.18362.0\\ucrt" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.18362.0\\shared" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.18362.0\\um" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.18362.0\\winrt" -fdeprecated-macro -fdebug-compilation-dir "W:\\workspace\\Experimental\\clang-test" -ferror-limit 19 -fmessage-length 135 -fno-use-cxa-atexit -fms-extensions -fms-compatibility -fms-compatibility-version=19.24.28314 -std=c++14 -fdelayed-template-parsing -fobjc-runtime=gcc -fdiagnostics-show-option -fcolor-diagnostics -faddrsig -o "C:\\Users\\random\\AppData\\Local\\Temp\\main-2ce7c9.obj" -x c++ main.cpp
clang -cc1 version 11.0.0 based upon LLVM 11.0.0-2663a25f default target i686-pc-windows-msvc
#include "..." search starts here:
#include <...> search starts here:
 C:\Program Files (x86)\LLVM\lib\clang\11.0.0\include
 C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.24.28314\include
 C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.24.28314\atlmfc\include
 C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt
 C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\shared
 C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\um
 C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\winrt
End of search list.
 "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Professional\\VC\\Tools\\MSVC\\14.24.28314\\bin\\Hostx86\\x86\\link.exe" -out:main.exe "-libpath:C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Professional\\VC\\Tools\\MSVC\\14.24.28314\\lib\\x86" "-libpath:C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Professional\\VC\\Tools\\MSVC\\14.24.28314\\atlmfc\\lib\\x86" "-libpath:C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.18362.0\\ucrt\\x86" "-libpath:C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.18362.0\\um\\x86" -nologo -debug "C:\\Users\\random\\AppData\\Local\\Temp\\main-2ce7c9.obj"
...