C#异常未提供行号

39

我之前使用Java,现在转用C#。我遇到了一个异常,但是它没有告诉我出错的行数,只有方法名。

这种情况常见吗?是由于Debug / Release版本导致的吗?


是的,没有调试信息,CLR 就无法报告行号。但在调试会话中找到方法并查看问题仍然不应该太困难。 - Lazarus
请勿重复:https://dev59.com/ZnM_5IYBdhLWcg3wjj4p - raven
可能是在异常处理中显示行号的重复问题。 - bmargulies
@Lazarus:...除非这是在QA机器上。我不明白为什么它不只显示有问题的行的IL或其他内容。然后我可以将其反射回C#并找到它。这样就像“无法获得ye烧瓶”。 - micahhoover
如果你同时使用了async await,这可能会成为一个问题。请提供代码示例。 - niico
6个回答

44
只要在应用程序目录中保留pdb文件,调试时编译时就可以使用行号。
如果启用PDB创建,这也适用于Release版本,根据Justin's answer所述。
如果您感兴趣,可以在PDB Files(MSDN)找到更多信息。

23

这是由于调试符号不可用 - 当您构建项目时,请确保在调试设置中使用“full”设置 (项目属性 -> 生成 -> 高级 -> 调试信息),同时确保在运行应用程序时,pdb文件与程序集位于同一目录中。


15
< p >如果调试信息(pdb文件)可用,则 Exception 类的 StackTrace 属性包含行号:

using System;
class Program {
    public static void Main() {
        try {
            throw new Exception("test");
        } catch (Exception e) {
            Console.WriteLine(e.StackTrace);
        }
    }
}

使用pdb文件将会产生以下输出:

at Program.Main() in X:\code\test\test\Program.cs:line 6

而这个则没有:

at Program.Main()

4

确保应用程序的PDB文件与应用程序一起部署。PDB文件是CLR用于确定源代码行号的文件。


1

对于 .NET Core、.NET 5 及更高版本,需要在发布构建中获得完整的异常行号,请按以下方式配置项目:

<PropertyGroup>    
  <DebugSymbols>true</DebugSymbols>
  <DebugType>embedded</DebugType>

    <!-- Only enable the following if the line numbers mismatch -->
    <!--<Optimize>false</Optimize>-->
    
    <!--
      Additional properties which may impact how printed line numbers match the source code line numbers are listed here:
      https://learn.microsoft.com/en-us/dotnet/core/run-time-config/compilation
    -->
</PropertyGroup>

上述配置将直接将调试符号包含在构建文件中,这些文件可以作为NuGet发布。
除此之外,一种替代方案是与主要的NuGet包一起还原调试包,但目前尚未得到支持: https://github.com/NuGet/Home/issues/9667

0

我的应用程序是一个ClickOnce应用程序(WPF),我必须做一些不同的事情:

项目属性设计器 > 发布 > 应用程序文件

勾选“显示所有文件”复选框

找到pdb文件并设置其下拉菜单以包含它

我将Pdb-only设置为: 构建 > 高级 > 调试信息

不确定这是否重要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接