Add log section for the last thread dump during a possible deadlock.

This commit is contained in:
Greyson Parrelli
2022-04-27 10:30:30 -04:00
parent 8cb74fb776
commit ebf2ef65e2
4 changed files with 69 additions and 41 deletions

View File

@@ -1,37 +0,0 @@
package org.thoughtcrime.securesms.logsubmit;
import android.content.Context;
import androidx.annotation.NonNull;
import java.util.Map;
public class LogSectionBlockedThreads implements LogSection {
@Override
public @NonNull String getTitle() {
return "BLOCKED THREADS";
}
@Override
public @NonNull CharSequence getContent(@NonNull Context context) {
Map<Thread, StackTraceElement[]> traces = Thread.getAllStackTraces();
StringBuilder out = new StringBuilder();
for (Map.Entry<Thread, StackTraceElement[]> entry : traces.entrySet()) {
if (entry.getKey().getState() == Thread.State.BLOCKED) {
Thread thread = entry.getKey();
out.append("-- [").append(thread.getId()).append("] ")
.append(thread.getName()).append(" (").append(thread.getState().toString()).append(")\n");
for (StackTraceElement element : entry.getValue()) {
out.append(element.toString()).append("\n");
}
out.append("\n");
}
}
return out.length() == 0 ? "None" : out;
}
}

View File

@@ -0,0 +1,51 @@
package org.thoughtcrime.securesms.logsubmit;
import android.content.Context;
import androidx.annotation.NonNull;
import org.signal.core.util.concurrent.DeadlockDetector;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Map;
public class LogSectionThreadDump implements LogSection {
private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS zzz", Locale.US);
@Override
public @NonNull String getTitle() {
return "LAST THREAD DUMP";
}
@Override
public @NonNull CharSequence getContent(@NonNull Context context) {
Map<Thread, StackTraceElement[]> traces = ApplicationDependencies.getDeadlockDetector().getLastThreadDump();
long time = ApplicationDependencies.getDeadlockDetector().getLastThreadDumpTime();
if (traces == null) {
return "None";
}
StringBuilder out = new StringBuilder();
out.append("Time: ").append(DATE_FORMAT.format(new Date(time))).append(" (").append(time).append(")\n\n");
for (Map.Entry<Thread, StackTraceElement[]> entry : traces.entrySet()) {
Thread thread = entry.getKey();
out.append("-- [").append(thread.getId()).append("] ")
.append(thread.getName()).append(" (").append(thread.getState()).append(")\n");
for (StackTraceElement element : entry.getValue()) {
out.append(element.toString()).append("\n");
}
out.append("\n");
}
return out;
}
}

View File

@@ -83,7 +83,7 @@ public class SubmitDebugLogRepository {
add(new LogSectionPermissions());
add(new LogSectionTrace());
add(new LogSectionThreads());
add(new LogSectionBlockedThreads());
add(new LogSectionThreadDump());
if (FeatureFlags.internalUser()) {
add(new LogSectionSenderKey());
}