|
1
2
3
4
5
6
7
8
9
10
11
12
13
14 |
class MethodTraceAgent { public: void Init(JavaVM *vm) const throw(AgentException); void ParseOptions(const char* str) const throw(AgentException); void AddCapability() const throw(AgentException); void RegisterEvent() const throw(AgentException); ... private: ... static jvmtiEnv * m_jvmti; static char* m_filter; }; |
|
1
2
3
4
5
6
7
8
9
10 |
JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *vm, char *options, void *reserved) { ... MethodTraceAgent* agent = new MethodTraceAgent(); agent->Init(vm); agent->ParseOptions(options); agent->AddCapability(); agent->RegisterEvent(); ... } |
|
1
2 |
cl /EHsc -I${JAVA_HOME}\include\ -I${JAVA_HOME}\include\win32 -LD MethodTraceAgent.cpp Main.cpp -FeAgent.dll |
|
1
2 |
g++ -I${JAVA_HOME}/include/ -I${JAVA_HOME}/include/linux MethodTraceAgent.cpp Main.cpp -fPIC -shared -o libagent.so |
现在,我们运行程序前告诉 Java 先加载编译出来的 Agent:
|
1 |
java -agentlib:Agent=first MethodTraceTest |
可以当程序运行到到 MethodTraceTest 的 first 方法是,Agent 会输出这个事件。“ first ”是 Agent 运行的参数,如果不指定话,所有的进入方法的触发的事件都会被输出,如果读者把这个参数去掉再运行的话,会发现在运行 main 函数前,已经有非常基本的类库函数被调用了。