C# - 堆栈跟踪中的精确行号,具有 Release 模式

C# - precise line number in stack trace, with Release mode

提问人:Gal A. 提问时间:8/20/2023 更新时间:8/20/2023 访问量:82

问:

C# 异常堆栈跟踪有时具有与 IDE 中的行号不匹配的行号(例如 12)。
我能否在不对性能造成太大影响的情况下使行号准确无误?
我的代码库在 .net core 3.1 和 .net 6 中。

我之前在堆栈溢出上看到过关于这个问题的讨论,但是它已经过时了(从 .net core 之前开始)或者没有提出通用解决方案。

C# .NET 异常 .net-core 编译

评论


答:

2赞 Andi 8/20/2023 #1

使用调试模式,发布模式优化可能会导致此错误跟踪。

在配置中禁用优化:

在项目设置中,请确保在开发时以调试模式进行编译。调试版本通常包含更准确的调试信息。在发布模式下,编译器会应用各种优化,这些优化可能会降低行号的精确度。

但是,如果您坚持使用Release,我猜

使用 PDB 符号文件:

确保您的项目生成 PDB(程序数据库)符号文件。PDB 文件包含调试信息,允许调试器更准确地将机器代码映射回源代码行。

避免内联和编译器优化:

某些代码优化(如内联)可能会使调试器难以准确跟踪执行路径。可以对要避免内联的方法使用 [MethodImpl(MethodImplOptions.NoInlining)] 属性。如上所述

至少更新到 .NET 6:

.NET 6 在调试和性能方面进行了改进,因此请考虑将所有项目升级到 >=6 版本,看看它是否解决了问题。

在 IDE 中调整调试设置:

检查 IDE 的设置。在 Visual Studio 中,选中“在模块加载时禁止显示 JIT 优化”。这有助于进行准确的调试。

评论

1赞 Gal A. 8/21/2023
非常感谢您:)的详细解答。此问题发生在带有 pdb 文件的 .net 6 上。我想要在生产中出现准确的错误,因此有关IDE和调试编译的提示似乎无关紧要。对每个方法都放置一个属性也是不可行的。