in src/main/kotlin/com/github/mkartashev/hserr/miner/artifact/SignalInfo.kt [91:136]
override fun extract(log: HsErrLog): SignalInfoArtifact {
val line1Start = log.start.moveToLineWith("pc=")
val line1String = line1Start.selectUpToEOL().toString()
var sel1: TextRange? = null
if (line1String.startsWith("#")) {
sel1 = line1Start.moveToNextWord().selectCurrentWord()
}
var sel2: TextRange? = null
var signalName = sel1.toString()
var signalCode = ""
var addr = ""
val line2Start = log.start.moveToLineStartsWithString("siginfo: ")
if (line2Start.isValid()) {
sel2 = line2Start.selectUpToEOL()
// Examples:
// siginfo: EXCEPTION_ACCESS_VIOLATION (0xc0000005), reading address 0x000001d474dcbfc0
// siginfo: si_signo: 4 (SIGILL), si_code: 2 (ILL_ILLTRP), si_addr: 0x000000019064ac70
val litmusTestWord = line2Start.moveToNextWord().selectCurrentWord()
if (litmusTestWord.toString().contains("si_signo")) {
// Unix-style info
val tokens = line2Start.selectUpToEOL().toString().split(" ")
for ((i, t) in tokens.withIndex()) {
if (t.contains("si_signo")) {
signalName = tokens.getOrElse(i + 2) { "" }.trim('(', ')', ',')
} else if (t.contains("si_code")) {
signalCode = tokens.getOrElse(i + 2) { "" }.trim('(', ')', ',')
} else if (t.contains("si_addr")) {
addr = tokens.getOrElse(i + 1) { "" }
}
}
} else {
// Assuming Windows-style info
signalName = line2Start.moveToNextWord().selectCurrentWord().toString()
val tokens = line2Start.selectUpToEOL().toString().split(" ")
if (tokens.isNotEmpty()) addr = tokens.last()
}
}
val sel = mutableSetOf<TextRange>()
if (sel1 != null) sel.add(sel1)
if (sel2 != null) sel.add(sel2)
if (sel.isEmpty()) fail("Couldn't locate signal info anywhere")
return SignalInfoArtifact(log, sel, signalName, signalCode, addr)
}