Add some last-ditch debugging to help track down the logcat leak

Change-Id: Ifabb07b0dc8b73cd3e802d984868c84b620ea851
diff --git a/src/com/android/tradefed/device/TestDevice.java b/src/com/android/tradefed/device/TestDevice.java
index 9d374bb..e84d932 100644
--- a/src/com/android/tradefed/device/TestDevice.java
+++ b/src/com/android/tradefed/device/TestDevice.java
@@ -1334,6 +1334,33 @@
                         getSerialNumber()));
             }
         }
+
+        /**
+         * Override finalize to determine when a LogcatReceiver is being destroyed without having
+         * been cleaned up.  This is temporary as we try to hunt down file leaks.
+         */
+        @Override
+        protected void finalize() throws Throwable {
+            super.finalize();
+            String name = String.format("%s[%s]", LOG_TAG, getSerialNumber());
+            Log.d(LOG_TAG, String.format("%s in finalizer", name));
+            if (!mIsCancelled) {
+                Log.e(LOG_TAG, String.format("%s was not cancelled!", name));
+                cancel();
+            }
+            if (mIsCancelled && (mTmpFile != null || mPreviousTmpFile != null)) {
+                Log.e(LOG_TAG, String.format("%s was cancelled, but tmpfile(%s) or " +
+                        "prevtmpfile(%s) wasn't closed!", mTmpFile, mPreviousTmpFile));
+                if (mTmpFile != null) {
+                    mTmpFile.delete();
+                    mTmpFile = null;
+                }
+                if (mPreviousTmpFile != null) {
+                    mPreviousTmpFile.delete();
+                    mPreviousTmpFile = null;
+                }
+            }
+        }
     }
 
     /**