| 477 | } |
| 478 | |
| 479 | static int CallstackDataCb( void* /*data*/, uintptr_t pc, const char* fn, int lineno, const char* function ) |
| 480 | { |
| 481 | enum { DemangleBufLen = 64*1024 }; |
| 482 | char demangled[DemangleBufLen]; |
| 483 | |
| 484 | cb_data[cb_num].symLen = 0; |
| 485 | cb_data[cb_num].symAddr = (uint64_t)pc; |
| 486 | |
| 487 | if( !fn && !function ) |
| 488 | { |
| 489 | const char* symname = nullptr; |
| 490 | const char* symloc = nullptr; |
| 491 | auto vptr = (void*)pc; |
| 492 | ptrdiff_t symoff = 0; |
| 493 | |
| 494 | Dl_info dlinfo; |
| 495 | if( dladdr( vptr, &dlinfo ) ) |
| 496 | { |
| 497 | symloc = dlinfo.dli_fname; |
| 498 | symname = dlinfo.dli_sname; |
| 499 | symoff = (char*)pc - (char*)dlinfo.dli_saddr; |
| 500 | |
| 501 | if( symname && symname[0] == '_' ) |
| 502 | { |
| 503 | size_t len = DemangleBufLen; |
| 504 | int status; |
| 505 | abi::__cxa_demangle( symname, demangled, &len, &status ); |
| 506 | if( status == 0 ) |
| 507 | { |
| 508 | symname = demangled; |
| 509 | } |
| 510 | } |
| 511 | } |
| 512 | |
| 513 | if( !symname ) symname = "[unknown]"; |
| 514 | if( !symloc ) symloc = "[unknown]"; |
| 515 | |
| 516 | if( symoff == 0 ) |
| 517 | { |
| 518 | cb_data[cb_num].name = CopyString( symname ); |
| 519 | } |
| 520 | else |
| 521 | { |
| 522 | char buf[32]; |
| 523 | const auto offlen = sprintf( buf, " + %td", symoff ); |
| 524 | const auto namelen = strlen( symname ); |
| 525 | auto name = (char*)tracy_malloc( namelen + offlen + 1 ); |
| 526 | memcpy( name, symname, namelen ); |
| 527 | memcpy( name + namelen, buf, offlen ); |
| 528 | name[namelen + offlen] = '\0'; |
| 529 | cb_data[cb_num].name = name; |
| 530 | } |
| 531 | |
| 532 | char buf[32]; |
| 533 | const auto addrlen = sprintf( buf, " [%p]", (void*)pc ); |
| 534 | const auto loclen = strlen( symloc ); |
| 535 | auto loc = (char*)tracy_malloc( loclen + addrlen + 1 ); |
| 536 | memcpy( loc, symloc, loclen ); |
nothing calls this directly
no test coverage detected