MCPcopy Create free account
hub / github.com/crossuo/crossuo / CallstackDataCb

Function CallstackDataCb

external/tracy/client/TracyCallstack.cpp:479–577  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

477}
478
479static 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 );

Callers

nothing calls this directly

Calls 3

CopyStringFunction · 0.85
tracy_mallocFunction · 0.85
memcpyFunction · 0.85

Tested by

no test coverage detected