Sin*_*nix 10 c# debugging visual-studio
这是一个代码,重现了我期望获得的行为:
static void Main(string[] args)
{
// try // #2
{
string x = null; // #1
AssertNotNull(x, nameof(x));
}
// catch (ArgumentNullException) { } // #2
Console.WriteLine("Passed.");
Console.ReadKey();
}
[DebuggerHidden]
public static void AssertNotNull<T>(T arg, string argName) where T : class
{
if (arg == null)
throw new ArgumentNullException(argName);
}
Run Code Online (Sandbox Code Playgroud)
从VS2008开始的任何VS的行为都是相同的(没有检查早期版本).
如果在调试下运行它(使用标准调试设置),则在修复代码(使用EnC)之前不允许继续.点击F5将重新运行断言,因为[DebuggerHidden]和"Unwind stack on unhandled exception"设置组合(默认情况下启用设置).
要修复代码,只需将#1行替换为object x = "",将下一个语句设置为它并再次点击F5.
现在,为ArgumentNullException启用"thrown thrown"并取消注释标记为#2的行.行为改变:你再次断言断言,但堆栈没有解除(很容易用CallStack窗口检查).F5将从抛出异常的地方继续.
好的,所以...现在的问题是:在打破处理的异常时,有没有办法启用自动堆栈展开?
隐藏VS选项,现有扩展或(可能)API可以在我自己的扩展中使用?
UPD:澄清一个问题:我想在断言失败的情况下中断,用编辑编辑代码并继续,将next语句设置为固定代码并继续执行.
如果异常没有被捕获到堆栈,它可以正常工作.
UPD2由Hans Passant提出:在UserVoice上发表了一条建议.随意投票:)
并取消注释#2 标记的行
这是你问题的关键部分。您改变了不止一件事,关键的改变是您改变了堆栈的展开方式。您喜欢的调试器选项的标题是“在未处理的异常上展开堆栈”。问题是,不再有未处理的异常。您的 catch 子句会处理它,现在由 CLR 展开堆栈。
并且必须由 CLR 执行展开,调试器没有选项在您要求的第一次异常中断时执行此操作。此时 SetNext 就无法工作了。如果我正确地解释了这个问题,你真的很想拥有这个,因为你下一步需要做的是繁忙的工作,单步执行 catch 块并不是巨大的乐趣。
虽然没有实现,但我认为技术上是可行的。但这只是因为我幸福地不知道调试器团队需要做多少工作。这是一个让 E+C 更好地工作的好请求,您可以在这里提出。将您的提案的 URL 作为评论发布,很有可能获得大量选票。我会投票支持它。
| 归档时间: |
|
| 查看次数: |
606 次 |
| 最近记录: |