如何调试并进入转换为 C++ 的自定义语言源?

Posted

技术标签:

【中文标题】如何调试并进入转换为 C++ 的自定义语言源?【英文标题】:How to debug and step into custom language sources transpiled to C++? 【发布时间】:2020-09-02 08:53:59 【问题描述】:

我想将自定义预处理器语言与 C++ 一起使用。我的源代码将首先使用我的自定义转译器转译为有效的 C++,然后使用常规 C++ 编译器进行编译。示例:

my_transpiler -o source_gen.cpp source.mycpp
g++ -o myapp source_gen.cpp

在这种情况下,生成的调试信息与 source_gen.cpp 文件相关联。所以我可以调试并进入 source_gen.cpp。但是如果我想进入原始源文件 source.mycpp 怎么办?

调试器是 gdbvisual studio,还是编译器是 clanggcc msvc 提供将调试信息映射到原始源文件的机制?

【问题讨论】:

我认为您正在寻找 #line 预处理器指令:gcc.gnu.org/onlinedocs/cpp/Line-Control.html 这是 Visual Studio 的文档:docs.microsoft.com/en-us/cpp/preprocessor/… 除非您的转译器提供该信息,否则我认为您不能。 我觉得把transpiler转成llvm语言并尝试使用lldb会更好。 【参考方案1】:

正如对该问题的评论中所暗示的,解决此问题的常用方法是 #line 指令。特别是,

# line digit-sequence " s-char-sequenceopt " new-line

你的编译器应该将原始文件中每个源代码行的这个指令放入生成的文件中:

#line 3 "source.mycpp"

如果您的 C++ 编译器根据这些指令(我使用过的指令)生成调试信息,那么当您进入代码时,您将进入 source.mycpp 中的适当位置。

【讨论】:

如果我使用完全不同的语言而不是预处理语言,是否可以使用类似的方法映射符号名称和类型? @Dragnalith -- 是的。我省略地提到的经验是使用 Java 到 C 的翻译器。【参考方案2】:

代替生成xxx_gen.cpp 文件,您可以为生成的文件创建一个附加目录并保留文件的文件名。如果你有一个目录层次结构,你也可以复制整个树。

编译后你可以在 gdb set the source path.这将导致找到“原始”文件。

如果每个源行只会生成一个目标行,则该信息将仅有效。 :-)

【讨论】:

以上是关于如何调试并进入转换为 C++ 的自定义语言源?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 UIView 插座连接到自定义子视图

如何获取自定义单元格并通过 indexpath 使用它的自定义项 - swift3?

简单的自定义调试函数【C语言】

Pytorch拓展进阶:Pytorch结合C++以及Cuda拓展

Drupal 视图模块卡在我的自定义主题上

如何使用 Python 将任何字符串转换为有效的自定义模式?