场景:
我刚刚开始实现一堆代码,但是当我执行它时,我会抛出一个StackOverflowException?StackOverflowException没有堆栈跟踪,所以我卡住了.我知道为什么会发生堆栈溢出,但要修复它我需要知道它的根目录是什么.
我得到的是:tag-you-it.dll中出现未处理的"System.StackOverflowException"类型异常
选项:
PS:
这是一种假设情况(虽然并不常见),因此没有可用的代码.
Nei*_*ell 16
这几乎总是归因于递归.要么是调用自身的方法,要么是调用调用它的方法的方法,等等.
找到它:
StackOverflowException(我想与无法捕获一个有关的事情).但是有办法获取转储这里提到.偶尔你会得到这样的拼写错误:
private string name;
public string Name
{
get { return Name; } // Ooops! This is recursive, all because of a typo...
}
Run Code Online (Sandbox Code Playgroud)
这就是我个人现在更喜欢使用自动属性的原因之一.
Bat*_*nit 11
WinDbg可以完成工作,甚至包括获得合理的(clr)堆栈跟踪.您需要获得WinDbg,除非您已经使用Visual Studio或Windows SDK安装它.注意:使用新GUI的"WinDbg预览"对我来说很好.
我建议从WinDbg开始你的过程,但当然你也可以把它附加到一个正在运行的过程,如果这更适合你.
注意:在启动进程后,CLR未加载,并且.loadby SOS.dll clr将失败("无法找到模块'clr').您必须等待加载CLR.一旦发生这种情况就停止执行执行:
sxe ld clr完成后,您必须执行以下步骤(在命令窗口/行中输入):
SackOverflowException(不是 .loadby SOS.dll clr - 这会导致扩展被加载两次).loadby sos clr!stoponexception -create System.StackOverflowException (继续调试)触发StackOverflowException /等待它发生
g (将打印堆栈跟踪)值得注意的来源:
小智 8
转到Debug,exception并选中'Common Language Runtime Exceptions'中的抛出复选框.现在,当您导致stackoverflow异常时,调试器将停止(最终)并显示调用堆栈.
您可以在调试模式下执行该程序并暂停它.在当前的callstack上,你可以看到有一种方法或一组方法多次出现,这些都是有问题的方法.在这个方法上加上一个断点,看看它一直在调用它自己.
该ProcDump工具帮助我们为调试问题在这里详细描述。脚步:
procdump -accepteula -e 1 -f C00000FD.STACK_OVERFLOW -g -ma <process ID> d:\home\DebugTools\Dumps(目录必须存在)我们可以通过启用CrashDiagnoser扩展在 Azure 上使用相同的技术,如此处所述。基本上它执行与上面相同的步骤。它生成的转储文件可以在 Visual Studio 中下载和打开。
| 归档时间: |
|
| 查看次数: |
20641 次 |
| 最近记录: |