我们正在使用自定义语言,例如 FileName.xyz,它在预编译预处理时临时生成 C++ 文件,这些文件又构建为可执行文件(以及用于临时 C++ 文件符号的 PDB)。
我们想使用生成的 exe 和 PDB 调试这个 Filename.xyz。
FileName.xyz和生成的FileName.cpp的区别在于
CPP 文件在开头有附加代码 #include 等,因此 xyz 中的第一个 stmt 可能出现在 cpp 中的第 11 行
在 FileName.cpp 的第 10 行映射行差异和文件名
#line 1 FileName.xyz
用于在第一个语句之前设置 __LINE 和 __FILE。
还有每个“自定义语言语句”;在 CPP 中用“n-逗号分隔语句”的函数定义内联替换; (与#define 函数在预处理期间被替换的方式相同)。
在 Visual Studio 2019 中:
我什至在 MSDN 上问过( https://learn.microsoft.com/en-us/answers/questions/1190586/how-to-debugger-for-custom-language-generating-c-d ) 任何帮助将不胜感激。
除非您想直接调试生成的 C++,否则您必须构建自己的调试器/翻译器,它位于 C++ 调试器和 api(您的自定义调试器的 api)之间。
我认为有一个用于从 C++ 使用 MSVC 的 API,如果没有,您可以将 LLDB 调试器用作库或只是解析 stdio。您不必使用 MinGw 的 clang,clang-cl 在 Windows 上可以正常工作。假设您正确地添加了#line 并且正确地实现它并不难,我的意思是您的自定义语言源和 c++ 源的映射说 main.awesome::50 -> tmp.cpp::500 #line 50 "main .太棒了.
最后一个选项是让您的自定义语言输出 LLVM IR,这样您就可以直接访问 LLDB,并且几乎可以立即编译(取决于您的语言有多复杂)。
要使用相应 C++ 文件生成的 exe 和 PDB 文件在 Visual Studio 中调试自定义语言 FileName.xyz,您需要设置一个自定义调试器,它可以映射 .xyz 和 .cpp 之间的行差异和文件名文件。
一种方法是使用 Microsoft 调试器扩展 SDK 创建自定义调试器扩展。这将需要实现许多接口并使用 Visual Studio 注册调试器扩展。
另一种方法是使用 Visual Studio 中现有的 C++ 调试器并将其配置为在 .xyz 和 .cpp 文件之间映射行号和文件名。这可以通过在 Visual Studio 中创建自定义源文件映射来完成。
以下是设置自定义源文件映射的一般步骤:
请注意,此方法可能需要反复试验才能使文件映射正确,尤其是在 .xyz 和 .cpp 文件中的行号和文件名之间存在显着差异时。但是,一旦正确设置了文件映射,就应该能够使用 Visual Studio 中的标准 C++ 调试器调试自定义语言代码。