Pergunta

É possível depurar remotamente um processo iniciado VB6 fora?

O aplicativo é um aplicativo VB6 com algumas dll / ocx recursos. Eu estou tentando configurar uma implantação ClickOnce, usando Registration-Free COM, do aplicativo VB6, mas foram ficando erros quando ele é executado.

O meu entendimento do caminho que VB6 redirecionamentos COM registerations provavelmente significa que isso não é possível, mas eu pensei que alguém pode ter uma idéia melhor.

Foi útil?

Solução

Eu acredito que quando a depuração em VB6, não anexar a um binário de execução, mas em vez interpreta o código dentro de seu próprio processo. É por isso que as APIs do Gerenciador de Tarefas e Win32 mostrar VB6.exe como o aplicativo em execução quando a depuração.

Além disso, como você diz, VB6, por vezes, curto-circuitos chamadas para COM bibliotecas de modo interceptar essas chamadas nem sempre é possível.

Você provavelmente vai ter que recorrer a exploração madeireira inteligente (ou seja, registrar os valores das variáveis ??em torno dos pontos onde os erros que você está recebendo ocorrer na esperança de localizar a linha de código que ocorre em, e / ou o estado de variáveis ??relevantes.)

Boa sorte

Outras dicas

Para apoiar a resposta de Darryl sugerindo Windbg - aqui está um 2006 blog por um cara Microsoft sobre o uso Windbg com VB6 e 2004 blog por outro Microsoft cara com uma introdução breve para Windbg.

EDIT: Só para deixar totalmente claro. Windbg é um depurador autônomo gratuito da Microsoft. Compilar seus VB6 EXEs, DLLs e OCXs em código nativo com símbolos (criar arquivos PDB) e você será capaz de depurar seu aplicativo ClickOnce.

trecho chave do blog:

Se você tem acesso limitado à máquina do servidor, em seguida, você pode usar o remoto depuração instalações do WinDbg. Anexar uma cópia do WinDbg ao processar da forma habitual e, em seguida, transformá-lo em um servidor de depuração (Confira .server na ajuda WinDbg). Você pode então se conectar a ele remotamente a partir do menu Arquivo do WinDbg. Será apenas como sendo há, exceto para a falta de ruído dos fãs quarto servidor. Quando depuração de um controle remoto, a sua cópia do WinDbg é apenas um terminal muito inteligente por isso todas as extensões, símbolos e assim por diante tem que ser no servidor remoto. Você configurar isso exatamente o mesmo caminho para qualquer DLL, VB6 ou .NET.

Os símbolos para o componente não será carregado até que o componente faz e por isso você tem que deixar o servidor executar pelo menos esse tempo. Você pode colocar uma pausa no início em seu código VB, se você quiser parar o depurador no esse ponto, mas se o fizer, lembre-se que vai parar aí cada vez através do código. Vamos supor que você deixá-lo correr e, em seguida, quebrar. Se você listar os símbolos carregados para o seu módulo com "x MyModule! *" então você vai ver todas as suas funções, juntamente com um monte de símbolos empacotado lá para você. VB adiciona interfaces e símbolos bastante descaradamente, mas você geralmente não precisa se preocupar com aqueles. 1 coisa que provavelmente vai olhar estranho é que toda a classe / sintaxe do método com o C ++ convenção sobre dupla cólon em vez do pouco amigável ponto. não WinDbg não entendem que VB é diferente e é tratado assim como qualquer DLL com símbolos.

A partir daqui, você pode definir pontos de interrupção no modo habitual (bp etc) e passo por meio de código. Você também pode abrir módulos de código fonte VB e conjunto breakpoints neles com F9 embora as extensões de arquivo VB não estão em o arquivo de origem digite suspensa. Percorrendo o código é reveladora mas pode ser um pouco alarmante, se você ainda não viu o código que VB gera para você antes. Você estará percorrendo o assembler e há um monte de COM goo lá. HRESULTS ficar marcada muito. Você provavelmente terá de fazer referência à fonte, muitas vezes a trabalhar fora onde você é uma vez que leva um pouco de prática para ser capaz de saber o que a código-fonte parecia. Variantes são especialmente desafiador porque VB faz um monte de trabalho para você lá e que parece ser um simples equação pode resultar em uma grande quantidade de código. código otimizado é ainda mais difícil porque a ordem de execução é frequentemente muito diferente o que você poderia esperar e é mais difícil do que o normal para ver os dados.

Os dados não é fácil chegar a este caminho. Quando você olha para as variáveis ??locais (Dv é o comando), então você pode ver que as variáveis ??são simplesmente listados como eclipsou o que significa que a memória está sendo usado para algo outra coisa bem dentro do tempo de vida de função ou que o nome não é único neste contexto. Enums apenas mostrar como inteiros ou longs e objetos mostram como ponteiros. Na verdade, eles sempre eram exatamente isso, mas as peles VB IDE que de você. cordas VB são BSTRs COM (e em conformidade Unicode) sob as coberturas e matrizes de bytessão realmente de char matrizes. Você pode se surpreender ao descobrir que as cordas VB são Unicode como VB parece não ter suporte para qualquer coisa, mas ANSI. Isso é porque o motor de formas de Ruby foi apenas ANSI. Os convertidos em tempo de execução dos cadeias de caracteres Unicode para ANSI para chamadas Ruby e API, embora existam maneiras para passar Unicode, se quiser.

Você não vai ser capaz de chegar ao Err, App ou objetos de impressora desde que você precisa passar por um monte de interna e completamente estruturas ilegais para chegar a eles. Mesmo se você pudesse chegar lá, eles seria apenas dados brutos sem as funções de acesso que você usar em VB. Se você precisa de olhar para qualquer um desses campos, a sua melhor aposta é código de depuração incorporar no código fonte para copiar seus valores para em algum lugar que você pode obter em.

Você pode intervir para o tempo de execução VB se quiser, mas ele provavelmente não será muito revelador, se você está tentando depurar seu aplicativo. Se você fizer, você vai notar que partes internas do VB são muito COM influenciado. o influência foi realmente duas vias desde algumas idéias COM veio do VB originalmente.

Você pode ver as exceções ao executar seu código. referência nula exceções (ou seja dereferencing um ponteiro nulo) não são incomuns ou nada para se preocupar. Eles vão mostrar-se como primeira chance C000005 exceções com um endereço 0 ou quase 0. O tempo de execução, por vezes, vai fazer que, se há objetos definidos para nada, mas que é seguro porque o apenas valores possíveis são nulo ou um valor válido. Você também vai ver exceções se o seu código executa pesquisas em coleções eo valor é não está lá. Como as exceções são agora tão caro, você provavelmente quer Para evitar fazer isso se você puder. Outra exceção que você vai comumente vemos é c000008f. Se você olhar o número até então você vai encontrar que é um ponto flutuante inexacta excepção resultado. Ele é usado em um significado diferente aqui - desde que não geram verdadeiro ponto flutuante inexata exceções resultado, eles podem seguramente ser lançada para indicar VB erros do tipo interceptável normais.

A depuração trava e falhas em componentes VB é feito muito no mesma forma que com qualquer outro componente não gerenciado, mas é apenas um pouco mais difícil por causa das compilações descrito acima. Se você tem que tentar depuração de código VB desta forma, eu recomendo fortemente que você começar em um aplicativo "Olá, mundo" e sua maneira de trabalhar. Todas as coisas que podem VB uma linguagem fácil de código em torná-lo uma linguagem terrível depuração.

Você já tentou windbg ? Apenas certifique-se que você tem arquivos PDB para o projeto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top