Skip to content

Commit 38e9a49

Browse files
authored
Create a cap for the size of collected stacktraces (#2252)
## Goal There's no ceiling to the size of stacktraces we collect. Making sure we don't get more than 500, even through in practice, we should be getting no more than what is specified in the remote config, which we control (or 200 if not specified). There was one place we get stacktraces without limits - in the crash logs. We limit that to 200 now as well (and not configurable).
2 parents 27ca330 + 93e3a67 commit 38e9a49

File tree

4 files changed

+34
-4
lines changed

4 files changed

+34
-4
lines changed

embrace-android-core/src/main/kotlin/io/embrace/android/embracesdk/internal/config/behavior/AnrBehaviorImpl.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package io.embrace.android.embracesdk.internal.config.behavior
22

33
import io.embrace.android.embracesdk.internal.config.instrumented.schema.InstrumentedConfig
44
import io.embrace.android.embracesdk.internal.config.remote.RemoteConfig
5+
import io.embrace.android.embracesdk.internal.utils.DEFAULT_STACKTRACE_SIZE_LIMIT
56

67
/**
78
* Provides the behavior that the ANR feature should follow.
@@ -16,7 +17,7 @@ class AnrBehaviorImpl(
1617
private const val DEFAULT_ANR_PCT_ENABLED = true
1718
private const val DEFAULT_ANR_INTERVAL_MS: Long = 100
1819
private const val DEFAULT_ANR_MAX_PER_INTERVAL = 80
19-
private const val DEFAULT_STACKTRACE_FRAME_LIMIT = 200
20+
private const val DEFAULT_STACKTRACE_FRAME_LIMIT = DEFAULT_STACKTRACE_SIZE_LIMIT
2021
private const val DEFAULT_ANR_MAX_ANR_INTERVALS_PER_SESSION = 5
2122
private const val DEFAULT_ANR_MIN_CAPTURE_DURATION = 1000
2223
}

embrace-android-core/src/main/kotlin/io/embrace/android/embracesdk/internal/utils/ThreadExt.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,19 @@ package io.embrace.android.embracesdk.internal.utils
22

33
import android.os.Build
44
import io.embrace.android.embracesdk.internal.payload.ThreadInfo
5+
import kotlin.math.min
6+
7+
const val DEFAULT_STACKTRACE_SIZE_LIMIT = 200
58

69
fun getThreadInfo(
710
thread: Thread,
811
stackTraceElements: Array<StackTraceElement>,
9-
maxStacktraceSize: Int = Integer.MAX_VALUE,
12+
maxStacktraceSize: Int = DEFAULT_STACKTRACE_SIZE_LIMIT,
1013
): ThreadInfo {
1114
val name = thread.name
1215
val priority = thread.priority
1316
val frameCount = stackTraceElements.size
14-
val lines = stackTraceElements.take(maxStacktraceSize).map(StackTraceElement::toString)
17+
val lines = stackTraceElements.take(min(MAX_STACKTRACE_SIZE, maxStacktraceSize)).map(StackTraceElement::toString)
1518
return ThreadInfo(thread.compatThreadId(), thread.state, name, priority, lines, frameCount)
1619
}
1720

@@ -21,3 +24,5 @@ fun Thread.compatThreadId() = if (BuildVersionChecker.isAtLeast(Build.VERSION_CO
2124
} else {
2225
id
2326
}
27+
28+
private const val MAX_STACKTRACE_SIZE = 500

embrace-android-core/src/test/java/io/embrace/android/embracesdk/internal/utils/ThreadExtKtTest.kt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ import java.lang.Thread.currentThread
1010
@RunWith(AndroidJUnit4::class)
1111
class ThreadExtKtTest {
1212

13+
private val fakeBigStackTrace = Array(700) {
14+
StackTraceElement("a", "b", "c", 1)
15+
}
16+
1317
@Test
1418
fun `correct threadInfo created`() {
1519
val targetThread = currentThread()
@@ -27,6 +31,25 @@ class ThreadExtKtTest {
2731
}
2832
}
2933

34+
@Test
35+
fun `verify default stacktrace size is 200`() {
36+
val threadInfo = getThreadInfo(
37+
thread = currentThread(),
38+
stackTraceElements = fakeBigStackTrace
39+
)
40+
assertEquals(200, threadInfo.lines?.size)
41+
}
42+
43+
@Test
44+
fun `verify max stacktrace size capped at 500`() {
45+
val threadInfo = getThreadInfo(
46+
thread = currentThread(),
47+
stackTraceElements = fakeBigStackTrace,
48+
maxStacktraceSize = 600
49+
)
50+
assertEquals(500, threadInfo.lines?.size)
51+
}
52+
3053
@Test
3154
fun `valid threadId retrieved`() {
3255
assertTrue(currentThread().compatThreadId() > 0)

embrace-test-fakes/src/main/kotlin/io/embrace/android/embracesdk/fakes/behavior/FakeAnrBehavior.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@ package io.embrace.android.embracesdk.fakes.behavior
33
import io.embrace.android.embracesdk.internal.config.behavior.AnrBehavior
44
import io.embrace.android.embracesdk.internal.config.instrumented.schema.EnabledFeatureConfig
55
import io.embrace.android.embracesdk.internal.config.remote.AnrRemoteConfig
6+
import io.embrace.android.embracesdk.internal.utils.DEFAULT_STACKTRACE_SIZE_LIMIT
67

78
class FakeAnrBehavior(
89
var anrCaptureEnabled: Boolean = true,
910
var bgAnrCaptureEnabled: Boolean = false,
1011
var sampleIntervalMsImpl: Long = 5,
1112
var anrPerSessionImpl: Int = 5,
12-
var frameLimit: Int = 200,
13+
var frameLimit: Int = DEFAULT_STACKTRACE_SIZE_LIMIT,
1314
) : AnrBehavior {
1415

1516
override val local: EnabledFeatureConfig

0 commit comments

Comments
 (0)