如何在c++中使用JNI将异常堆栈跟踪重定向到日志文件
How can I redirect the exception stacktrace to log file using JNI in c++?
我正在使用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还原为其保存的值
- 冲洗并(可选)关闭流(如果您不保持流打开)
正如我所说,我自己还没有尝试过,但如果我想这样做,我会自己尝试。
相关文章:
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- 提升堆栈跟踪不显示函数名称和行号
- cygwin_exception::open_stackdumpfile:将堆栈跟踪转储到 class4.exe.sta
- 如何按指针查看堆栈跟踪
- WinDbg 不显示某些小型转储文件的完整堆栈跟踪
- 发布代码的 gdb 堆栈跟踪可读性如何影响 x64?
- 提升::堆栈跟踪::safe_dump_to输出大小
- Qt 5.9中的QML崩溃-帮助读取堆栈跟踪
- 如何获取崩溃的DLL的堆栈跟踪?
- 当外部源代码中发生异常时,无法正确使用自创建的小型转储文件的堆栈跟踪
- 在 Linux 平台上以 C/C++ 打印进程的所有线程堆栈跟踪
- Boost 堆栈跟踪异步信号安全吗?
- 使用 gdb 时无法获取堆栈跟踪
- VC++ 堆栈跟踪不会解析生产环境中的函数名称
- 从堆栈跟踪中查找共享库中的源代码行
- 跟踪(堆栈分配)对象
- 捕获异常后的堆栈跟踪
- 是否有一种便携式/标准的方法可以在堆栈跟踪中获取文件名和亚麻布
- 为什么谷歌测试不打印堆栈跟踪或文件名
- 在明夫中打印堆栈跟踪