You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
2.7 KiB
113 lines
2.7 KiB
# tifast
|
|
|
|
tifast is a JVMTI agent designed for profiling the performance impact listening
|
|
to various JVMTI events. It is called tifast since none of the event handlers do
|
|
anything meaning that it can be considered speed-of-light.
|
|
|
|
# Usage
|
|
### Build
|
|
> `m libtifast`
|
|
|
|
The libraries will be built for 32-bit, 64-bit, host and target. Below examples
|
|
assume you want to use the 64-bit version.
|
|
|
|
Use `libtifasts` if you wish to build a version without non-NDK dynamic dependencies.
|
|
|
|
### Command Line
|
|
|
|
The agent is loaded using -agentpath like normal. It takes arguments in the
|
|
following format:
|
|
> `[log,][EventName1[,EventName2[,...]]]`
|
|
|
|
* If 'log' is the first argument the event handlers will LOG(INFO) when they are
|
|
called. This behavior is static. The no-log methods have no branches and just
|
|
immediately return.
|
|
|
|
* If 'all' is one of the arguments all events the current runtime is capable of
|
|
providing will be listened for and all other arguments (excepting 'log') will
|
|
be ignored.
|
|
|
|
* The event-names are the same names as are used in the jvmtiEventCallbacks
|
|
struct.
|
|
|
|
* All required capabilities are automatically gained. No capabilities other than
|
|
those needed to listen for the events are gained.
|
|
|
|
* Only events which do not require additional function calls to cause delivery
|
|
and are sent more than once are supported.
|
|
|
|
#### Supported events
|
|
|
|
The following events may be listened for with this agent
|
|
|
|
* `SingleStep`
|
|
|
|
* `MethodEntry`
|
|
|
|
* `MethodExit`
|
|
|
|
* `NativeMethodBind`
|
|
|
|
* `Exception`
|
|
|
|
* `ExceptionCatch`
|
|
|
|
* `ThreadStart`
|
|
|
|
* `ThreadEnd`
|
|
|
|
* `ClassLoad`
|
|
|
|
* `ClassPrepare`
|
|
|
|
* `ClassFileLoadHook`
|
|
|
|
* `CompiledMethodLoad`
|
|
|
|
* `CompiledMethodUnload`
|
|
|
|
* `DynamicCodeGenerated`
|
|
|
|
* `DataDumpRequest`
|
|
|
|
* `MonitorContendedEnter`
|
|
|
|
* `MonitorContendedEntered`
|
|
|
|
* `MonitorWait`
|
|
|
|
* `MonitorWaited`
|
|
|
|
* `ResourceExhausted`
|
|
|
|
* `VMObjectAlloc`
|
|
|
|
* `GarbageCollectionStart`
|
|
|
|
* `GarbageCollectionFinish`
|
|
|
|
* `VMStart`
|
|
|
|
* `VMInit`
|
|
|
|
* `VMDeath`
|
|
|
|
All other events cannot be listened for by this agent. Most of these missing
|
|
events either require the use of other functions in order to be called
|
|
(`FramePop`, `ObjectFree`, etc).
|
|
|
|
#### ART
|
|
> `art -Xplugin:$ANDROID_HOST_OUT/lib64/libopenjdkjvmti.so '-agentpath:libtifast.so=MethodEntry' -cp tmp/java/helloworld.dex -Xint helloworld`
|
|
|
|
* `-Xplugin` and `-agentpath` need to be used, otherwise the agent will fail during init.
|
|
* If using `libartd.so`, make sure to use the debug version of jvmti.
|
|
|
|
> `adb shell setenforce 0`
|
|
>
|
|
> `adb push $ANDROID_PRODUCT_OUT/system/lib64/libtifast.so /data/local/tmp/`
|
|
>
|
|
> `adb shell am start-activity --attach-agent /data/local/tmp/libtifast.so=MonitorWait,ClassPrepare some.debuggable.apps/.the.app.MainActivity`
|
|
|
|
#### RI
|
|
> `java '-agentpath:libtifast.so=MethodEntry' -cp tmp/helloworld/classes helloworld`
|