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!
fonte
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.
fonte
Siga estas etapas se você tiver o Visual Studio 2017-2019:
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.
fonte
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:
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.
debugger
.vsjitdebugger.exe
.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 .
Espero que isso ajude mais alguém no futuro!
fonte
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.
fonte
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:
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:
Quando você terminar a depuração, comente essa linha.
fonte
Você pode iniciar o depurador a partir do seu código via
Mas não se preocupe em remover esta linha antes de enviar seu aplicativo. Talvez você queira usar sinalizadores de compilador para ter certeza:
fonte
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: -)
fonte