有没有办法以编程方式或通过调试工具来了解 Binder 事务缓冲区中保存的当前事务?
有时,通常在运行数小时/数天后,我的应用程序会崩溃并出现如下错误跟踪:
08-30 09:49:57.459 1879 1904 E JavaBinder: !!! FAILED BINDER TRANSACTION !!!
08-30 09:49:57.469 1879 1904 W BroadcastQueue: Exception when sending broadcast to ComponentInfo{com.mycompany.myapp/com.mycompany.myapp.receiver.UpdateContentReceiver}
08-30 09:49:57.469 1879 1904 W BroadcastQueue: android.os.TransactionTooLargeException
08-30 09:49:57.469 1879 1904 W BroadcastQueue: at android.os.BinderProxy.transact(Native Method)
08-30 09:49:57.469 1879 1904 W BroadcastQueue: at android.app.ApplicationThreadProxy.scheduleReceiver(ApplicationThreadNative.java:771)
08-30 09:49:57.469 1879 1904 W BroadcastQueue: at com.android.server.am.BroadcastQueue.processCurBroadcastLocked(BroadcastQueue.java:231)
08-30 09:49:57.469 1879 1904 W BroadcastQueue: at com.android.server.am.BroadcastQueue.processNextBroadcast(BroadcastQueue.java:778)
08-30 09:49:57.469 1879 1904 W BroadcastQueue: at com.android.server.am.BroadcastQueue$1.handleMessage(BroadcastQueue.java:140)
08-30 09:49:57.469 1879 1904 W BroadcastQueue: at android.os.Handler.dispatchMessage(Handler.java:99)
08-30 09:49:57.469 1879 1904 W BroadcastQueue: at android.os.Looper.loop(Looper.java:137)
08-30 09:49:57.469 1879 1904 W BroadcastQueue: at com.android.server.am.ActivityManagerService$AThread.run(ActivityManagerService.java:1487)
我试图发送的广播没有额外内容,因此它的大小可以忽略不计。根据文档交易太大异常 http://developer.android.com/reference/android/os/TransactionTooLargeException.html:
Binder 事务缓冲区的固定大小有限,目前为 1Mb,由进程中所有正在进行的事务共享。因此,当有许多事务正在进行时,即使大多数单个事务的大小适中,也可能会引发此异常。
我的假设是缓冲区被其他东西(我的应用程序,我正在使用的库之一或系统)填满,当它几乎满时,它会抛出TransactionTooLargeException
。通过检查缓冲区的内容,我可以轻松发现问题。
如幻灯片 67 所示http://www.slideshare.net/jserv/android-ipc-mechanism http://www.slideshare.net/jserv/android-ipc-mechanism,可以通过debugfs找到Binder事务缓冲区的详细信息。安装后
mount -t debugfs none /sys/kernel/debug
活页夹信息可以在/sys/kernel/debug/binder/
,人们可以在其中获取全局信息以及每个进程的信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)