我正在编写一个简短的分析器(用 C 语言),它旨在定期打印出各种 Java 客户端中线程的堆栈跟踪。我必须使用未记录的函数AsyncGetCallTrace
而不是GetStackTrace
最小化入侵并允许堆栈跟踪而不管线程状态如何。该函数的源代码可以在这里找到:http: //download.java.net/openjdk/jdk6/promoted/b20/openjdk-6-src-b20-21_jun_2010.tar.gz
in hotspot/src/share/vm/prims/forte.cpp
。我发现了一些记录 JVMTI、信号处理和计时的手册页,以及一个详细介绍如何设置AsyncGetCallTrace
调用的博客:http: //jeremymanson.blogspot.com/2007/05/profiling-with-jvmtijvmpi-sigprof -and.html
该博客缺少的是在信号处理程序中实际调用函数的代码(作者假设读者可以自己完成此操作)。我正在寻求帮助来做到这一点。我不确定如何以及在哪里创建struct ASGCT_CallTrace
(和内部struct ASGCT_CallFrame
),如上述文件中定义的那样forte.cpp
。struct ASGCT_CallTrace
是传递给 的参数之一,AsyncGetCallTrace
因此我确实需要创建它,但我不知道如何为其字段获取正确的值:JNIEnv *env_id
、jint num_frames
和JVMPI_CallFrame *frames
。此外,我不知道传递给的第三个参数AsyncGetCallTrace (void* ucontext)
应该是什么?
上述问题是我遇到的主要问题。但是,我面临的其他问题包括:
SIGPROF
计时器似乎并没有以指定的时间间隔准确地引发,而是不那么频繁。也就是说,如果我将计时器设置为每秒发送SIGPROF
一次(1 秒,0 微秒),那么在 5 秒的运行中,我得到的处理程序输出少于 5 个SIGPROF
(通常为 1-3 个)SIGPROF
Thread.sleep
在 Java 代码中,处理程序输出根本不会出现。因此,如果SIGPROF
要每秒发送 a ,并且我有Thread.sleep(5000);
,则在执行该代码期间将不会获得任何处理程序输出。
任何帮助,将不胜感激。其他详细信息(以及部分代码和示例输出)将根据要求发布。