Try to print a possible message from PushStackTraceAndDie. Returns the first address where the normal stack starts again.
(self, start=None, print_message=True)
| 2259 | return (None,None) |
| 2260 | |
| 2261 | def PrintStackTraceMessage(self, start=None, print_message=True): |
| 2262 | """ |
| 2263 | Try to print a possible message from PushStackTraceAndDie. |
| 2264 | Returns the first address where the normal stack starts again. |
| 2265 | """ |
| 2266 | # Only look at the first 1k words on the stack |
| 2267 | ptr_size = self.reader.MachinePointerSize() |
| 2268 | if start is None: |
| 2269 | start = self.reader.ExceptionSP() |
| 2270 | if not self.reader.IsValidAddress(start): |
| 2271 | return start |
| 2272 | end = start + ptr_size * 1024 * 4 |
| 2273 | magic1 = None |
| 2274 | for slot in range(start, end, ptr_size): |
| 2275 | if not self.reader.IsValidAddress(slot + ptr_size): |
| 2276 | break |
| 2277 | magic1 = self.reader.ReadUIntPtr(slot) |
| 2278 | magic2 = self.reader.ReadUIntPtr(slot + ptr_size) |
| 2279 | pair = (magic1 & 0xFFFFFFFF, magic2 & 0xFFFFFFFF) |
| 2280 | if pair in MAGIC_MARKER_PAIRS: |
| 2281 | return self.TryExtractOldStyleStackTrace(slot, start, end, |
| 2282 | print_message) |
| 2283 | if pair[0] == STACK_TRACE_MARKER: |
| 2284 | return self.TryExtractStackTrace(slot, start, end, print_message) |
| 2285 | elif pair[0] == ERROR_MESSAGE_MARKER: |
| 2286 | return self.TryExtractErrorMessage(slot, start, end, print_message) |
| 2287 | # Simple fallback in case not stack trace object was found |
| 2288 | return self.TryExtractOldStyleStackTrace(0, start, end, print_message) |
| 2289 | |
| 2290 | def TryExtractStackTrace(self, slot, start, end, print_message): |
| 2291 | ptr_size = self.reader.MachinePointerSize() |
no test coverage detected