在函数之间的c++代码中插入文本
Insert text into C++ code between functions
我有以下要求:
- 在任何函数的入口和出口处添加文本。
- 不修改源代码,除了从上面插入(所以没有预处理器或任何东西)
void fn(param-list)
{
ENTRY_TEXT (param-list)
//some code
EXIT_TEXT
}
但不仅在这种简单的情况下,它还可以运行预处理指令!
的例子:
void fn(param-list)
#ifdef __WIN__
{
ENTRY_TEXT (param-list)
//some windows code
EXIT_TEXT
}
#else
{
ENTRY_TEXT (param-list)
//some any-os code
if (condition)
{
return; //should become EXIT_TEXT
}
EXIT_TEXT
}
所以我的问题是:有没有合适的方法来做这件事?
我已经尝试了一些编译器使用的解析器的工作,但由于它们都依赖于在解析之前运行预处理器,它们对我来说是无用的。
还有一些不需要预处理器的令牌生成解析器有些无用,因为它们生成令牌的内存映射,然后生成完整的新源代码,而不仅仅是插入文本。
我正在做的一件事是用FLEX(或JFlex)尝试它,如果这是一个有效的选项,我将感谢一些输入。: -)
编辑:稍微澄清一下:目的是允许类似堆栈跟踪的东西。我想跟踪每个函数调用,为了遵循调用层次结构,我需要在函数的入口点和退出点放置一个宏。这将构建一个函数调用跟踪。: -)
EDIT2:编译器特定的选项不太合适,因为我们有许多不同的编译器要使用,并且许多可能不被任何工具很好地支持。
不幸的是,你的想法不仅不切实际(c++解析起来很复杂),而且注定要失败。
您的主要问题是异常将完全绕过您的EXIT_TEXT
宏。
你有几个解决方案。
如前所述,第一种解决方案是使用依赖于平台的方法来计算堆栈跟踪。它可能有些不精确,特别是由于内联:即,小函数在其调用者中被内联,它们不会出现在堆栈跟踪中,因为没有在汇编级别生成函数调用。另一方面,它广泛可用,不需要对代码进行任何操作,也不影响性能。 第二个解决方案是只在入口上引入一些,并使用RAII来完成退出工作。它比您的方案好得多,因为它自动处理多个返回和异常,但它也有同样的问题:如何自动执行插入。为此,您可能需要在AST级别操作,并修改AST以引入您的小gem。您可以使用Clang(查找c++11迁移工具以获得大量重写示例)或gcc(使用插件)来完成。最后,您还有手动注释。虽然它可能看起来功能不足(而且工作量很大),但我要强调的是,不要把日志记录留给一个工具……我认为手动操作有三个优点:可以避免在性能敏感的部分引入这种开销,可以只保留大参数的"摘要",并且可以根据当前函数的有趣内容自定义摘要。
我建议使用LLVM库&Clang to get started.
您还可以利用c++语言来简化您的过程。如果你只是将一个小对象插入到函数作用域入口&相信它会在出口时被摧毁。这将大大简化记录函数的"退出"。
这并不能真正回答您的问题,但是,对于您最初的需要,您可以使用execinfo.h
中的backtrace()函数(如果您正在使用GCC)。
如何在我的gcc c++应用程序崩溃时生成堆栈跟踪
- 我无法在Visual Studio代码中使用CIN输入答案,它说输入您的年龄,但它说只读文本编辑器如何解决这个问题?
- 如何使代码打印文本文件中的第一行?
- 如何从代码本身向 wxwidgets 中的文本控件插入字符?
- 如何从 c++ winrt UWP 应用中的代码将文本添加到富文本块
- 为什么插槽函数即使成功调用也无法插入文本
- 模板代码和文本字符串
- 获取 Poco 返回的错误代码的文本
- fputc在插入文本之前将第一行留空
- 在Embarcadero Tools API中的光标位置插入文本
- 在文件中插入文本只工作一次
- 从 visio 块 digrame 到 c++ 代码或文本说明
- C++ 在追加 Windows API 的特定位置插入文本
- 如何读取具有Unicode代码的文本文件
- 在QTextEdit中,如何检测用户何时只将光标插入文本区域一次
- 在函数之间的c++代码中插入文本
- Regedit 看不到从我的代码插入的注册表值
- 使用std::ostream在每行之前插入文本
- VC++:在文本框中插入文本,不重复
- 插入文本
- 如何从本机代码设置文本框控件中的文本