如何调试和单步执行转译为 C++ 的自定义语言源代码?
How to debug and step into custom language sources transpiled to C++?
我想将自定义预处理器语言与 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 ?
调试器是gdb或visual studio,还是编译器clang , gcc, 或 msvc 提供将调试信息映射到原始源文件的机制?
您可以为生成的文件创建一个额外的目录并保留文件的文件名,而不是生成 xxx_gen.cpp
个文件。如果你有一个目录层次结构,你也可以复制整个树。
编译后可以在gdb中set the source path。这将导致找到“原始”文件。
只有当每个源代码行只生成一个目标代码行时,信息才会有效。 :-)
正如问题评论中所暗示的那样,解决此问题的通常方法是 #line
指令。特别是,
# line digit-sequence " s-char-sequenceopt " new-line
您的转译器应将原始文件中每个源代码行的此指令放入生成的文件中:
#line 3 "source.mycpp"
如果您的 C++ 编译器根据这些指令(我使用过的指令)生成调试信息,当您进入代码时,您将进入 source.mycpp 中的适当位置。
我想将自定义预处理器语言与 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 ?
调试器是gdb或visual studio,还是编译器clang , gcc, 或 msvc 提供将调试信息映射到原始源文件的机制?
您可以为生成的文件创建一个额外的目录并保留文件的文件名,而不是生成 xxx_gen.cpp
个文件。如果你有一个目录层次结构,你也可以复制整个树。
编译后可以在gdb中set the source path。这将导致找到“原始”文件。
只有当每个源代码行只生成一个目标代码行时,信息才会有效。 :-)
正如问题评论中所暗示的那样,解决此问题的通常方法是 #line
指令。特别是,
# line digit-sequence " s-char-sequenceopt " new-line
您的转译器应将原始文件中每个源代码行的此指令放入生成的文件中:
#line 3 "source.mycpp"
如果您的 C++ 编译器根据这些指令(我使用过的指令)生成调试信息,当您进入代码时,您将进入 source.mycpp 中的适当位置。