调试 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# 时如何单步说明?的主要内容,如果未能解决你的问题,请参考以下文章