![]() |
1
4
我无法复制这个问题——使用.NET3.5(32位)可以得到与Bart文章中描述的相同的结果。
我的猜测是.NET4编译器/jitter——或者可能是64位编译器/jitter,如果这也发生在3.5版本下——正在内联
|
![]() |
2
3
我自己也试过运行这段代码,调试版本正如我预期的那样工作,但是我在发布版本中得到了与您相同的结果。
如果在“项目属性”->“生成”屏幕中关闭“优化代码”选项,则“发布”和“调试生成”都会生成相同的结果,即在堆栈跟踪的顶部显示BadGuy()。 |
![]() |
3
3
似乎JIT优化器在这里做了一些工作。如您所见,第二种情况下的调用堆栈与第一种情况下运行调试生成时的调用堆栈不同。但是,在发布版本中,由于优化,两个调用堆栈是相同的。
要了解这与抖动有关,可以使用
请注意,IL对于
更新以回答您的后续问题是否符合CLI规范 事实上,它是兼容的,即允许JIT编译器启用重要的优化。 Annex F 第52页陈述(我强调):
|
![]() |
4
1
使用调试构建,您将更清楚地看到差异。对于调试构建,第一次运行会将位置显示为
在这么浅的堆栈跟踪中,好处并不是很明显,在非常深的堆栈中,您将通过手动抛出exception而不是使用内置的re-throw语句来掩盖问题的实际来源,并失去一些保真度。 |
![]() |
5
0
另一方面,我在一个博客上发现了一个hack,它允许您在rethrow时保留调用堆栈。如果您在一个上下文(例如,在运行异步操作的线程中)中捕获异常,并希望在另一个上下文(例如,在启动异步操作的另一个线程中)中重新触发它,则这一点非常有用。它使用了一些未记录的功能,允许跨远程处理边界保存堆栈跟踪。
|
![]() |
A B · C#Excel自动调整列避免长文本时出错 3 月前 |
![]() |
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 3 月前 |
![]() |
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 3 月前 |
|
Sei · Avalonia/WPF将路由器传递到控制模板 4 月前 |