1*795d594fSAndroid Build Coastguard Worker# fieldcount 2*795d594fSAndroid Build Coastguard Worker 3*795d594fSAndroid Build Coastguard Workerfieldcount is a JVMTI agent designed to investigate the types being held by specific fields and 4*795d594fSAndroid Build Coastguard Workerhow large the objects referenced by these fields are. 5*795d594fSAndroid Build Coastguard Worker 6*795d594fSAndroid Build Coastguard WorkerNote that just by using the agent some fields might be written (for example fields related to 7*795d594fSAndroid Build Coastguard Workerkeeping track of jfieldIDs). Users should be aware of this. 8*795d594fSAndroid Build Coastguard Worker 9*795d594fSAndroid Build Coastguard Worker# Usage 10*795d594fSAndroid Build Coastguard Worker### Build 11*795d594fSAndroid Build Coastguard Worker> `m libfieldcount libfieldcounts` 12*795d594fSAndroid Build Coastguard Worker 13*795d594fSAndroid Build Coastguard WorkerThe libraries will be built for 32-bit, 64-bit, host and target. Below examples 14*795d594fSAndroid Build Coastguard Workerassume you want to use the 64-bit version. 15*795d594fSAndroid Build Coastguard Worker 16*795d594fSAndroid Build Coastguard Worker### Command Line 17*795d594fSAndroid Build Coastguard Worker 18*795d594fSAndroid Build Coastguard WorkerThe agent is loaded using -agentpath like normal. It takes arguments in the 19*795d594fSAndroid Build Coastguard Workerfollowing format: 20*795d594fSAndroid Build Coastguard Worker> `Lname/of/class;.nameOfField:Ltype/of/field;[,...]` 21*795d594fSAndroid Build Coastguard Worker 22*795d594fSAndroid Build Coastguard Worker#### ART 23*795d594fSAndroid Build Coastguard Worker```shell 24*795d594fSAndroid Build Coastguard Workerart -Xplugin:$ANDROID_HOST_OUT/lib64/libopenjdkjvmti.so '-agentpath:libfieldcount.so=Ljava/lang/Class;.extData:Ldalvik/system/ClassExt;,Ldalvik/system/ClassExt;.jmethodIDs:Ljava/lang/Object;' -cp tmp/java/helloworld.dex -Xint helloworld 25*795d594fSAndroid Build Coastguard Worker``` 26*795d594fSAndroid Build Coastguard Worker 27*795d594fSAndroid Build Coastguard Worker* `-Xplugin` and `-agentpath` need to be used, otherwise the agent will fail during init. 28*795d594fSAndroid Build Coastguard Worker* If using `libartd.so`, make sure to use the debug version of jvmti. 29*795d594fSAndroid Build Coastguard Worker 30*795d594fSAndroid Build Coastguard Worker```shell 31*795d594fSAndroid Build Coastguard Workeradb shell setenforce 0 32*795d594fSAndroid Build Coastguard Worker 33*795d594fSAndroid Build Coastguard Workeradb push $ANDROID_PRODUCT_OUT/system/lib64/libfieldcounts.so /data/local/tmp/ 34*795d594fSAndroid Build Coastguard Worker 35*795d594fSAndroid Build Coastguard Workeradb shell am start-activity --attach-agent '/data/local/tmp/libfieldcounts.so=Ljava/lang/Class;.extData:Ldalvik/system/ClassExt;,Ldalvik/system/ClassExt;.jmethodIDs:Ljava/lang/Object;' some.debuggable.apps/.the.app.MainActivity 36*795d594fSAndroid Build Coastguard Worker``` 37*795d594fSAndroid Build Coastguard Worker 38*795d594fSAndroid Build Coastguard Worker#### RI 39*795d594fSAndroid Build Coastguard Worker> `java '-agentpath:libfieldcount.so=Lname/of/class;.nameOfField:Ltype/of/field;' -cp tmp/helloworld/classes helloworld` 40*795d594fSAndroid Build Coastguard Worker 41*795d594fSAndroid Build Coastguard Worker### Printing the Results 42*795d594fSAndroid Build Coastguard WorkerAll statistics gathered during the trace are printed automatically when the 43*795d594fSAndroid Build Coastguard Workerprogram normally exits. In the case of Android applications, they are always 44*795d594fSAndroid Build Coastguard Workerkilled, so we need to manually print the results. 45*795d594fSAndroid Build Coastguard Worker 46*795d594fSAndroid Build Coastguard Worker> `kill -SIGQUIT $(pid com.littleinc.orm_benchmark)` 47*795d594fSAndroid Build Coastguard Worker 48*795d594fSAndroid Build Coastguard WorkerWill initiate a dump of the counts (to logcat). 49*795d594fSAndroid Build Coastguard Worker 50*795d594fSAndroid Build Coastguard WorkerThe dump will look something like this. 51*795d594fSAndroid Build Coastguard Worker 52*795d594fSAndroid Build Coastguard Worker``` 53*795d594fSAndroid Build Coastguard Workerdalvikvm64 I 06-27 14:24:59 183155 183155 fieldcount.cc:60] listing field Ljava/lang/Class;.extData:Ldalvik/system/ClassExt; 54*795d594fSAndroid Build Coastguard Workerdalvikvm64 I 06-27 14:24:59 183155 183155 fieldcount.cc:60] listing field Ldalvik/system/ClassExt;.jmethodIDs:Ljava/lang/Object; 55*795d594fSAndroid Build Coastguard WorkerHello, world! 56*795d594fSAndroid Build Coastguard Workerdalvikvm64 I 06-27 14:24:59 183155 183155 fieldcount.cc:97] Dumping counts of fields. 57*795d594fSAndroid Build Coastguard Workerdalvikvm64 I 06-27 14:24:59 183155 183155 fieldcount.cc:98] Field name Type Count Total Size 58*795d594fSAndroid Build Coastguard Workerdalvikvm64 I 06-27 14:24:59 183155 183155 fieldcount.cc:155] Ljava/lang/Class;.extData:Ldalvik/system/ClassExt; <ALL TYPES> 2800 3024 59*795d594fSAndroid Build Coastguard Workerdalvikvm64 I 06-27 14:24:59 183155 183155 fieldcount.cc:161] Ljava/lang/Class;.extData:Ldalvik/system/ClassExt; Ldalvik/system/ClassExt; 64 3024 60*795d594fSAndroid Build Coastguard Workerdalvikvm64 I 06-27 14:24:59 183155 183155 fieldcount.cc:161] Ljava/lang/Class;.extData:Ldalvik/system/ClassExt; <null> 2738 0 61*795d594fSAndroid Build Coastguard Workerdalvikvm64 I 06-27 14:24:59 183155 183155 fieldcount.cc:155] Ldalvik/system/ClassExt;.jmethodIDs:Ljava/lang/Object; <ALL TYPES> 63 10008 62*795d594fSAndroid Build Coastguard Workerdalvikvm64 I 06-27 14:24:59 183155 183155 fieldcount.cc:161] Ldalvik/system/ClassExt;.jmethodIDs:Ljava/lang/Object; <null> 26 0 63*795d594fSAndroid Build Coastguard Workerdalvikvm64 I 06-27 14:24:59 183155 183155 fieldcount.cc:161] Ldalvik/system/ClassExt;.jmethodIDs:Ljava/lang/Object; [J 39 10008 64*795d594fSAndroid Build Coastguard Worker``` 65