3

这是Clojure 的后续:编译时插入 pre/post 函数

我的目标是调用调试函数而不是抛出异常。我正在寻找存储堆栈帧、函数调用及其参数列表的最佳方法,以完成此任务。

我想要一个函数(my-uber-debug),这样当我调用它(而不是抛出异常)时,会发生以下事情:

  • 弹出一个新的 Java 窗口
  • 有当前clojure栈帧的记录
  • 对于每个堆栈帧,都有传递给函数的参数的记录

这样我就可以向上/向下移动堆栈帧,并检查传递的参数以到达当前点。[如果不知何故,神奇地,我们可以得到在“让”环境中定义的变量,那也太棒了。]

目前的想法

我将有一个线程局部变量uber-debug,其类型为: List of StackFrames where StackFrame = function + arguments

在每次函数调用时,它将推送(将当前函数 + 参数传递给uber-debug),然后在函数调用结束时,它将从uber-debug中删除第一个元素

然后,当我调用 (my-uber-debug) 时,它只是弹出一个新的 java 窗口,让我与uber-debug交互

问题

到目前为止,我的想法可能并不适合设置它。解决这个问题的正确方法是什么?

编辑:

问题不在于 Swing/GUI 部分。它是关于如何存储堆栈帧的。

谢谢!

4

1 回答 1

0

你的答案可能取决于很多因素,所以我将通过给出我的想法来回答这个问题。

如果您只想在发生异常时存储函数调用及其参数,则可以编写宏或函数作为包装器来完成此操作。然后,您必须将所有要调用的函数传递给此包装器。包装器将执行 try catch 操作以及您需要的任何其他操作。

除了编写包装器之外,您可能还想查看Clojure 元数据,因为您正在运行的代码可以查看它的元数据并根据它做出一些决定。我从未使用过元数据,但链接上的信息看起来很有希望。

作为最后的想法,通过编辑原始帖子并将信息放在那里,进一步描述您想要完成的任务可能会有所帮助。

例如,这些堆栈跟踪是针对库还是主程序?

至于存储所有这些信息,是多个线程需要它,还是只需要一个?

您可以通过将信息存储在程序最高级别的 let 绑定中来获得,还是需要类似 ref 的东西?

于 2012-06-09T18:35:33.153 回答