| 624 | } |
| 625 | |
| 626 | int32_t writeCallstack(WriterI* _writer, const uintptr_t* _stack, uint32_t _num, Error* _err) |
| 627 | { |
| 628 | BX_ERROR_SCOPE(_err); |
| 629 | |
| 630 | char demangleBuf[4096]; |
| 631 | size_t demangleLen = BX_COUNTOF(demangleBuf); |
| 632 | |
| 633 | int32_t total = write(_writer, _err, "Callstack (%d):\n", _num); |
| 634 | |
| 635 | total += write(_writer, _err, "\t #: %-*s Line %-*s Function ---\n", kWidth, "File ---", kWidthPc, "PC ---"); |
| 636 | |
| 637 | CallbackData cbData; |
| 638 | |
| 639 | for (uint32_t ii = 0; ii < _num && _err->isOk(); ++ii) |
| 640 | { |
| 641 | backtrace_pcinfo(s_stCtx.state, _stack[ii], backtraceFullCb, NULL, &cbData); |
| 642 | |
| 643 | StringView demangledName = "<Unknown?>"; |
| 644 | |
| 645 | if (1 == backtrace_syminfo(s_stCtx.state, _stack[ii], backtraceSymInfoCb, NULL, &cbData) |
| 646 | && !cbData.resolvedName.isEmpty() ) |
| 647 | { |
| 648 | demangleLen = BX_COUNTOF(demangleBuf); |
| 649 | int32_t demangleStatus; |
| 650 | abi::__cxa_demangle(cbData.resolvedName.getPtr(), demangleBuf, &demangleLen, &demangleStatus); |
| 651 | |
| 652 | if (0 == demangleStatus) |
| 653 | { |
| 654 | demangledName.set({demangleBuf, narrowCast<int32_t>(demangleLen) }); |
| 655 | } |
| 656 | } |
| 657 | |
| 658 | const StringView fileName = strTail(cbData.fileName, kWidth); |
| 659 | |
| 660 | total += write(_writer, _err |
| 661 | , "\t%2d: %-*S % 5d %*p %S\n" |
| 662 | , ii |
| 663 | , kWidth |
| 664 | , &fileName |
| 665 | , cbData.line |
| 666 | , kWidthPc |
| 667 | , _stack[ii] |
| 668 | , &demangledName |
| 669 | ); |
| 670 | |
| 671 | if (0 == strCmp(demangledName, "main", 4) ) |
| 672 | { |
| 673 | if (0 != _num-1-ii) |
| 674 | { |
| 675 | total += write(_writer, _err |
| 676 | , "\t... %d more stack frames below 'main'.\n" |
| 677 | , _num-1-ii |
| 678 | ); |
| 679 | } |
| 680 | break; |
| 681 | } |
| 682 | } |
| 683 |
no test coverage detected