Por que não recebo números de linha de um rastreamento de pilha criado a partir de exceções?
-
19-09-2019 - |
Pergunta
Ok; Supondo este código em execução no modo de depuração -
static StackFrame GetTopFrameWithLineNumber(Exception e)
{
StackTrace trace = new StackTrace(e);
foreach (StackFrame frame in trace.GetFrames())
{
if (frame.GetFileLineNumber() != 0)
{
return frame;
}
}
return null;
}
Estou sempre voltando nulo. Por que os quadros de pilha não têm números de linha quando eu inspeciona o Exception.StackTrace
String, ele claramente os possui para qualquer código que não seja de estrutura? Existe algum problema na construção de um rastreamento de pilha a partir de uma exceção que eu não estou ciente?
Editar para clareza:Na exceção jogada, posso ver os números de linha na propriedade Stacktrace. Estou assumindo que isso significa que tenho tudo o mais que preciso.
Solução
De acordo com Documentação sobre a sobrecarga do construtor do StackTrace que exige uma exceção Você não pode esperar números de linha ao criar o Stacktrace dessa maneira.
O StackTrace é criado com o encadeamento atual do chamador e não contém nome do arquivo, número da linha ou informações da coluna.
Para obter os números de linha, você precisa usar a sobrecarga que leva um bool e também a exceção.
Você também precisa de arquivos de símbolos (PDB) para números de linha. Arquivos de símbolo estão disponíveis para Ambas Depuração e lançamento construídas.