You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

VS2017中异步方法抛异常时,历史调试如何查看本地变量?

如何在异步方法抛出异常时查看本地变量(含历史调试方案)

当然可以通过历史调试来获取异步方法抛出异常位置的本地变量!默认情况下,异步方法抛出异常时,调试器的Locals窗口只会显示当前上下文的异常信息——这是因为异步方法编译后会生成状态机,变量的存储方式和同步方法不同,导致常规调试无法直接回溯到抛出点的变量。下面是具体的解决方案:

一、使用Visual Studio的IntelliTrace(历史调试)

这是最直接的方式,IntelliTrace会记录调试过程中的事件和调用信息,让你回溯到异常抛出前的状态:

  1. 打开Visual Studio的调试设置:点击顶部菜单 Tools > Options > Debugging > IntelliTrace
  2. 勾选「Enable IntelliTrace」,然后选择「IntelliTrace events and call information」(这个选项会记录更详细的调用和变量数据)
  3. 启动调试(F5),当异常抛出时,不要终止调试会话
  4. 打开IntelliTrace窗口:点击 Debug > Windows > IntelliTrace
  5. 在IntelliTrace的事件列表中,找到「Thrown Exception」对应的条目,右键选择「Go to Event」或者直接点击条目,调试器会跳转到异常抛出的位置,此时查看Locals窗口就能看到该位置的所有本地变量了

二、其他辅助调试方案

如果暂时无法使用IntelliTrace,也可以通过以下方式间接获取变量信息:

  • 临时添加日志输出:在异常抛出前,用Debug.WriteLine()或者日志框架把本地变量的值输出到输出窗口,比如:
    public async Task<bool> UpdateDaily(string ticker, bool full = false)
    {
        // 假设这里有本地变量
        var requestUrl = $"https://api.example.com/stocks/{ticker}";
        Debug.WriteLine($"请求URL: {requestUrl}, full更新: {full}");
        throw new Exception("更新失败");
    }
    
  • 调整调试选项:打开 Tools > Options > Debugging > General,取消勾选「Enable Just My Code」,同时勾选「Enable .NET Framework source stepping」,这有时候能让调试器更准确地展示异步状态机中的变量

针对你的代码示例补充

你的示例代码中UpdateDaily方法直接抛出异常,没有定义本地变量,如果你添加一些变量后,按照上面的IntelliTrace步骤操作,就能看到这些变量的值。比如修改后的方法:

public async Task<bool> UpdateDaily(string ticker, bool full = false)
{
    var currentTicker = ticker.ToUpper();
    var updateTimestamp = DateTime.Now;
    throw new Exception($"更新{ticker}失败");
}

启用IntelliTrace后,回溯到异常抛出点,Locals窗口就会显示currentTickerupdateTimestamp的值。

内容的提问来源于stack exchange,提问作者SKK

火山引擎 最新活动