调试 C# 时如何单步说明?

Posted

技术标签:

【中文标题】调试 C# 时如何单步说明?【英文标题】:How to single step instructions when debugging C#? 【发布时间】:2021-03-30 13:43:02 【问题描述】:

我有一个正在处理的 C# 项目,我正在尝试调试导致未处理异常的问题。问题是每当我放置一个断点并且如果我按下“Step Into”它就会被击中,它只是恢复执行而不是单步执行下一条指令。有谁知道如何逐个执行 C# 指令而不是恢复执行?

我在 Windows 10 上使用 Visual Studio 2019 进行调试。该项目是一个包含多个项目的解决方案,其中主项目是用 C# 编写的,其他项目是用 C++ 和 C 编写的。我能够为 C# 项目成功加载符号。

这里是github repository。

编辑:

我正在处理的项目是一个名为 Mesen 的 NES 模拟器,我尝试调试的问题是在线播放期间未处理的异常。该异常显然是随机触发的,我尝试了多种操作来尝试触发它,但它仍然只是自行发生。

private void StartEmuThread()

    if(_emuThread == null) 
        _emuThread = new Thread(() => 
            try 
                InteropEmu.Run();
                _emuThread = null;
             catch(Exception ex) 
                MesenMsgBox.Show("UnexpectedError", MessageBoxButtons.OK, MessageBoxIcon.Error, ex.ToString());
                _emuThread = null;
            
        );
        _emuThread.Start();
    
    UpdateMenus();

我试图在 InteropEmu.Run() 上设置一个断点并从那里单步执行,但每次我进入它时都会恢复程序。

这是我在 InteropEmu.Run() 上打断点时来自 Visual Studio 的屏幕截图

在我按下调试工具栏顶部的步骤后,它会在此处恢复。

这是我正在尝试解决的异常

谢谢

【问题讨论】:

您是否有机会尝试“进入”不属于您项目源代码的方法? 不,或者至少我不这么认为,但 C++ 项目确实没有任何可用的符号。事实上,只有主项目是用符号编译的,其他的甚至都没有出现在模块列表中。 您是否尝试过显示“异常”窗口(“调试”菜单)并在 CLR 异常旁边打勾,以便 VS 在抛出异常时立即中断/在抛出的行上中断? 是的,调试时我已经转到异常设置并检查了 System.Runtime.InteropServices.SEHException 这是我经常得到的,但它给我的只是导致例外。我已将其注释掉,并将进行更多测试,但我仍然无法单步执行代码。 发布屏幕录像可能会有所帮助。您是否启用了“仅我的代码” 【参考方案1】:

我尝试了一些不同的构建选项,结果发现,对于 Release 构建禁用了单步执行,但对于 Debug 构建则没有。我尝试了一个调试版本,这次成功了。

【讨论】:

以上是关于调试 C# 时如何单步说明?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在启动程序时单步执行每条指令都会崩溃? [调试]

使用 Intellij 的调试器时如何仅单步执行“我的”Java 源代码?

Pycharm中实现单步跟踪

使用IDEA开发,做单步调试速度巨慢,何解?

使用 Eclipse 单步调试 Zephyr 程序

结合Yocto Qemu与Eclipse单步调试开发Linux Kernel