Get Stack Trace of Methods That Called Us
GT-Sandbox-Snapshot: StackTraceRetriever
Code
package com.glassthought.sandbox
import gt.sandbox.util.output.Out
import gt.sandbox.util.output.impl.OutSettings
val out = Out.standard(outSettings = OutSettings(printColorPerThread = true))
class StackTraceRetriever {
companion object {
fun getStackTrace(): List<StackTraceElement> {
val allStackTrace = Throwable().stackTrace
return allStackTrace.dropWhile {
it.className == StackTraceRetriever::class.java.name || it.methodName == "getStackTrace"
}
}
}
}
fun callerOne() {
callerTwo()
}
fun callerTwo() {
val filteredStackTrace = StackTraceRetriever.getStackTrace()
filteredStackTrace.forEachIndexed { index, element ->
println("[$index] ${element.className}.${element.methodName} (${element.fileName}:${element.lineNumber})")
}
}
fun main(args: Array<String>) {
callerOne()
}
Command to reproduce:
gt.sandbox.checkout.commit 23ac2adb62f9c844078e \
&& cd "${GT_SANDBOX_REPO}" \
&& cmd.run.announce "./gradlew run --quiet"
Recorded output of command:
[0] com.glassthought.sandbox.MainKt.callerTwo (Main.kt:29)
[1] com.glassthought.sandbox.MainKt.callerOne (Main.kt:25)
[2] com.glassthought.sandbox.MainKt.main (Main.kt:37)
GT-Sandbox-Snapshot
Code
package com.glassthought.sandbox
import gt.sandbox.util.output.Out
import gt.sandbox.util.output.impl.OutSettings
import kotlinx.coroutines.runBlocking
import kotlin.concurrent.thread
val out = Out.standard(outSettings = OutSettings(printColorPerThread = true))
fun printCallerStackTrace() {
val stackTrace = Throwable().stackTrace
for ((index, element) in stackTrace.withIndex()) {
println("[$index] ${element.className}.${element.methodName} (${element.fileName}:${element.lineNumber})")
}
}
fun callerOne() {
callerTwo()
}
fun callerTwo() {
printCallerStackTrace()
}
fun main(args: Array<String>) {
callerOne()
}
Command to reproduce:
gt.sandbox.checkout.commit 1a702056e0bc63b07688 \
&& cd "${GT_SANDBOX_REPO}" \
&& cmd.run.announce "./gradlew run --quiet"
Recorded output of command:
[0] com.glassthought.sandbox.MainKt.printCallerStackTrace (Main.kt:11)
[1] com.glassthought.sandbox.MainKt.callerTwo (Main.kt:24)
[2] com.glassthought.sandbox.MainKt.callerOne (Main.kt:20)
[3] com.glassthought.sandbox.MainKt.main (Main.kt:28)