【问题标题】:Logging function calls to a file and using this log file as program code记录对文件的函数调用并将此日志文件用作程序代码
【发布时间】:2010-01-15 15:19:31
【问题描述】:

我有一个用 C 编写的应用程序,并通过将函数调用写入文件来记录它们。 现在我需要在另一个 C 应用程序中重用这些记录的函数调用(这也是记录的原因)。

这个应用程序应该做 - 在其他事情旁边 - 正是记录的事情。

示例: 第一个应用程序编写的MYLOGFILE

printf("Starting main process w/ pid %d\n", (int)getpid());
    Display *dsp = XOpenDisplay( NULL );

然后第二个应用程序将执行记录并从文件中获取的函数调用。

任何想法如何实现这一点?

【问题讨论】:

  • .... 在日志文件中编写 Python 代码:运行起来很容易,不是吗?你为什么要这样做呢??
  • 你需要一个解释器而不是一个“日志阅读器”。
  • 我可能必须创建自己的解释器,方法是创建从每个可能的函数调用条目(application1 - 已记录 - 只能包含大约 200 个不同的条目)到适当函数的映射。我必须检查点并重新启动图形 (X11) 应用程序,因此我需要恢复与 XServer 的连接并重新构建以前的应用程序。

标签: c logging function call


【解决方案1】:

本质上,您想生成 C 代码并执行该代码,对吗?如果是这种情况,您可以查看TCC,它作为一个库提供并提供了这个功能。

当然,假设您的平台是受支持的平台之一。

也就是说,我宁愿避免发出 C 代码并让另一个应用程序读取、编译和执行它。我建议您选择以下方法之一:

  1. 发明您自己的语言并将其发布到您的日志文件中。然后为该语言编写一个解释器,让其他程序读取并解释日志文件。

  2. 在您的第二个程序中嵌入脚本语言(即Lua)并以该语言发出您的日志文件。

哪种解决方案最有效取决于您必须在日志文件中描述的任务的复杂性。

作为最后一个解决方案,假设您想要发出 C,您可以考虑使用 system() 来调用您的编译器而不是编译后的程序。但我真的不鼓励你这样做!

【讨论】:

    【解决方案2】:

    听起来您正在构建某种复制机制。节点 A 执行动作 1 到 N,然后您想在节点 B 上复制这些相同的动作。

    这里有很多选择,但都分为两类:

    选项 1:以现有实用程序可以使用的格式写入日志文件。如果您使用的是 JavaScript 或其他具有“eval”功能的语言,那么这将非常容易。您只需将 JavaScript 写入节点 A 上的日志文件,然后从节点 B “评估”它。

    您提供的示例日志反映了这种方法,尽管它对您来说会稍微复杂一些,因为 C 没有“eval”函数。基本上,您必须将日志文件从节点 A 传送到 B,对其进行编译并将其与实现 C 日志使用的功能的库或其他 C 模块链接,然后运行生成的程序。您可以通过将日志文件包含在这样的模板中来将其转换为完整的 C 源文件:

    int main(int argc, char *argv[]) {
        // Do your setup stuff here.
    #include "/path/to/the/log/file"
        // Clean up.
        return 0
    }
    

    选项 2. 创建一个解析器,在其他程序的上下文中解析和执行日志。

    在这种情况下,由于您的日志语句看起来像 C,因此您实际上是在编写一个 C 解释器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 2017-01-02
      相关资源
      最近更新 更多