summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Treehugger Robot <treehugger-gerrit@google.com> 2018-03-28 21:25:13 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2018-03-28 21:25:13 +0000
commitff95c80198a8de86474b7099edda892948dd4ca7 (patch)
tree29de8b2460af58aee2e167c605b8a38b226a3e41
parent8d8921d7fce01ca34cd423e16e1c6b0cb2b4b081 (diff)
parent85b6c0032a096f79550872bebf2ba5f8a6b8b181 (diff)
Merge "Remove non-tombstoned ANR path."
-rw-r--r--core/jni/AndroidRuntime.cpp11
-rw-r--r--services/core/java/com/android/server/Watchdog.java19
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java251
3 files changed, 66 insertions, 215 deletions
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 6c46cfc751b0..7f6d19b510e4 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -591,7 +591,6 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote)
{
JavaVMInitArgs initArgs;
char propBuf[PROPERTY_VALUE_MAX];
- char stackTraceFileBuf[sizeof("-Xstacktracefile:")-1 + PROPERTY_VALUE_MAX];
char jniOptsBuf[sizeof("-Xjniopts:")-1 + PROPERTY_VALUE_MAX];
char heapstartsizeOptsBuf[sizeof("-Xms")-1 + PROPERTY_VALUE_MAX];
char heapsizeOptsBuf[sizeof("-Xmx")-1 + PROPERTY_VALUE_MAX];
@@ -673,15 +672,7 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote)
executionMode = kEMJitCompiler;
}
- // If dalvik.vm.stack-trace-dir is set, it enables the "new" stack trace
- // dump scheme and a new file is created for each stack dump. If it isn't set,
- // the old scheme is enabled.
- property_get("dalvik.vm.stack-trace-dir", propBuf, "");
- if (strlen(propBuf) > 0) {
- addOption("-Xusetombstonedtraces");
- } else {
- parseRuntimeOption("dalvik.vm.stack-trace-file", stackTraceFileBuf, "-Xstacktracefile:");
- }
+ addOption("-Xusetombstonedtraces");
strcpy(jniOptsBuf, "-Xjniopts:");
if (parseRuntimeOption("dalvik.vm.jniopts", jniOptsBuf, "-Xjniopts:")) {
diff --git a/services/core/java/com/android/server/Watchdog.java b/services/core/java/com/android/server/Watchdog.java
index 53285e6a07d7..155febdf43cf 100644
--- a/services/core/java/com/android/server/Watchdog.java
+++ b/services/core/java/com/android/server/Watchdog.java
@@ -587,13 +587,8 @@ public class Watchdog extends Thread {
}
private File dumpKernelStackTraces() {
- String tracesPath = SystemProperties.get("dalvik.vm.stack-trace-file", null);
- if (tracesPath == null || tracesPath.length() == 0) {
- return null;
- }
-
- native_dumpKernelStacks(tracesPath);
- return new File(tracesPath);
+ native_dumpKernelStacks("/data/anr");
+ return new File("/data/anr");
}
private native void native_dumpKernelStacks(String tracesPath);
@@ -615,14 +610,6 @@ public class Watchdog extends Thread {
return null;
}
- // Don't run the FD monitor on builds that have a global ANR trace file. We're using
- // the ANR trace directory as a quick hack in order to get these traces in bugreports
- // and we wouldn't want to overwrite something important.
- final String dumpDirStr = SystemProperties.get("dalvik.vm.stack-trace-dir", "");
- if (dumpDirStr.isEmpty()) {
- return null;
- }
-
final StructRlimit rlimit;
try {
rlimit = android.system.Os.getrlimit(OsConstants.RLIMIT_NOFILE);
@@ -639,7 +626,7 @@ public class Watchdog extends Thread {
// We do this to avoid having to enumerate the contents of /proc/self/fd in order to
// count the number of descriptors open in the process.
final File fdThreshold = new File("/proc/self/fd/" + (rlimit.rlim_cur - FD_HIGH_WATER_MARK));
- return new OpenFdMonitor(new File(dumpDirStr), fdThreshold);
+ return new OpenFdMonitor(new File("/data/anr"), fdThreshold);
}
OpenFdMonitor(File dumpDir, File fdThreshold) {
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 6b4cd4bb8bb5..7cfc8af600df 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -5610,57 +5610,20 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
- boolean useTombstonedForJavaTraces = false;
- File tracesFile;
-
- final String tracesDirProp = SystemProperties.get("dalvik.vm.stack-trace-dir", "");
- if (tracesDirProp.isEmpty()) {
- // When dalvik.vm.stack-trace-dir is not set, we are using the "old" trace
- // dumping scheme. All traces are written to a global trace file (usually
- // "/data/anr/traces.txt") so the code below must take care to unlink and recreate
- // the file if requested.
- //
- // This mode of operation will be removed in the near future.
-
-
- String globalTracesPath = SystemProperties.get("dalvik.vm.stack-trace-file", null);
- if (globalTracesPath.isEmpty()) {
- Slog.w(TAG, "dumpStackTraces: no trace path configured");
- return null;
- }
-
- tracesFile = new File(globalTracesPath);
- try {
- if (clearTraces && tracesFile.exists()) {
- tracesFile.delete();
- }
-
- tracesFile.createNewFile();
- FileUtils.setPermissions(globalTracesPath, 0666, -1, -1); // -rw-rw-rw-
- } catch (IOException e) {
- Slog.w(TAG, "Unable to prepare ANR traces file: " + tracesFile, e);
- return null;
- }
- } else {
- File tracesDir = new File(tracesDirProp);
- // When dalvik.vm.stack-trace-dir is set, we use the "new" trace dumping scheme.
- // Each set of ANR traces is written to a separate file and dumpstate will process
- // all such files and add them to a captured bug report if they're recent enough.
- maybePruneOldTraces(tracesDir);
-
- // NOTE: We should consider creating the file in native code atomically once we've
- // gotten rid of the old scheme of dumping and lot of the code that deals with paths
- // can be removed.
- tracesFile = createAnrDumpFile(tracesDir);
- if (tracesFile == null) {
- return null;
- }
-
- useTombstonedForJavaTraces = true;
+ final File tracesDir = new File("/data/anr");
+ // Each set of ANR traces is written to a separate file and dumpstate will process
+ // all such files and add them to a captured bug report if they're recent enough.
+ maybePruneOldTraces(tracesDir);
+
+ // NOTE: We should consider creating the file in native code atomically once we've
+ // gotten rid of the old scheme of dumping and lot of the code that deals with paths
+ // can be removed.
+ File tracesFile = createAnrDumpFile(tracesDir);
+ if (tracesFile == null) {
+ return null;
}
- dumpStackTraces(tracesFile.getAbsolutePath(), firstPids, nativePids, extraPids,
- useTombstonedForJavaTraces);
+ dumpStackTraces(tracesFile.getAbsolutePath(), firstPids, nativePids, extraPids);
return tracesFile;
}
@@ -5713,68 +5676,6 @@ public class ActivityManagerService extends IActivityManager.Stub
}
/**
- * Legacy code, do not use. Existing users will be deleted.
- *
- * @deprecated
- */
- @Deprecated
- public static class DumpStackFileObserver extends FileObserver {
- // Keep in sync with frameworks/native/cmds/dumpstate/utils.cpp
- private static final int TRACE_DUMP_TIMEOUT_MS = 10000; // 10 seconds
-
- private final String mTracesPath;
- private boolean mClosed;
-
- public DumpStackFileObserver(String tracesPath) {
- super(tracesPath, FileObserver.CLOSE_WRITE);
- mTracesPath = tracesPath;
- }
-
- @Override
- public synchronized void onEvent(int event, String path) {
- mClosed = true;
- notify();
- }
-
- public long dumpWithTimeout(int pid, long timeout) {
- sendSignal(pid, SIGNAL_QUIT);
- final long start = SystemClock.elapsedRealtime();
-
- final long waitTime = Math.min(timeout, TRACE_DUMP_TIMEOUT_MS);
- synchronized (this) {
- try {
- wait(waitTime); // Wait for traces file to be closed.
- } catch (InterruptedException e) {
- Slog.wtf(TAG, e);
- }
- }
-
- // This avoids a corner case of passing a negative time to the native
- // trace in case we've already hit the overall timeout.
- final long timeWaited = SystemClock.elapsedRealtime() - start;
- if (timeWaited >= timeout) {
- return timeWaited;
- }
-
- if (!mClosed) {
- Slog.w(TAG, "Didn't see close of " + mTracesPath + " for pid " + pid +
- ". Attempting native stack collection.");
-
- final long nativeDumpTimeoutMs = Math.min(
- NATIVE_DUMP_TIMEOUT_MS, timeout - timeWaited);
-
- Debug.dumpNativeBacktraceToFileTimeout(pid, mTracesPath,
- (int) (nativeDumpTimeoutMs / 1000));
- }
-
- final long end = SystemClock.elapsedRealtime();
- mClosed = false;
-
- return (end - start);
- }
- }
-
- /**
* Dump java traces for process {@code pid} to the specified file. If java trace dumping
* fails, a native backtrace is attempted. Note that the timeout {@code timeoutMs} only applies
* to the java section of the trace, a further {@code NATIVE_DUMP_TIMEOUT_MS} might be spent
@@ -5792,106 +5693,78 @@ public class ActivityManagerService extends IActivityManager.Stub
}
private static void dumpStackTraces(String tracesFile, ArrayList<Integer> firstPids,
- ArrayList<Integer> nativePids, ArrayList<Integer> extraPids,
- boolean useTombstonedForJavaTraces) {
+ ArrayList<Integer> nativePids, ArrayList<Integer> extraPids) {
// We don't need any sort of inotify based monitoring when we're dumping traces via
// tombstoned. Data is piped to an "intercept" FD installed in tombstoned so we're in full
// control of all writes to the file in question.
- final DumpStackFileObserver observer;
- if (useTombstonedForJavaTraces) {
- observer = null;
- } else {
- // Use a FileObserver to detect when traces finish writing.
- // The order of traces is considered important to maintain for legibility.
- observer = new DumpStackFileObserver(tracesFile);
- }
// We must complete all stack dumps within 20 seconds.
long remainingTime = 20 * 1000;
- try {
- if (observer != null) {
- observer.startWatching();
- }
-
- // First collect all of the stacks of the most important pids.
- if (firstPids != null) {
- int num = firstPids.size();
- for (int i = 0; i < num; i++) {
- if (DEBUG_ANR) Slog.d(TAG, "Collecting stacks for pid "
- + firstPids.get(i));
- final long timeTaken;
- if (useTombstonedForJavaTraces) {
- timeTaken = dumpJavaTracesTombstoned(firstPids.get(i), tracesFile, remainingTime);
- } else {
- timeTaken = observer.dumpWithTimeout(firstPids.get(i), remainingTime);
- }
- remainingTime -= timeTaken;
- if (remainingTime <= 0) {
- Slog.e(TAG, "Aborting stack trace dump (current firstPid=" + firstPids.get(i) +
- "); deadline exceeded.");
- return;
- }
+ // First collect all of the stacks of the most important pids.
+ if (firstPids != null) {
+ int num = firstPids.size();
+ for (int i = 0; i < num; i++) {
+ if (DEBUG_ANR) Slog.d(TAG, "Collecting stacks for pid " + firstPids.get(i));
+ final long timeTaken = dumpJavaTracesTombstoned(firstPids.get(i), tracesFile,
+ remainingTime);
+
+ remainingTime -= timeTaken;
+ if (remainingTime <= 0) {
+ Slog.e(TAG, "Aborting stack trace dump (current firstPid=" + firstPids.get(i) +
+ "); deadline exceeded.");
+ return;
+ }
- if (DEBUG_ANR) {
- Slog.d(TAG, "Done with pid " + firstPids.get(i) + " in " + timeTaken + "ms");
- }
+ if (DEBUG_ANR) {
+ Slog.d(TAG, "Done with pid " + firstPids.get(i) + " in " + timeTaken + "ms");
}
}
+ }
- // Next collect the stacks of the native pids
- if (nativePids != null) {
- for (int pid : nativePids) {
- if (DEBUG_ANR) Slog.d(TAG, "Collecting stacks for native pid " + pid);
- final long nativeDumpTimeoutMs = Math.min(NATIVE_DUMP_TIMEOUT_MS, remainingTime);
+ // Next collect the stacks of the native pids
+ if (nativePids != null) {
+ for (int pid : nativePids) {
+ if (DEBUG_ANR) Slog.d(TAG, "Collecting stacks for native pid " + pid);
+ final long nativeDumpTimeoutMs = Math.min(NATIVE_DUMP_TIMEOUT_MS, remainingTime);
- final long start = SystemClock.elapsedRealtime();
- Debug.dumpNativeBacktraceToFileTimeout(
- pid, tracesFile, (int) (nativeDumpTimeoutMs / 1000));
- final long timeTaken = SystemClock.elapsedRealtime() - start;
+ final long start = SystemClock.elapsedRealtime();
+ Debug.dumpNativeBacktraceToFileTimeout(
+ pid, tracesFile, (int) (nativeDumpTimeoutMs / 1000));
+ final long timeTaken = SystemClock.elapsedRealtime() - start;
- remainingTime -= timeTaken;
- if (remainingTime <= 0) {
- Slog.e(TAG, "Aborting stack trace dump (current native pid=" + pid +
- "); deadline exceeded.");
- return;
- }
+ remainingTime -= timeTaken;
+ if (remainingTime <= 0) {
+ Slog.e(TAG, "Aborting stack trace dump (current native pid=" + pid +
+ "); deadline exceeded.");
+ return;
+ }
- if (DEBUG_ANR) {
- Slog.d(TAG, "Done with native pid " + pid + " in " + timeTaken + "ms");
- }
+ if (DEBUG_ANR) {
+ Slog.d(TAG, "Done with native pid " + pid + " in " + timeTaken + "ms");
}
}
+ }
- // Lastly, dump stacks for all extra PIDs from the CPU tracker.
- if (extraPids != null) {
- for (int pid : extraPids) {
- if (DEBUG_ANR) Slog.d(TAG, "Collecting stacks for extra pid " + pid);
+ // Lastly, dump stacks for all extra PIDs from the CPU tracker.
+ if (extraPids != null) {
+ for (int pid : extraPids) {
+ if (DEBUG_ANR) Slog.d(TAG, "Collecting stacks for extra pid " + pid);
- final long timeTaken;
- if (useTombstonedForJavaTraces) {
- timeTaken = dumpJavaTracesTombstoned(pid, tracesFile, remainingTime);
- } else {
- timeTaken = observer.dumpWithTimeout(pid, remainingTime);
- }
+ final long timeTaken = dumpJavaTracesTombstoned(pid, tracesFile, remainingTime);
- remainingTime -= timeTaken;
- if (remainingTime <= 0) {
- Slog.e(TAG, "Aborting stack trace dump (current extra pid=" + pid +
- "); deadline exceeded.");
- return;
- }
+ remainingTime -= timeTaken;
+ if (remainingTime <= 0) {
+ Slog.e(TAG, "Aborting stack trace dump (current extra pid=" + pid +
+ "); deadline exceeded.");
+ return;
+ }
- if (DEBUG_ANR) {
- Slog.d(TAG, "Done with extra pid " + pid + " in " + timeTaken + "ms");
- }
+ if (DEBUG_ANR) {
+ Slog.d(TAG, "Done with extra pid " + pid + " in " + timeTaken + "ms");
}
}
- } finally {
- if (observer != null) {
- observer.stopWatching();
- }
}
}
@@ -5938,7 +5811,7 @@ public class ActivityManagerService extends IActivityManager.Stub
if (app != null) {
ArrayList<Integer> firstPids = new ArrayList<Integer>();
firstPids.add(app.pid);
- dumpStackTraces(tracesPath, firstPids, null, null, true /* useTombstoned */);
+ dumpStackTraces(tracesPath, firstPids, null, null);
}
File lastTracesFile = null;