Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在c#中从上次运行状态进行调试?_C#_.net_Serialization - Fatal编程技术网

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

如何在c#中从上次运行状态进行调试?,c#,.net,serialization,C#,.net,Serialization,我正在调试一个c#应用程序。它有两个部分。第一部分做了大量的计算,几乎需要1个小时。然后它将在第二部分调用一个方法,在这里我得到一个异常。我想调试异常。异常发生后,应用程序崩溃。因此,每次我完成调试过程时,我都要等待1小时进行初始计算。有什么方法可以防止这种情况发生,比如保存状态或其他什么,这样我就可以从这一点继续调试了吗?我没有意识到“保存状态”。 程序在内存中。 您需要将输入保存到磁盘,然后读取输入。 如果某些输入是对象(不是值),则需要序列化这些对象。 如果您的输入只是值,那么您可以在调

我正在调试一个c#应用程序。它有两个部分。第一部分做了大量的计算,几乎需要1个小时。然后它将在第二部分调用一个方法,在这里我得到一个异常。我想调试异常。异常发生后,应用程序崩溃。因此,每次我完成调试过程时,我都要等待1小时进行初始计算。有什么方法可以防止这种情况发生,比如保存状态或其他什么,这样我就可以从这一点继续调试了吗?

我没有意识到“保存状态”。
程序在内存中。
您需要将输入保存到磁盘,然后读取输入。
如果某些输入是对象(不是值),则需要序列化这些对象。

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

即使您的一些输入是对象,您也可以通过硬代码创建对象并分配值。但是,如果某些值仅通过运行长计算来分配,则这不是一个选项

调试异常有什么问题?

您不知道哪一行正在抛出异常吗

您想做的是可能的,但是我建议将长步骤与短步骤分开,这样您就可以单独运行它们,有关详细信息,请参阅

如果您需要对程序进行任何更改,如果您需要修改的DLL或EXE已加载到内存中,则以下技巧将不起作用,但这可能会对您有所帮助。您需要做的是结合使用虚拟机和


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

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

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

然后,您应该能够使用WinDbg或visualstudio等工具在进程崩溃时的状态下反复调试进程


尽管如此,我始终发现调试内存转储充满了困难。如果您可以修改程序,将长时间运行的计算结果保存到磁盘,并在以后读取以再现崩溃,我将首先尝试。

单元测试!模拟结果数据,而不是等待它被计算。相关?当然,您只需在两个步骤之间保存(例如写入文件)信息。Courser您需要对每个步骤进行单独的功能测试,围绕它们进行一些像样的单元测试将是一件好事。虽然它可能无法解决您的所有问题,但您可能希望购买一个支持Visual Studio的版本,以帮助找出导致错误的原因。