如何在c#中调试上次运行状态

本文关键字:运行 状态 调试 | 更新日期: 2023-09-27 17:50:12

我正在调试一个c#应用程序。它有两部分。第一部分做了大量的计算,大约需要1个小时。然后它会在第二部分调用一个方法,在那里我得到了一个异常。我想调试这个异常。异常发生后,应用程序崩溃。所以每次我启动调试过程,我都必须等待1个小时来进行初始计算。有没有什么方法可以防止这种情况,比如保存状态之类的,这样我就可以从这里继续调试了?

如何在c#中调试上次运行状态

据我所知,没有"保存状态"。
程序在内存中。
您需要将输入保存到磁盘,然后再读取输入。
如果某些输入是对象(而不是值),则需要对对象进行序列化。
.NET框架中的对象序列化

如果你的输入只是值,那么你可以在调用失败的方法时硬编码这些值。

即使你的一些输入是对象,你也可以硬编码创建对象和硬编码赋值。但是,如果一些值只能通过长时间的计算来赋值,那么这就不是一个选择。

你在调试异常时遇到了什么问题?
您不知道哪一行正在抛出异常吗?

您想要做的是可能的,但是我建议将长步骤从短步骤中分离出来,以便您可以分别运行它们,有关更多详细信息,请参阅Blam的回答。

如果你需要对程序进行任何更改,如果你需要修改的DLL或EXE已经加载在内存中,下面的技巧将不起作用,但也许这将帮助你。你需要做的是使用虚拟机和远程调试器的组合。

在您选择的软件中创建一个虚拟机,并在VM映像上安装远程调试器。运行您的程序,直到它几乎完成了长部分,然后根据您正在使用的任何VM软件的说明对VM进行快照。现在,当您想要调试最后一部分时,只需重新加载快照,将Visual Studio附加到远程调试器上,然后您就可以从预设置状态开始监视应用程序了。

您可以在程序崩溃时生成内存转储。

例如,在Windows 7上,你可以在任务管理器中右键单击该进程,然后选择"创建转储文件"。请确保在关闭任何崩溃对话框等之前执行此操作。

你应该能够使用诸如WinDbg或Visual Studio之类的工具来重复调试进程,使其处于崩溃时的状态。

说,我总是发现调试内存转储充满了困难。如果您可以修改程序以将长时间运行的计算结果保存到磁盘上,并在稍后读取它以重现崩溃,我将首先尝试。