如何保存Visual Studio C++调试会话的状态?

yacmzcpb  于 2023-10-23  发布在  其他
关注(0)|答案(3)|浏览(199)

使用Visual Studio C++ 2013。我正在运行一个数字处理程序,所以它是线性/可预测的。然而,我有一个测试,需要几个小时的运行,在Assert之前,由于我的代码中的逻辑错误。我可以在崩溃之前获得断点,但我不能后退而不从头开始。
有没有什么方法可以让Visual Studio保存我的程序状态,这样我就可以在那个点重新启动?
程序状态非常复杂,我需要做很多工作才能将所有状态保存到文件中,以便以后恢复。

oo7oh9g9

oo7oh9g91#

在Visual Studio中进行调试时(即使是从断点进行调试),|保存转储为.保存当前调试状态。保存时,请确保选择“Minidump With Heap”,以便可以访问堆内存。
稍后,您可以双击.dmp文件,在Visual Studio中打开它。

wpx232ag

wpx232ag2#

您可以考虑虚拟计算机。您可以制作它们的快照并保存它们。这可能是一个矫枉过正,但保证工作。

bd1hkmkf

bd1hkmkf3#

简单的方法是保存有意义的状态变量作为一个对象,然后将其写入JSON。然后添加一个单元测试,它接受一个输入JSON文件,将其转换(将其转换回对象),然后调用您的方法。
例如,假设你有这样一个类型,你的方法采用这个类型(这是你有意义的状态)

  1. public class MyInputType
  2. {
  3. public Guid ID { get; set; }
  4. public DateTime CreatedDate { get; set; }
  5. public string firstName { get; set; }
  6. public string lastName { get; set; }
  7. public string StudentMajor { get; set; }
  8. }

假设这是SlowMovingClass的输入参数,看起来像这样:

  1. using System;
  2. public class SlowMovingClass
  3. {
  4. public void SlowMethod(MyInputType input)
  5. {
  6. Console.WriteLine("ID: " + input.ID);
  7. Console.WriteLine("CreatedDate: " + input.CreatedDate);
  8. Console.WriteLine("firstName: " + input.firstName);
  9. Console.WriteLine("lastName: " + input.lastName);
  10. Console.WriteLine("StudentMajor: " + input.StudentMajor);
  11. }
  12. }

例如,我们可以修改你的类,读取一个环境变量,看看ShouldLog值是否设置为true。
如果是,那么我们可以将这个.方法的输入值转换为JSON。

  1. //add this line to SlowmovingClass
  2. bool shouldLogJson = bool.Parse(Environment.GetEnvironmentVariable("ShouldLogJson") ?? "false");

然后将这一行添加到要转换并写入JSON的方法的主体中。

  1. if (shouldLogJson)
  2. {
  3. var json = System.Text.Json.JsonSerializer.Serialize(cache);
  4. var path = @"c:\temp\debugCache.json";
  5. System.IO.File.WriteAllText(path, json);
  6. }

完成了所有这些之后,您现在可以编写一个单元测试来获取此缓存值并调用您的方法。然后你就可以跳过所有关于缓慢的对象状态填充过程的内容,直接回到问题的核心。
这些年来,这为我节省了很多时间。

  1. [TestMethod]
  2. public void TestSlowMethod()
  3. {
  4. string json = File.ReadAllText(@"c:\temp\input.json");
  5. MyInputType input = JsonConvert.DeserializeObject<MyInputType>(json);
  6. SlowMovingClass slowMovingClass = new SlowMovingClass();
  7. slowMovingClass.SlowMethod(input);
  8. }
展开查看全部

相关问题