Como faço para anexar o Visual Studio a um processo que ainda não foi iniciado?

89

Tenho um programa .NET que não pode ser executado no Visual Studio por alguns motivos (arquivo do Excel criado a partir de um projeto modelo do Excel 2010) para o qual preciso depurar eventos de inicialização.

Se eu quiser depurar eventos que vêm após a inicialização do programa, não há problema. Eu executo o programa do explorer, anexe o processo ao Visual Studio e adiciono alguns pontos de interrupção no código. Mas aqui, preciso colocar pontos de interrupção nos eventos de inicialização. Eu preciso ser capaz de anexar processos ao Visual Studio, não dependendo de um PID, mas de um nome de processo específico ou qualquer outra solução que funcione.

É claro que adicionar um Thread.Sleep(1000)em meus eventos de inicialização para me dar algum tempo para anexar o processo no Visual Studio está fora de questão!

Ucodia
fonte

Respostas:

97

Na verdade, você pode; você não se apega a ele, você o inicia. Nas propriedades do seu projeto, na guia Depuração, especifique o caminho do programa ao qual deseja anexar na caixa de texto "Comando".

Você também pode inserir qualquer argumento de linha de comando para o programa na caixa "Argumentos de comando":

insira a descrição da imagem aqui

Certifique-se de que "Anexar" esteja definido como "Não".

Tibi
fonte
6
Boa solução, mas observe que pressionar F5 não funciona neste caso. Em vez disso, clique com o botão direito do mouse no projeto em questão e clique em 'Depurar> Iniciar nova instância' no menu de contexto.
Herman Cordes
1
Para que F5 funcione, seu projeto deve ser o Projeto de início na solução. Para fazer isso, no gerenciador de soluções clique com o botão direito do mouse no projeto e selecione "Definir como projeto de inicialização".
Tibi
1
Além disso, se o seu programa tiver algumas dependências externas, você também precisará alterar o "Diretório de trabalho".
Priyank
Pode ser necessário marcar "Habilitar depuração de código nativo" (propriedades do projeto → DepurarHabilitar depuradores ).
Peter Mortensen,
E como você faz isso para uma solução inteira com 40 projetos?
Tony Tannous de
23

Eu estava depurando um plugin C ++ em um processo gerado externamente que travou ao lançar uma exceção na inicialização e funcionou perfeitamente para mim:

Adicione a extensão Reattach gratuita para Visual Studio . Peça que ele se reconecte ao nome do processo antes de ser iniciado. Ele irá abrir uma caixa de diálogo modal dizendo que está aguardando o início do nome do processo.

Agora inicie o processo e o depurador do Visual Studio será anexado imediatamente, capturando exceções e atingindo pontos de interrupção.

mstrange
fonte
Mil vezes sim!
itslittlejohn
Eu tenho um impasse. Ele solicitou a autenticação do administrador quando meu destino foi iniciado e, após digitar pwd e reiniciar o vs, o Reattach desapareceu. Apenas vs sem autenticação de administrador contém Reattach.
Eric
2
Não funciona para mim. Ele ainda se conecta tarde demais, depois que a falha já aconteceu. Parece que verifica os processos existentes uma vez a cada segundo, o que é completamente inútil para este aplicativo.
riv
20

Siga estas etapas se você tiver o Visual Studio 2017-2019:

  1. Arquivo> Abrir> Projeto / Solução
  2. Escolha o seu .exe
  3. Depurar> Iniciar depuração

Muito mais fácil do que outras sugestões: você não precisa mexer com as propriedades do projeto e nenhuma extensão é necessária.

Matt Thomas
fonte
Mas você terá que dizer ao Visual Studio onde estão os símbolos de depuração, se ele não os encontrar automaticamente
Matt Thomas
1
rápido fácil de fazer em 5 segundos, eu adoro isso. Obrigado
ComradeJoecool 01 de
1
Meu exe foi lançado, mas nenhum ponto de interrupção pôde ser definido. O que devo fazer?
Eric
2
@Eric Se meu comentário acima não abordar isso, recomendo fazer isso como uma pergunta SO em vez de um comentário. Seu problema terá mais visibilidade e você terá a chance de explicar seu cenário específico. Então deixe-nos saber o que você encontrou!
Matt Thomas
11

Eu encontrei essa resposta quando estava procurando por algo semelhante. No meu caso, eu não poderia simplesmente usar o executável como o programa de inicialização do meu projeto porque ele precisava ser iniciado em um ambiente muito específico que eu não poderia reproduzir facilmente (nome: iniciado a partir do cygwin).

Dei uma olhada na extensão Reattach sugerida por mrstrange e também na extensão Attach To Anything muito semelhante ... mas meu executável parecia fechar muito rápido para que as extensões notificassem e anexassem.

