为什么VisualStudio2010调试器不拾取调试符号来处理F#序列中的异常?
在Visual Studio 2010中,以下F#序列在发布模式下按预期工作(忽略UnauthorizedAccessException),但在调试模式下不能正常工作(在UnauthorizedAccessException上中断,即使我设置了“公共语言运行时异常:抛出=false,用户未处理=true”) 但是,如果我不将getAuthorizedItems函数嵌套在序列中,而是将其放在模块级,则调试器可以正常工作 注:为什么VisualStudio2010调试器不拾取调试符号来处理F#序列中的异常?,f#,visual-studio-debugging,F#,Visual Studio Debugging,在Visual Studio 2010中,以下F#序列在发布模式下按预期工作(忽略UnauthorizedAccessException),但在调试模式下不能正常工作(在UnauthorizedAccessException上中断,即使我设置了“公共语言运行时异常:抛出=false,用户未处理=true”) 但是,如果我不将getAuthorizedItems函数嵌套在序列中,而是将其放在模块级,则调试器可以正常工作 注: 我已经查看了生成的IL代码,异常处理程序在这两种情况下都应该在那里(没有
在我报告了这个问题后,F#团队很快开始跟踪它。这似乎是一个与以下事实相关的小错误:在调试模式下,生成的一些代码被标记为“外部代码”,即使它是用户代码。目前,人们可以使用pad答案中建议的解决方法。另一个解决方法是关闭VS调试选项中的“仅启用我的代码”。我可以在没有安装VS2010 SP1的情况下,使用F#2.0/.NET 4.0在我的机器上重现该错误。这可能是因为@svick无法重现该漏洞,所以该漏洞已在VS2010 SP1中修复。事实证明,在VS2010 SP1更新后,此错误仍然存在 我认为处理序列表达式中嵌套函数中的异常是一个错误,更改嵌套函数以捕获任何异常不会影响行为:
let getAuthorizedItems getItems dir =
try getItems dir
with ex -> [||]
这是一个小错误;您可以通过多种方式绕过它:
- 它在发布模式下工作,在fsi内部,甚至在VisualStudio外部的调试模式下运行
- 将嵌套函数声明为
可使其在调试模式下工作李>inline
- 启用
选项可使其再次工作优化代码
- 不在
中使用嵌套函数也有帮助seq
如果尚未修复,我建议您在microsoft.com的fsbug上提交一份bug报告。我想知道是否发生了括号错误,它认为您正在执行
getAuthorizedItems(Directory.GetFiles dir)
,这将导致观察到的行为,但我只能这么想of@JohnPalmer,我认为这不会导致观察到的行为。它甚至不会编译。@John:svick是对的。起初我也有同样的怀疑,并尝试了一下。当然,它不会编译。你描述的行为并不是我的行为。您的代码似乎工作正常,调试器没有中断。@svick:这很奇怪。我可以用几种不同的解决方案重现它。代码必须位于项目中,而不是fsi;)在调试模式下,使用“公共语言运行时异常:抛出=false,用户未处理=true”,并且必须针对具有受限访问权限的文件夹进行测试,例如“C:\Users\mycompany”。无论如何,感谢您的测试。我已经安装了VS2010 Premium Sp1,因此service pack不是错误的原因。通过内联绕过这个bug是一个很好的解决方法。所以这个bug仍然出现在当前的F#版本中。请慢慢报告:)@pad,我在VS2010中试用过,但我也安装了VS11DP和.Net 4.5 DP。
let getAuthorizedItems getItems dir =
try getItems dir
with ex -> [||]