调试故障转储,调用堆栈给出错误的行号

问题描述 投票:0回答:1

我正在尝试在 Visual Studio 2019 中调试故障转储。但是,调用堆栈为我提供了调用发生崩溃的方法的错误行号。

一些背景知识 - 我在自己的开发计算机 (Windows 11) 上创建了此应用程序,在发布模式下在构建服务器 (Windows 10 22H2) 上构建它,并在第三台计算机 (Windows 10 1607) 上运行它。 然后,我从崩溃中收集了转储(大型转储 - 类型“2”) - 该转储是在我在注册表中设置

HKLM\SOFTWARE\Microsoft\Windows Error Reporting\LocalDumps
时生成的,将其带回我自己的计算机,并从搭建服务器。

现在我在 Visual Studio 2019 中打开转储文件,它显示了我的代码,程序停止在崩溃行,显示了正确的异常。请参阅下文(我复制了屏幕截图而不是直接代码,以便您可以看到行号)。

enter image description here

当我查看调用堆栈时,它显示它停在我的

Crasher
类中的第 50 行,这是正确的 - 请参阅下面的代码。

enter image description here

但是它指出它是从

Program.Main()
类中的第 27 行调用的。事实上,包含函数调用的行是#25。再次,请参见下文。

enter image description here

有趣的是,如果我查看异常详细信息,堆栈跟踪正确地指向第 25 行!

为什么调用堆栈给出错误的行号?代码文件在复制到构建服务器后没有更改(也是第 25 行)。

c# .net visual-studio debugging dump
1个回答
0
投票

在Release模式下,编译器会应用内联、循环展开、代码重新排序等各种优化来提高性能。 因此,发出错误的行可能与您的代码的源代码不同。您可以在调试模式下运行您的应用程序并观察。

这方面有很多例子:

释放模式下堆栈跟踪中的错误异常行号

堆栈跟踪释放中的错误行号

© www.soinside.com 2019 - 2024. All rights reserved.