am 009668bf: am 5c9d9949: am 6ee412d5: Also dump system process threads halfway through the watchdog interval
This commit is contained in:
@@ -54,7 +54,8 @@ public class Watchdog extends Thread {
|
|||||||
static final int MONITOR = 2718;
|
static final int MONITOR = 2718;
|
||||||
static final int GLOBAL_PSS = 2719;
|
static final int GLOBAL_PSS = 2719;
|
||||||
|
|
||||||
static final int TIME_TO_WAIT = DB ? 15*1000 : 60*1000;
|
static final int TIME_TO_RESTART = DB ? 15*1000 : 60*1000;
|
||||||
|
static final int TIME_TO_WAIT = TIME_TO_RESTART / 2;
|
||||||
|
|
||||||
static final int MEMCHECK_DEFAULT_INTERVAL = DB ? 30 : 30*60; // 30 minutes
|
static final int MEMCHECK_DEFAULT_INTERVAL = DB ? 30 : 30*60; // 30 minutes
|
||||||
static final int MEMCHECK_DEFAULT_LOG_REALTIME_INTERVAL = DB ? 60 : 2*60*60; // 2 hours
|
static final int MEMCHECK_DEFAULT_LOG_REALTIME_INTERVAL = DB ? 60 : 2*60*60; // 2 hours
|
||||||
@@ -792,6 +793,7 @@ public class Watchdog extends Thread {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
boolean waitedHalf = false;
|
||||||
while (true) {
|
while (true) {
|
||||||
mCompleted = false;
|
mCompleted = false;
|
||||||
mHandler.sendEmptyMessage(MONITOR);
|
mHandler.sendEmptyMessage(MONITOR);
|
||||||
@@ -801,7 +803,7 @@ public class Watchdog extends Thread {
|
|||||||
|
|
||||||
// NOTE: We use uptimeMillis() here because we do not want to increment the time we
|
// NOTE: We use uptimeMillis() here because we do not want to increment the time we
|
||||||
// wait while asleep. If the device is asleep then the thing that we are waiting
|
// wait while asleep. If the device is asleep then the thing that we are waiting
|
||||||
// to timeout on is asleep as well and won't have a chance to run. Causing a false
|
// to timeout on is asleep as well and won't have a chance to run, causing a false
|
||||||
// positive on when to kill things.
|
// positive on when to kill things.
|
||||||
long start = SystemClock.uptimeMillis();
|
long start = SystemClock.uptimeMillis();
|
||||||
while (timeout > 0 && !mForceKillSystem) {
|
while (timeout > 0 && !mForceKillSystem) {
|
||||||
@@ -815,6 +817,17 @@ public class Watchdog extends Thread {
|
|||||||
|
|
||||||
if (mCompleted && !mForceKillSystem) {
|
if (mCompleted && !mForceKillSystem) {
|
||||||
// The monitors have returned.
|
// The monitors have returned.
|
||||||
|
waitedHalf = false;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!waitedHalf) {
|
||||||
|
// We've waited half the deadlock-detection interval. Pull a stack
|
||||||
|
// trace and wait another half.
|
||||||
|
ArrayList pids = new ArrayList();
|
||||||
|
pids.add(Process.myPid());
|
||||||
|
File stack = ActivityManagerService.dumpStackTraces(true, pids);
|
||||||
|
waitedHalf = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -829,7 +842,9 @@ public class Watchdog extends Thread {
|
|||||||
ArrayList pids = new ArrayList();
|
ArrayList pids = new ArrayList();
|
||||||
pids.add(Process.myPid());
|
pids.add(Process.myPid());
|
||||||
if (mPhonePid > 0) pids.add(mPhonePid);
|
if (mPhonePid > 0) pids.add(mPhonePid);
|
||||||
File stack = ActivityManagerService.dumpStackTraces(pids);
|
// Pass !waitedHalf so that just in case we somehow wind up here without having
|
||||||
|
// dumped the halfway stacks, we properly re-initialize the trace file.
|
||||||
|
File stack = ActivityManagerService.dumpStackTraces(!waitedHalf, pids);
|
||||||
|
|
||||||
// Give some extra time to make sure the stack traces get written.
|
// Give some extra time to make sure the stack traces get written.
|
||||||
// The system's been hanging for a minute, another second or two won't hurt much.
|
// The system's been hanging for a minute, another second or two won't hurt much.
|
||||||
@@ -845,6 +860,8 @@ public class Watchdog extends Thread {
|
|||||||
} else {
|
} else {
|
||||||
Slog.w(TAG, "Debugger connected: Watchdog is *not* killing the system process");
|
Slog.w(TAG, "Debugger connected: Watchdog is *not* killing the system process");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
waitedHalf = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4779,10 +4779,13 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* If a stack trace dump file is configured, dump process stack traces.
|
* If a stack trace dump file is configured, dump process stack traces.
|
||||||
|
* @param clearTraces causes the dump file to be erased prior to the new
|
||||||
|
* traces being written, if true; when false, the new traces will be
|
||||||
|
* appended to any existing file content.
|
||||||
* @param pids of dalvik VM processes to dump stack traces for
|
* @param pids of dalvik VM processes to dump stack traces for
|
||||||
* @return file containing stack traces, or null if no dump file is configured
|
* @return file containing stack traces, or null if no dump file is configured
|
||||||
*/
|
*/
|
||||||
public static File dumpStackTraces(ArrayList<Integer> pids) {
|
public static File dumpStackTraces(boolean clearTraces, ArrayList<Integer> pids) {
|
||||||
String tracesPath = SystemProperties.get("dalvik.vm.stack-trace-file", null);
|
String tracesPath = SystemProperties.get("dalvik.vm.stack-trace-file", null);
|
||||||
if (tracesPath == null || tracesPath.length() == 0) {
|
if (tracesPath == null || tracesPath.length() == 0) {
|
||||||
return null;
|
return null;
|
||||||
@@ -4794,7 +4797,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
|
|||||||
if (!tracesDir.exists()) tracesFile.mkdirs();
|
if (!tracesDir.exists()) tracesFile.mkdirs();
|
||||||
FileUtils.setPermissions(tracesDir.getPath(), 0775, -1, -1); // drwxrwxr-x
|
FileUtils.setPermissions(tracesDir.getPath(), 0775, -1, -1); // drwxrwxr-x
|
||||||
|
|
||||||
if (tracesFile.exists()) tracesFile.delete();
|
if (clearTraces && tracesFile.exists()) tracesFile.delete();
|
||||||
tracesFile.createNewFile();
|
tracesFile.createNewFile();
|
||||||
FileUtils.setPermissions(tracesFile.getPath(), 0666, -1, -1); // -rw-rw-rw-
|
FileUtils.setPermissions(tracesFile.getPath(), 0666, -1, -1); // -rw-rw-rw-
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
@@ -4869,7 +4872,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
File tracesFile = dumpStackTraces(pids);
|
File tracesFile = dumpStackTraces(true, pids);
|
||||||
|
|
||||||
// Log the ANR to the main log.
|
// Log the ANR to the main log.
|
||||||
StringBuilder info = mStringBuilder;
|
StringBuilder info = mStringBuilder;
|
||||||
|
|||||||
Reference in New Issue
Block a user