如何在c++中使用JNI将异常堆栈跟踪重定向到日志文件

How can I redirect the exception stacktrace to log file using JNI in c++?

本文关键字:跟踪 堆栈 异常 重定向 文件 日志 JNI c++      更新时间:2023-10-16

我正在使用JNI从c++代码中调用java方法。JNI提供了一个名为ExceptionDescribe()的API,它基本上在stderr上打印堆栈跟踪。示例代码片段:-

JNIEnv** ppObjJNIEnv;
.....
.....
// some java method call using CallObjectMethod() or CallVoidMethod API
if (JNI_TRUE == (*ppObjJNIEnv)->ExceptionCheck()) {
    (*ppObjJNIEnv)->ExceptionDescribe();
    return -1;
}

但我想在一些日志文件或(比如)syslog中记录异常。

有办法做到这一点吗?

我还没有尝试过,但我认为您需要使用JNI或Java将System.stderr重定向到另一个流(即您的情况下的日志文件)。

理论上,你应该能够从JNI以这样的方式做到这一点:

  • 保存对当前System.stderr的引用
  • 创建一个新的流(您可能需要缓存它,如果您缓存它,则使用全局引用来避免GC)。如果它被缓存并且已经打开,那么当然只需要使用它
  • 将System.stderr设置为该新流,它只是System中的一个静态字段
  • 拨打电话以获取异常详细信息
  • 将System.err还原为其保存的值
  • 冲洗并(可选)关闭流(如果您不保持流打开)

正如我所说,我自己还没有尝试过,但如果我想这样做,我会自己尝试。