如何在VS2019的预处理过程中为自定义语言生成C++自定义调试器?

问题描述 投票:0回答:2

我们正在使用自定义语言,例如 FileName.xyz,它在预编译预处理时临时生成 C++ 文件,这些文件又构建为可执行文件(以及用于临时 C++ 文件符号的 PDB)。

我们想使用生成的 exe 和 PDB 调试这个 Filename.xyz。

FileName.xyz和生成的FileName.cpp的区别在于

  1. CPP 文件在开头有附加代码 #include 等,因此 xyz 中的第一个 stmt 可能出现在 cpp 中的第 11 行

  2. 在 FileName.cpp 的第 10 行映射行差异和文件名

    #line 1 FileName.xyz
    用于在第一个语句之前设置 __LINE 和 __FILE。

  3. 还有每个“自定义语言语句”;在 CPP 中用“n-逗号分隔语句”的函数定义内联替换; (与#define 函数在预处理期间被替换的方式相同)。

在 Visual Studio 2019 中:

  1. 如何使用带有 exe 的标准 C++ 调试器和为 C++ 文件生成的 pdb 来调试 FileName.xyz(放置制动点、检查变量值/调用堆栈、F9、F10、F11、Shift+F11)?
  2. 我需要将 .xyz 文件显式映射到调试器,以及将 .xyz 文件映射到 .cpp pdb,但究竟不确定什么以及如何确定?
  3. 我需要自定义调试器吗?如果是,我可以执行最少的步骤,MSDN 说我需要实现 ATL 组件并实现大量接口。

我什至在 MSDN 上问过( https://learn.microsoft.com/en-us/answers/questions/1190586/how-to-debugger-for-custom-language-generating-c-d ) 任何帮助将不胜感激。

c++ debugging visual-studio-2019 transpiler debuggervisualizer
2个回答
0
投票

除非您想直接调试生成的 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,并且几乎可以立即编译(取决于您的语言有多复杂)。


0
投票

要使用相应 C++ 文件生成的 exe 和 PDB 文件在 Visual Studio 中调试自定义语言 FileName.xyz,您需要设置一个自定义调试器,它可以映射 .xyz 和 .cpp 之间的行差异和文件名文件。

一种方法是使用 Microsoft 调试器扩展 SDK 创建自定义调试器扩展。这将需要实现许多接口并使用 Visual Studio 注册调试器扩展。

另一种方法是使用 Visual Studio 中现有的 C++ 调试器并将其配置为在 .xyz 和 .cpp 文件之间映射行号和文件名。这可以通过在 Visual Studio 中创建自定义源文件映射来完成。

以下是设置自定义源文件映射的一般步骤:

  1. 在 Visual Studio 中打开您的解决方案并开始调试您的可执行文件。
  2. 当调试器到达生成的 C++ 代码中的断点时,打开“调用堆栈”窗口以查看调用堆栈。
  3. 在调用堆栈中找到与 FileName.xyz 中的自定义语言代码对应的条目。
  4. 右键单击条目并选择“转到源代码”。
  5. 在“Go To Source”对话框中,点击“New File Mapping”按钮。
  6. 在“新建文件映射”对话框中,在“原始文件”字段中输入FileName.xyz文件的路径,在“映射文件”字段中输入相应生成的C++文件的路径。
  7. 点击“确定”创建文件映射。
  8. 对调用堆栈中对应于自定义语言代码的每个条目重复步骤 4-7。
  9. 创建所有文件映射后,您应该能够使用 Visual Studio 中的 C++ 调试器设置断点、逐步执行代码并检查自定义语言代码中的变量。

请注意,此方法可能需要反复试验才能使文件映射正确,尤其是在 .xyz 和 .cpp 文件中的行号和文件名之间存在显着差异时。但是,一旦正确设置了文件映射,就应该能够使用 Visual Studio 中的标准 C++ 调试器调试自定义语言代码。

© www.soinside.com 2019 - 2024. All rights reserved.