4

任何 Android JNI 开发人员都应该熟悉 logcat 中的这条精彩消息。我的问题是:如何告诉 VM 转储当前表状态?我需要它来进行调试,以确保退出时的本机线程没有未完成的本地引用。

4

3 回答 3

12

完全归功于 Pavel,但我认为其他人可能会喜欢示例代码:

jclass vm_class = env->FindClass("dalvik/system/VMDebug");
jmethodID dump_mid = env->GetStaticMethodID( vm_class, "dumpReferenceTables", "()V" );
env->CallStaticVoidMethod( vm_class, dump_mid );
于 2014-05-07T23:26:15.173 回答
5

如果有人需要做类似的事情,您可以使用 dalvik.system.VMDebug 中的 dumpReferenceTables

于 2012-11-08T06:35:20.037 回答
3

我尝试下面的代码。它运行良好。

try {
    Class cls = Class.forName("android.os.Debug");
    Method method = cls.getDeclaredMethod("dumpReferenceTables");
    Constructor con= cls.getDeclaredConstructor();
    con.setAccessible(true);
    method.invoke(con.newInstance());
    //call method dumpReferenceTables of dalvik.system.VMDebug
    //to dump reference table at last.
}
catch(Exception e){
    Log.i(TAG,"exception="+e.getMessage());
}

I/art (28913):全局参考表转储:

I/art (28913):最后 10 个条目(共 267 个):

我/艺术(28913):266:0x12e340c0 java.lang.ref.WeakReference

我/艺术(28913):265:0x12e34060 java.lang.ref.WeakReference

我/艺术(28913):264:0x12e24220 java.lang.ref.WeakReference

I/art (28913): 263: 0xa1ba5000 byte[] (2710656 个元素)

I/art (28913): 262: 0xa284d000 byte[] (30276 个元素)

I/art (28913): 261: 0xa2855000 byte[] (19312 个元素)

I/art (28913): 260: 0xa1e3b000 byte[] (6529728 个元素)

我/艺术(28913):259:0x12e1ca60 android.view.accessibility.AccessibilityManager$1

我/艺术(28913):258:0x12df2c70 android.content.ContentProvider$Transport

我/艺术(28913):257:0x12ed4040 java.lang.ref.WeakReference

我/艺术(28913):摘要:

I/art (28913): 2 of android.opengl.EGLContext (2 unique instances)

I/art (28913): 1 of android.hardware.display.DisplayManagerGlobal$DisplayManagerCallback

I/art (28913):java.lang.Class 的 223 个(172 个唯一实例)

I/art (28913): 2 of android.opengl.EGLDisplay (2 个唯一实例)

I/art (28913): java.lang.ThreadGroup 中的 2 个(2 个唯一实例)

I/art (28913): 2 of android.opengl.EGLSurface (2 unique instances)

I/art (28913): dalvik.system.VMRuntime 的 1 个

I/art (28913): 1 of android.content.ContentProvider$Transport

I/art (28913): 1 dalvik.system.PathClassLoader

I/art (28913): 1 of android.view.accessibility.AccessibilityManager$1

I/art (28913): 1 of android.app.ActivityThread$ApplicationThread

I/art (28913): 2 of byte[] (100 个元素) (2 个唯一实例)

I/art (28913): 7 of byte[] (8192 个元素) (7 个唯一实例)

I/art (28913): 1 of byte[] (19312 个元素)

I/art (28913): 1 of byte[] (30276 个元素)

I/art (28913): 1 of byte[] (2710656 个元素)

I/art (28913): 1 of byte[] (6529728 个元素)

I/art (28913):2 个 java.lang.String(2 个唯一实例)

I/art (28913):java.lang.ref.WeakReference 的 15 个(15 个唯一实例)

于 2017-03-27T06:38:04.307 回答