Partilhar via


IDebugComPlusSymbolProvider2::LoadSymbolsWithCorModule

Dado de símbolos de depuração de cargas do ICorDebugModule objeto.

HRESULT LoadSymbolsWithCorModule(
   ULONG32   ulAppDomainID,
   GUID      guidModule,
   ULONGLONG baseAddress,
   IUnknown* pUnkMetadataImport,
   IUnknown* pUnkCorDebugModule,
   BSTR      bstrModuleName,
   BSTR      bstrSymSearchPath
);
int LoadSymbolsWithCorModule(
   uint   ulAppDomainID,
   Guid   guidModule,
   ulong  baseAddress,
   object pUnkMetadataImport,
   object pUnkCorDebugModule,
   string bstrModuleName,
   string bstrSymSearchPath
);

Parâmetros

  • ulAppDomainID
    [in] Identificador do domínio do aplicativo.

  • guidModule
    [in] Identificador exclusivo do módulo.

  • baseAddress
    [in] Endereço da memória base.

  • pUnkMetadataImport
    [in] Objeto que contém os metadados de símbolos de depuração.

  • pUnkCorDebugModule
    [in] Objeto que implementa o Interface ICorDebugModule.

  • bstrModuleName
    [in] Nome do módulo.

  • bstrSymSearchPath
    [in] Caminho para procurar o arquivo de símbolo.

Valor de retorno

Se bem-sucedida, retorna S_OK; Caso contrário, retorna um código de erro.

Exemplo

O exemplo a seguir mostra como implementar este método para um CDebugSymbolProvider objeto que expõe a IDebugComPlusSymbolProvider2 interface.

HRESULT CDebugSymbolProvider::LoadSymbolsWithCorModule(
    ULONG32 ulAppDomainID,
    GUID guidModule,
    ULONGLONG baseOffset,
    IUnknown* _pMetadata,
    IUnknown* _pCorModule,
    BSTR bstrModule,
    BSTR bstrSearchPath)
{
    EMIT_TICK_COUNT("Entry -- Loading symbols for the following target:");
    USES_CONVERSION;
    EmitTickCount(W2A(bstrModule));

    CAutoLock Lock(this);

    HRESULT hr = S_OK;
    CComPtr<IMetaDataImport> pMetadata;
    CComPtr<ICorDebugModule> pCorModule;

    CModule* pmodule = NULL;
    CModule* pmoduleNew = NULL;
    bool fAlreadyLoaded = false;
    Module_ID idModule(ulAppDomainID, guidModule);
    bool fSymbolsLoaded = false;
    DWORD dwCurrentState = 0;

    ASSERT(IsValidObjectPtr(this, CDebugSymbolProvider));
    ASSERT(IsValidInterfacePtr(_pMetadata, IUnknown));

    METHOD_ENTRY( CDebugSymbolProvider::LoadSymbol );

    IfFalseGo( _pMetadata, E_INVALIDARG );
    IfFalseGo( _pCorModule, E_INVALIDARG );

    IfFailGo( _pMetadata->QueryInterface( IID_IMetaDataImport,
                                          (void**)&pMetadata) );

    IfFailGo( _pCorModule->QueryInterface( IID_ICorDebugModule,
                                           (void**)&pCorModule) );

    ASSERT(guidModule != GUID_NULL);

    fAlreadyLoaded = GetModule( idModule, &pmodule ) == S_OK;

    IfNullGo( pmoduleNew = new CModule, E_OUTOFMEMORY );

    //
    //  We are now allowing modules to be created that do not have SymReaders.
    //  It is likely there are a number of corner cases being ignored
    //  that will require knowledge of the hr result below.
    //
    dwCurrentState = m_pSymProvGroup ? m_pSymProvGroup->GetCurrentState() : 0;

    HRESULT hrLoad = pmoduleNew->Create( idModule,
                                         dwCurrentState,
                                         pMetadata,
                                         pCorModule,
                                         bstrModule,
                                         bstrSearchPath,
                                         baseOffset );

    if (hrLoad == S_OK)
    {
        fSymbolsLoaded = true;
    }

    // Remove the old module
    if (fAlreadyLoaded)
    {
        IfFailGo(pmoduleNew->AddEquivalentModulesFrom(pmodule));
        RemoveModule( pmodule );
    }

    IfFailGo( AddModule( pmoduleNew ) );

Error:

    RELEASE (pmodule);
    RELEASE (pmoduleNew);

    if (SUCCEEDED(hr) && !fSymbolsLoaded)
    {
        hr = hrLoad;
    }

    METHOD_EXIT( CDebugSymbolProvider::LoadSymbol, hr );
    EMIT_TICK_COUNT("Exit");
    return hr;
}

Consulte também

Referência

IDebugComPlusSymbolProvider2