我正在构建一个 cli 工具,应用程序可以通过生成线程来执行多个任务。这些线程之一将处理应用程序状态的呈现。渲染的工作方式只是一个无限循环,其中使用 ASCII 转义码渲染状态并清除屏幕。
我想添加的是在我的渲染中显示一个“日志”部分,该部分显示由任何其他线程写入的任何标准输出和标准错误(甚至恐慌跟踪)消息,因为目前写入的任何内容都会因为清晰的屏幕而被擦除渲染的逻辑,所以我需要将线程的任何输出重定向到应用程序状态中的专用字段。
我知道我可以创建一个自定义 buf 编写器并将其传递给每个线程,它可以将所有日志写入其中而不是 std 流,但我不知道这将如何捕获恐慌和堆栈跟踪。
这通常是不可能的。
libtest
可以做到这一点,但它是使用内部永久不稳定的机制来实现的,该机制可以转发 println!()
等(不过,它不会捕获 FFI 代码的输出)。
正如您已经注意到的,最简单的方法是将流传递给线程。捕获恐慌信息可以通过更改panic hook来完成。