HRESULT Session::FindChildSymbol( SymHandle parentHandle, const char* nameChars, size_t nameLen, SymHandle& handle ) { HRESULT hr = S_OK; SymbolScope scope = { 0 }; SymHandle childHandle = { 0 }; SymInfoData infoData = { 0 }; hr = mStore->SetChildSymbolScope( parentHandle, scope ); if ( FAILED( hr ) ) return hr; for ( ; mStore->NextSymbol( scope, childHandle, ~0U ); ) { ISymbolInfo* symInfo = NULL; SymString pstrName; hr = mStore->GetSymbolInfo( childHandle, infoData, symInfo ); if ( hr != S_OK ) continue; if ( !symInfo->GetName( pstrName ) ) continue; if ( (nameLen == pstrName.GetLength()) && (memcmp( nameChars, pstrName.GetName(), nameLen ) == 0) ) { handle = childHandle; return S_OK; } } return S_FALSE; }
HRESULT StackFrame::AppendFunctionNameWithSymbols( FRAMEINFO_FLAGS flags, UINT radix, MagoST::ISession* session, MagoST::ISymbolInfo* symInfo, CString& fullName ) { _ASSERT( session != NULL ); _ASSERT( symInfo != NULL ); HRESULT hr = S_OK; CComBSTR funcNameBstr; SymString pstrName; if ( !symInfo->GetName( pstrName ) ) return E_NOT_FOUND; hr = Utf8To16( pstrName.GetName(), pstrName.GetLength(), funcNameBstr.m_str ); if ( FAILED( hr ) ) return hr; fullName.Append( funcNameBstr ); fullName.AppendChar( L'(' ); if ( (flags & FIF_FUNCNAME_ARGS_ALL) != 0 ) { AppendArgs( flags, radix, session, symInfo, fullName ); } fullName.AppendChar( L')' ); bool hasLineInfo = false; Address64 baseAddr = 0; if ( (flags & FIF_FUNCNAME_LINES) != 0 ) { LineInfo line; if ( SUCCEEDED( GetLineInfo( line ) ) ) { hasLineInfo = true; baseAddr = line.Address; // lines are 1-based to user, but 0-based from symbol store DWORD lineNumber = line.LineBegin.dwLine + 1; const wchar_t* lineStr = GetString( IDS_LINE ); fullName.AppendFormat( L" %s %u", lineStr, lineNumber ); } } if ( !hasLineInfo ) { uint16_t sec = 0; uint32_t offset = 0; symInfo->GetAddressSegment( sec ); symInfo->GetAddressOffset( offset ); baseAddr = (Address64) session->GetVAFromSecOffset( sec, offset ); } if ( ((flags & FIF_FUNCNAME_OFFSET) != 0) && (mPC != baseAddr) ) { const wchar_t* bytesStr = GetString( IDS_BYTES ); fullName.AppendFormat( L" + 0x%x %s", (uint32_t) (mPC - baseAddr), bytesStr ); } return S_OK; }