O que finalmente me ajudou foi isso: https://stackoverflow.com/a/4042545/1560865 , que faz referência ao artigo do MSDN How to: Launch the Debugger Automatically , que por sua vez lista as seguintes etapas:

  1. Inicie o Editor do Registro (regedit).
  2. No Editor do Registro, abra a pasta HKEY_LOCAL_MACHINE.
  3. Navegue até HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ currentversion \ opções de execução do arquivo de imagem.
  4. Na pasta Opções de execução do arquivo de imagem , localize o nome do aplicativo que deseja depurar, como myapp.exe . Se você não conseguir encontrar o aplicativo que deseja depurar:
    a. Clique com o botão direito do mouse na pasta Opções de execução do arquivo de imagem e, no menu de atalho, clique em Nova chave .
    b. Clique com o botão direito do mouse na nova chave e, no menu de atalho, clique em Renomear . c. Edite o nome da chave para o nome do seu aplicativo; myapp.exe , neste exemplo.
  5. Clique com o botão direito do mouse na pasta myapp.exe e, no menu de atalho, clique em Novo valor de string .
  6. Clique com o botão direito do mouse no novo valor da string e, no menu de atalho, clique em Renomear.
  7. Altere o nome para debugger.
  8. Clique com o botão direito do mouse no novo valor da string e, no menu de atalho, clique em Modificar . A caixa de diálogo Editar String é exibida.
  9. Na caixa Dados do valor , digite vsjitdebugger.exe.
  10. Clique OK .
  11. No menu Registro , clique em Sair .
  12. O diretório que contém o vsjitdebugger.exe deve estar no caminho do sistema. Para adicioná-lo ao caminho do sistema, siga estas etapas:
    a. Abra o Painel de controle no modo de exibição clássico e clique duas vezes em Sistema .
    b. Clique em Configurações avançadas do sistema .
    c. Em Propriedades do sistema , clique na guia Avançado .
    d. Na guia Avançado , clique em Variáveis ​​de ambiente .
    e. Na caixa de diálogo Variáveis ​​de ambiente , em Variáveis ​​do sistema , selecione Caminho e clique no botão Editar .
    f. Em Editar Variável do Sistemacaixa de diálogo, adicione o diretório à caixa Valor da variável . Use um ponto e vírgula para separá-lo de outras entradas na lista.
    g. Clique em OK para fechar a caixa de diálogo Editar Variável do Sistema .
    h. Clique em OK para fechar a caixa de diálogo Variáveis ​​de ambiente .
    Eu. Clique em OK para fechar a caixa de diálogo Propriedades do sistema .
  13. Agora, use qualquer método para iniciar seu aplicativo. O Visual Studio irá iniciar e carregar o aplicativo.

Espero que isso ajude mais alguém no futuro!

Hauke ​​P.
fonte
3
Aqui estão as instruções para esse mesmo processo com versões mais recentes do VS (até 2019): docs.microsoft.com/en-us/visualstudio/debugger/…
brichins
3

Se não houver processo, o Visual Studio não poderá se conectar a ele.

No entanto, você pode definir o programa de inicialização do seu projeto para ser algo diferente da saída do seu projeto.

ChrisF
fonte
Já investiguei se o que quero fazer está certo, e realmente é. Minha situação não é um caso comum de depuração do Visual Studio. Eu tenho um projeto de modelo do Excel 2010 desenvolvido no Visual Studio e as folhas de modelo têm eventos de inicialização. Eu executo este modelo do Visual Studio, adiciono alguns dados em minhas planilhas do Excel e salvo o arquivo no disco. Então, a única maneira de abrir esse arquivo que também depende da montagem do modelo é abri-lo no explorer, portanto, não posso depurar os eventos de inicialização neste caso e, claro, tenho algum processamento de dados na inicialização, como ligação de dados.
Ucodia
Pode ser necessário marcar "Habilitar depuração de código nativo" (propriedades do projeto → DepurarHabilitar depuradores ).
Peter Mortensen,
3

Você pode mostrar um MessageBox, isso bloquearia o aplicativo, então você anexa ou reconecta o depurador ao processo e clica em ok para continuar:

MessageBox.Show("Attach process to debugger and click ok!");

você pode adicioná-lo ao construtor Form (se usar winforms), de modo que seja executado antes de qualquer coisa, exceto para a inicialização de componentes:

public MainForm()
{
    InitializeComponent();
    MessageBox.Show("Attach process to debugger and click ok!");
}

Quando você terminar a depuração, comente essa linha.

Raynet
fonte
3

Você pode iniciar o depurador a partir do seu código via

public static void Main(string[] args)
{
  System.Diagnostics.Debugger.Launch();
}

Mas não se preocupe em remover esta linha antes de enviar seu aplicativo. Talvez você queira usar sinalizadores de compilador para ter certeza:

    public static void Main(string[] args)
    {
      #if debug
      System.Diagnostics.Debugger.Launch();
      #endif
    }
Alguém
fonte
2
Essa deve ser a resposta aceita para todos os casos em que você está aguardando algum processo externo para iniciar seu aplicativo.
TravelingFox
2

Uma pequena solução que pode servir para muitas pessoas.

  • na primeira linha de código que o exe irá executar, adicione este comando

    System.Threading.Thread.Sleep (20000)

Isso fará o exe hibernar por 20 segundos antes de começar a processar qualquer coisa. Você terá 20 segundos para anexar ao processo, o que pode ser feito rapidamente com ctrl + alt + p, localize o processo e digite para anexar.

Não é muito uma resposta, mas funcionou muito bem para mim: -)

user2728841
fonte
Tive que depurar um CGI escrito em "C" para o qual tinha o código-fonte. Eu era uma solução simples e fácil de ter tempo para anexar ao processo em segundo plano.
Joël Hecht