ID do artigo: 298014 - Última revisão: quarta-feira, 5 de dezembro de 2007 - Revisão: 5.5

CORRECÇÃO: Um aplicativo COM + que usa a tabela de interface global (GIT) pode deadlock

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
importante Este artigo contém informações sobre como modificar o registro. Certifique-se de fazer backup do registro antes de modificá-lo. Certifique-se que você sabe como restaurar o registro se ocorrer um problema. Para obter mais informações sobre como fazer backup, restaurar e modificar o registro, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
256986  (http://support.microsoft.com/kb/256986/ ) Descrição do registro do Microsoft Windows
Expandir tudo | Recolher tudo

Sintomas

Um processo COM + pode parecer parar de responder (travar). Esse problema específico é raro. Você deve depurar o aplicativo totalmente diagnosticar o problema. Se você enfrentar esse problema, vários threads na apresentação processo ligue pilhas que envolvem o acesso à tabela interface global (GIT).

Não é necessário que acessar o GIT explicitamente no seu código para experimentar este problema. Outro componente que você usar pode acessar o GIT.

Causa

Esse problema pode ocorrer se uma das seguintes condições for verdadeira:
  • Você usar COM + sincronizados atividades e o JScript a componentes.
  • Você usa o JScript explicitamente. Por exemplo, você usar o Windows Script Components (WSC) em um aplicativo COM +.
  • Você usa o JScript indiretamente. Por exemplo, o Microsoft XML (MSXML) analisador usa o JScript para executar uma transformação XSL.
  • Use componentes COM + que são escritos usando código gerenciado, como Visual Basic .NET ou Visual translation from VPE for Csharp. Além disso, você não explicitamente chame o método Dispose nesses objetos em versões do Microsoft Windows anteriores ao Microsoft Windows Server 2003.

Resolução

Observação
  • Aplicativos COM + que usam objetos do Microsoft .NET System.EnterpriseServices.ServicedComponent são também conhecidos como aplicativos gerenciados COM +.
  • Aplicativos COM +, que não usam objetos do Microsoft .NET System.EnterpriseServices.ServicedComponent são também conhecidos como aplicativos não gerenciados COM +.
Se você enfrentar esse problema em aplicativos do COM + que utilizam objetos do Microsoft .NET System.EnterpriseServices.ServicedComponent , certifique-se de que o código do cliente chama o método Dispose em cada instância de ServicedComponent . A abordagem correta é o uso do método Dispose pelo cliente de objetos ServicedComponent para habilitar limpeza determinista sistemático. Todos os aplicativos cliente são necessários para chamar os aplicativos cliente COM Dispose do método em todas as instâncias de ServicedComponent mesmo não gerenciado.

Se você enfrentar esse problema em aplicativos do COM + que não usam objetos do Microsoft .NET System.EnterpriseServices.ServicedComponent , você pode usar um valor de registro que é chamado GipActivityBypass para resolver o problema. Para usar esse valor do registro no Microsoft Windows 2000, você deve primeiro instalar o Windows 2000 Service Pack 3 ou obter Microsoft COM + Hotfix Rollup 18.1.

Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
313582  (http://support.microsoft.com/kb/313582/ ) Disponibilidade do Windows 2000 Service Pack 2 COM + Hotfix Rollup Package 18.1
Para resolver esse problema, obtenha o service pack mais recente para o Windows 2000. Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
260910  (http://support.microsoft.com/kb/260910/ ) Como obter o service pack mais recente do Windows 2000
Aviso Podem ocorrer sérios problemas se você modificar o registro incorretamente usando o Editor do registro ou usando outro método. Esses problemas podem exigir que você reinstale seu sistema operacional. A Microsoft não garante que esses problemas possam ser solucionados. Modificar o registro por sua própria conta e risco.

Para ativar a correção no Windows 2000 ou no Windows XP, você deve criar esse valor do Registro adicionais:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\COM3\GipActivityBypass
Para fazer isso, execute as seguintes etapas:
  1. Inicie o Editor do Registro.
  2. Localize e, em seguida, clique na seguinte chave no Registro:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\COM3
  3. No menu Editar , aponte para novo e, em seguida, clique em Valor DWORD .
  4. Digite GipActivityBypass e, em seguida, pressione ENTER.
  5. No menu Editar , clique em Modificar .
  6. Digite 1 e, em seguida, clique em OK .
Se esse valor do Registro não estiver presente, o valor assumido é zero (False). Portanto, o código GIT deve esperar para inserir a atividade COM +. Esse comportamento pode causar uma condição de deadlock. Um valor diferente de zero (VERDADEIRO) como mostrado permite que o novo comportamento e, em seguida, evita a condição de deadlock.

Observação Esse valor do Registro permitirá chamadas para o método GetInterfaceFromGlobal para passar o bloqueio de atividade. Se um não gerenciado COM + aplicativo experiências travamentos quando ele chama o método RevokeInterfaceFromGlobal ou o método RegisterInterfaceInGlobal , contate o suporte da Microsoft.

Como Contornar

Se você enfrentar esse problema em aplicativos gerenciados do COM +, você pode aplicar o hotfix descrito no seguinte artigo da Base de dados de Conhecimento da Microsoft como solução temporária:
875503  (http://support.microsoft.com/kb/875503/ ) CORRECÇÃO: Lenta vazamentos de desempenho, deadlocks e a memória podem ocorrer quando aplicativos não chame o método Dispose em todas as instâncias da classe ServicedComponent no .NET Framework
Como alternativa, como solução temporária, você pode usar um valor de registro que é chamado DisableAsyncFinalization.

Observação Você só deve usar o valor de registro DisableAsyncFinalization como uma solução temporária enquanto estiver implementando a solução mencionada na seção "Resolução". Se você contar com o valor de registro DisableAsyncFinalization e você não use o método Dispose , você terão o uso de memória maior, desempenho reduzido e possíveis falhas do aplicativo.

Para criar
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\COM3\System.EnterpriseServices\DisableAsyncFinalization
registro valor no Windows XP ou no Windows 2000, execute estas etapas:
  1. Inicie o Editor do Registro.
  2. Localize e, em seguida, clique na seguinte chave no Registro:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\COM3\System.EnterpriseServices
    Observação Se você não encontrar a chave
    System.EnterpriseServices
    COM3 , crie a chave do Registro. Para fazer isso, execute as seguintes etapas:
    1. No menu Editar , aponte para novo e, em seguida, clique em chave .
    2. Digite System.EnterpriseServices e, em seguida, pressione ENTER.
  3. No menu Editar , aponte para novo e, em seguida, clique em Valor DWORD .
  4. Digite DisableAsyncFinalization e, em seguida, pressione ENTER.
  5. No menu Editar , clique em Modificar .
  6. Digite 1 na caixa dados do valor e, em seguida, clique em OK .

Situação

A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na seção "Aplica-se a". Esse problema foi corrigido primeiro no Windows 2000 Service Pack 3.

Mais Informações

No exemplo a seguir, a pilha de chamada mostra um JScript coletor de lixo que tenta recuperar uma interface da tabela de interface global. Observação o quadro que contém ole32! CGIPTable::GetInterfaceFromGlobal .
02c3c2d0 77e8366e 00000002 02c3c2f8 00000001 ntdll!_ZwWaitForMultipleObjects@20+0xb
02c3c320 77e260f8 02c3c2f8 00000001 00000000 KERNEL32!WaitForMultipleObjectsEx+0xea
02c3c37c 68fd46f5 02c3c348 06180fd0 ffffffff USER32!MsgWaitForMultipleObjectsEx+0x153
02c3c3a4 68fd5b64 06180fd0 00000001 02c3c404 ole32!CCliModalLoop::BlockFn+0xf8
02c3c408 695378bc 00079048 ffffffff 00000001 ole32!CoWaitForMultipleHandles+0xe1
02c3c464 69537544 06180fa0 00000001 02c3c758 COMSVCS!?EnterActivity@CActivity@@UAGJHPAUICall@@@Z+0x1be
02c3c474 68fd21f7 06180f90 02c3c758 02c3c7b8 COMSVCS!?Enter@CActivity@@UAGJPAUICall@@@Z+0x14
02c3c4ac 68fd1f78 00000020 00000002 00000001 ole32!CPolicySet::DeliverEvents+0x1f6
02c3c538 68fc8d8e 02c3c758 00000002 02c3c7b8 ole32!CPolicySet::Notify+0x455
02c3c788 68fc8b18 02c3c878 1267104c 68fd9d69 ole32!EnterForCallback+0xe7
02c3c8a8 68fc89f3 1267104c 68fd9d69 0000f024 ole32!SwitchForCallback+0xfb
02c3c8d8 68fcf3fc 1267104c 68fd9d69 0000f024 ole32!PerformCallback+0x70
02c3c934 68fd9eab 00a31e68 68fd9d69 0000f024 ole32!CObjectContext::InternalContextCallback+0x10c
02c3c97c 6b745897 6909a990 0000f024 6b76f888 ole32!CGIPTable::GetInterfaceFromGlobal+0xc1
02c3c9a0 6b7456a0 00000000 00000002 0a5abfb0 jscript!GcContext::CallInContext+0x20
02c3c9c4 6b704f1a 00000002 00000194 0a5ff530 jscript!GcContext::Reclaim+0xba
02c3c9dc 6b729eb8 0a608d88 0a62c008 6b729cae jscript!GcContext::Collect+0xbe
02c3c9e8 6b729cae 77e8357b 0a5ff648 6b72a08e jscript!GcContext::ExhaustiveCollect+0x1a
02c3ca08 6b7329bf 0a5ff530 00000001 0a608d88 jscript!CSession::Close+0x12c
02c3ca18 682fb8f4 0a5ff530 00000000 0a608d88 jscript!COleScript::SetScriptState+0x105
02c3ca28 682fb6b8 0a5cfed8 682fea19 02c3ccac scrobj!ScriptEngine::Close+0x14
02c3ca30 682fea19 02c3ccac 0a5cfed4 00000000 scrobj!ScriptEngine::~ScriptEngine+0x8
02c3ca44 682fe778 127b0fa0 02c3d4ac 00400000 scrobj!ComScriptlet::Inner::~Inner+0x79
02c3ca54 6830562d 0a5cfed0 7c0183c2 0a5e38b0 scrobj!ComScriptlet::Release+0x28
02c3ca5c 7c0183c2 0a5e38b0 68fc8db8 042dfe7c scrobj!ComDexHandler::Inner::Release+0xd
02c3ca64 68fc8db8 042dfe7c 00a30ef4 10b5140c msjava!RemoteReleaseCallback+0xd
02c3ccac 68fc8bb9 02c3cd9c 10b5140c 7c0183b5 ole32!EnterForCallback+0x111
02c3cdcc 68fec807 00079048 7c0183b5 042dfe7c ole32!SwitchForCallback+0x19c
02c3ce00 77d445e0 02c70ff8 00000000 02020202 ole32!CRemoteUnknown::DoCallback+0x72
					
a seguinte pilha de chamada mostra um componente de serviços corporativos da Microsoft que é executado no Microsoft Windows XP. Observação o quadro que contém ole32! CGIPTable::RevokeInterfaceFromGlobal .
036ded74 77f7f49f 77e74bd8 00000001 036dedc0 SharedUserData!SystemCallStub+0x4
036ded78 77e74bd8 00000001 036dedc0 00000001 ntdll!NtWaitForMultipleObjects+0xc
036dee14 77237ce4 00000001 042dd7dc 00000000 kernel32!WaitForMultipleObjectsEx+0x12c
036dee84 7575eb1d 00000000 ffffffff 00000001 ole32!CoWaitForMultipleHandles+0xe0
036deee0 7575e963 042dd790 00000001 036defb8 comsvcs!CActivity::EnterActivity+0x194
036deef0 77237287 042dd780 036defb8 036df070 comsvcs!CActivity::Enter+0x13
036def20 771d9c46 00000020 00000002 036df070 ole32!CPolicySet::DeliverEvents+0x1b4
036def98 77253c5a 036defb8 00000002 036df070 ole32!CPolicySet::Notify+0x31d 
036defec 772543c7 00000000 042bede8 771cb6cd ole32!EnterForCallback+0xb3
036df144 77236722 036df024 771cb6cd 036df19c ole32!SwitchForCallback+0x19a
036df170 7722a047 042bede8 771cb6cd 036df19c ole32!PerformCallback+0x52
036df1a4 77201a4b 04284894 00000000 00090ec0 ole32!ReleaseMarshalObjRef+0x76
036df210 77237f23 036df228 000fefa0 00001b0c ole32!CoReleaseMarshalData+0x7b
036df24c 0377e50d 772b4618 00001b0c 032d2100 ole32!CGIPTable::RevokeInterfaceFromGlobal+0x1a1
036df294 03100971 0106281c 03103cea 032d2100 0x377e50d
036df2d4 79a87bfd 799b0983 036df300 000fefa0 0x3100971
036df2ec 7930a2a8 799b0908 0106281c 00000000 mscorlib_79960000+0x127bfd
036df318 792ad177 799b0908 0106281c 00000000 mscorwks!CTPMethodTable::CallTarget+0x4b
036df338 791b21e7 031f341c 00000000 00000000 mscorwks!CRemotingServices::CreateProxyOrObject+0x57
036df3a4 791b22a1 031f341c 03103c3f 00000002 mscorwks!JIT_NewCrossContextHelper+0x3b
					
para informações sobre como obter informação simbólica ao usar ferramentas de depuração, visite o seguinte site:
http://www.microsoft.com/whdc/devtools/debugging/debugstart.mspx (http://www.microsoft.com/whdc/devtools/debugging/debugstart.mspx)
Para obter mais informações sobre como instalar o Windows 2000 e hotfixes do Windows 2000 ao mesmo tempo, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
249149  (http://support.microsoft.com/kb/249149/ ) Instalando os hotfixes do Microsoft Windows 2000 e Windows 2000
Para obter mais informações sobre terminologia de atualização de software, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
824684  (http://support.microsoft.com/kb/824684/ ) Descrição da terminologia padrão que é usada para descrever as atualizações de software

A informação contida neste artigo aplica-se a:
  • Microsoft COM+ 1.0 nas seguintes plataformas
    • Microsoft Windows 2000 Professional SP1
    • Microsoft Windows 2000 Server SP1
    • Microsoft Windows 2000 Advanced Server SP1
    • Microsoft Windows 2000 Professional SP2
    • Microsoft Windows 2000 Server SP2
    • Microsoft Windows 2000 Advanced Server SP2
    • Microsoft Windows XP Home Edition
    • Microsoft Windows XP Professional
  • Microsoft COM+ 1.5 nas seguintes plataformas
    • Microsoft Windows 2000 Professional SP1
    • Microsoft Windows 2000 Server SP1
    • Microsoft Windows 2000 Advanced Server SP1
    • Microsoft Windows 2000 Professional SP2
    • Microsoft Windows 2000 Server SP2
    • Microsoft Windows 2000 Advanced Server SP2
    • Microsoft Windows XP Home Edition
    • Microsoft Windows XP Professional
Palavras-chave: 
kbmt kbbug kbfix kbqfe kbwin2000presp3fix kbwin2000sp3fix KB298014 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 298014  (http://support.microsoft.com/kb/298014/en-us/ )