Exibir o número de linhas no assembly Rastreamento de Pilha para .NET no modo Liberação

139

Existe uma maneira de exibir as linhas no rastreamento de pilha para o assembly .NET compilado / implantado no modo Release?

ATUALIZAR:

Meu aplicativo é dividido em três projetos de bibliotecas de classes e um projeto de "site" do ASP.NET. O erro que estou tentando rastrear está em um dos três projetos de biblioteca de classes. Eu implantei apenas o arquivo pdb para o projeto da biblioteca de classes que está gerando o erro "Referência de objeto não definida para uma instância de um objeto".

Os números das linhas ainda não estão aparecendo no rastreamento da pilha. Preciso implantar os arquivos pdb em todos os projetos para obter os números de linha no rastreamento de pilha?

Solução de trabalho

A implantação do arquivo pdb para cada aplicativo corrigiu o problema de número de linha.

Michael Kniskern
fonte

Respostas:

147
  • Vá para a janela Propriedades do projeto em que deseja ver os números das linhas de rastreamento da pilha.
  • Clique na compilação "guia vertical".
  • Selecione a configuração "Release". Verifique o parâmetro constante DEBUG.
  • Desmarque o parâmetro "Otimizar código" para evitar problemas ocasionais de rastreamento com o código embutido (esta etapa não é essencial).
  • Pressione o botão Avançado ... e escolha Saída -> Informações sobre depuração -> somente pdb.
  • Implante o arquivo .pdb gerado com o assembly.

Implementado com o comentário abaixo:

  • Outra coisa a verificar é na seção "Empacotar / publicar na Web" que a caixa de seleção "Excluir símbolos de depuração gerados" também está desmarcada
Coxy
fonte
2
Preciso implantar o arquivo pdb junto com o assembly?
Michael Kniskern 10/03/09
7
Sim. É aí que estão os símbolos de depuração e os números de linha.
John Saunders
5
Você provavelmente não deseja expor essas informações se não precisar. Use-o para depurar um problema de clientes, sim. Mas você nem sempre quer fazer isso, porque as informações de depuração podem revelar dados confidenciais e ser um vetor de ataque. Dependendo do seu aplicativo.
i_am_jorf
6
@Carlo: As informações de depuração também funcionam com código de liberação (otimizado), no entanto, a depuração é um pouco limitada ( stackoverflow.com/questions/113866 ). No entanto, as pilhas de chamadas são bastante confiáveis, mesmo em código otimizado, com exceção das funções embutidas e situações ocasionais em que a chamada final pode estar ausente porque a sequência xxx / ret da chamada foi substituída por jmp xxx.
Suma
12
Uma outra coisa a verificar é na seção "pacote / publicar Web" que a opção "Excluir símbolos de depuração geradas" também está desmarcada
Gaz
17

No VS2012, é necessário desmarcar a opção "Excluir símbolos de depuração gerados" na seção Package / Publish Web das propriedades também.

user3250653
fonte
ou se é um aplicativo de desktop, verifique se o arquivo PDB é implantado
CAD bloke
9

Eu já tive problemas no passado, onde sinto a necessidade de implantar arquivos PDB com uma compilação de versão para rastrear um erro. O motivo é que, como você disse, a exceção ocorreu em um método muito grande e eu não consegui identificar com precisão onde isso estava acontecendo.

Isso pode ser uma indicação de que o método precisa ser refatorado para métodos menores e mais granulares. Não existe uma resposta única para todas as respostas, mas essa abordagem me serviu bem no curto prazo (muitas vezes encontrei o bug durante a refatoração) e no longo prazo.

Apenas um pensamento.

slolife
fonte
Este. E à medida que avança, tente capturar capturas em locais mais modestos, em um grão mais fino. E aumente as proteções no início dessas funções, se for necessário fazer suposições.
precisa
Muitas vezes dito e verdade, no entanto, existe legado, há programadores que escrevem novos métodos grandes e, às vezes, um método grande é realmente a melhor coisa a fazer (dividir é confuso ou YAGNI). Além disso, mesmo que por um método 5 linha - você restringir a pesquisa 5x - assim PDBs são um mal necessário na produção menos que você tomar a dor de usar um servidor de símbolos
FastAl
3

Inclua símbolos de depuração no seu pacote de compilação / implantação.

Ken Browning
fonte
0

No VS 2008 Express, encontrei-o em Propriedades do projeto -> Compilar -> Opções avançadas de compilação.

Darel
fonte
1
O que você achou? Você pode postar um comentário se não quiser postar uma resposta completa.
precisa saber é o seguinte
-4

Isso funciona sempre. Você só precisa substring a mensagem de rastreamento de pilha. Real fácil! Além disso, no vb.net você precisa fazer o "Show All Files" e incluir o pdb.

'Err is the exception passed to this function

Dim lineGrab As String = err.StackTrace.Substring(err.StackTrace.Length - 5)
Dim i As Integer = 0
While i < lineGrab.Length                   
    If (IsNumeric(lineGrab(i))) Then
        lineNo.Append(lineGrab(i))
    End If
    i += 1
End While

'LineNo holds the number as a string

Versão c #:

string lineGrab = error.StackTrace.Substring(error.StackTrace.Length - 5);

int i = 0;
int value;
while (i < lineGrab.Length)
{
    if (int.TryParse(lineGrab[i].ToString(), out value))
    {
        strLineNo.Append(lineGrab[i]);
    }
    i++;
}
Tim Perry
fonte