65.9K
CodeProject 正在变化。 阅读更多。
Home

Project Hoshimi 中的测试、跟踪和调试

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.25/5 (3投票s)

2007年5月11日

6分钟阅读

viewsIcon

30099

downloadIcon

152

了解如何使用 Visual Studio 跟踪和调试您的 Project Hoshimi 程序

Testing, tracing and debugging in Project Hoshimi

引言

Project Hoshimi 是 Imagine Cup 挑战赛的一部分。 Imagine Cup 是世界顶级的学生技术竞赛。2006 年,来自 100 个国家的 65,000 多名学生参赛,该竞赛因此被誉为“软件开发奥运会”。

在 Project Hoshimi 中,您需要为一组虚拟的“纳米机器人”制定策略。它们在一个地图(代表人体的一部分)中移动,并通过执行某些操作(如收集 AZN 分子)来得分。然后,您的团队必须在给定的地图上与其他团队进行战斗。就像在电子游戏中一样,您可以使用 2D 或 3D 查看器观看比赛。不同之处在于,在比赛期间您无法与您的机器人互动。您必须在启动比赛之前开发您的机器人的全部行为。

您可以在此处下载 Project Hoshimi SDK: http://www.project-hoshimi.com/downloads.aspx

摘要

在 Project Hoshimi 中,调试非常重要。首先,如果您的程序抛出任何未捕获的异常,您的纳米机器人将停止接收命令,并会自动卡住。因此,您必须非常仔细地处理 null 引用、越界索引等问题。

其次,您可能在 AI 程序中使用非常复杂的算法。由于 Project Hoshimi 的唯一输出是查看器程序,因此很难检查您的程序中的一切是否正常。

在本文中,我将为您提供一些建议,使 Project Hoshimi 的调试和跟踪更加容易。

设置 Visual Studio

第一件事是设置 Visual Studio,使其在生成 DLL 后自动启动 Project Hoshimi。

Setting up Visual Studio

打开项目属性对话框。然后,将输出目录设置为 Project Hoshimi 目录的 players 文件夹。这样,DLL 文件将在生成后自动复制到 players 文件夹中。

接下来,您需要设置 Visual Studio 来启动 Project Hoshimi。如果您不使用 Visual Studio Express Edition,以下方法将奏效:

Setting up Visual Studio

在项目属性中,转到“调试”选项卡,将启动操作选择为“启动外部程序”,并选择 ProjectHoshimi.exe 文件的路径。然后将“启动工作目录”设置为 Project Hoshimi 文件夹(包含 ProjectHoshimi.exe 的文件夹)。这将避免您每次启动 Project Hoshimi 应用程序时都被要求输入用户名。

如果您使用的是 Visual Studio Express Edition,则需要编辑 *.csproj.usr 文件并粘贴以下内容:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <StartAction>Program</StartAction>
    <StartProgram>Path to ProjectHoshimi.exe</StartProgram>
    <StartWorkingDirectory>ProjectHoshimi directory</StartWorkingDirectory>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <StartAction>Program</StartAction>
    <StartProgram>Path to ProjectHoshimi.exe</StartProgram>
    <StartWorkingDirectory>ProjectHoshimi directory</StartWorkingDirectory>
  </PropertyGroup>
</Project>

将“Path to ProjectHoshimi.exe”替换为 ProjectHoshimi.exe 的路径,将“ProjectHoshimi directory”替换为 ProjectHoshimi.exe 所在的目录。

跟踪

了解 AI 程序执行期间发生的情况非常重要。Project Hoshimi 具有日志系统,但它不太方便。我现在将解释如何创建一个更易于使用的日志系统。

首先,添加此 using 指令:

using System.Diagnostics;

然后,添加此 InitLogger 静态函数:

[Conditional("DEBUG")]
public void InitLogger()
{
  Debug.Listeners.Clear();
  Debug.Listeners.Add(new DefaultTraceListener());
  Debug.Listeners.Add(new TextWriterTraceListener("log " +
    DateTime.Now.ToString().Replace(':', '.').Replace('/', '-') + ".txt"));
  Debug.AutoFlush = true;
}

在 Player 类的构造函数中调用它。现在,您可以使用 Debug.WriteLine 静态方法将文本记录到定义的跟踪侦听器中。这里,我有 2 个侦听器:

  • DefaultTraceListener 将记录的文本写入 Visual Studio 的输出窗口。
  • TextWriterTraceListener 将记录的文本写入文本文件。

尝试从程序中的任何位置执行:

Debug.WriteLine("Hello world");

在 Project Hoshimi 的目录中查找格式为“log 30-04-2007 15.31.25.txt”的文件。打开它,您应该会看到“Hello world”。

您可以选择要使用的跟踪侦听器。DefaultTraceListener 在使用 Visual Studio 运行时可能会减慢您的程序速度。TextWriterTraceListener 性能损失很小,并且允许您保留日志。

Debug 类的方法调用仅在设置了 DEBUG 编译标志时才包含在编译文件中。在 Debug 配置中默认设置了该标志,而在 Release 配置中未设置。因此,当您编译 DLL 的最终版本时,只需将当前配置设置为 Release,就不会留下任何文件 IO 访问。

现在,让我们添加一个小函数,该函数会自动将回合数添加到日志文件中:

[Conditional("DEBUG")]
public void LogData(string text)
{
  Debug.WriteLine("[" + this.CurrentTurn.ToString() + "] " + text);
}

此方法不能是静态的,因为它使用了 Player 对象的 CurrentTurn 属性。因此,您需要 Player 对象的实例才能调用它。

这是使用此函数时输出窗口的示例:

Output window

调试

有时,在您的程序中,您可能需要检查一切是否正常运行。为了通知程序执行不正确,您有几种选择。您可以从函数返回不正确的值或抛出异常。在本文中,我们将使用 Debugger.Break()。这将导致程序执行中断,就像有断点一样。当然,在 Visual Studio 外部运行时,您的 DLL 不会中断。

让我们编写以下函数:

[DebuggerHidden]
[Conditional("DEBUG")]
public static void Assert(bool condition, string description)
{
  if (!condition)
  {
    Debug.WriteLine("Assertion has failed");
    if (description != null && description != "")
      Debug.WriteLine(description);
    Debugger.Break();
  }
}
[DebuggerHidden]
[Conditional("DEBUG")]
public static void Assert(bool condition)
{
  Assert(condition, "");
}

假设在您的程序的某个部分,一个整数变量必须为正数或零。您可以使用此 Assert 函数来确保它不是负数。

Assert(i >= 0, "i should not be negative");

在 Debug 模式下,当 i 为正数时,此行将是透明的,当 i 为负数时,调试器将停止,您可以通过 Visual Studio 访问所有局部变量的值,从而简化调试。此外,您还可以检查调用堆栈。

Assertion failing

在 Release 模式下,此代码行甚至不会被编译(因为 [Conditional("DEBUG")] 属性),因此您不会有任何性能损失。此外,此函数可以将消息写入日志。

异常

如果您的程序引发未捕获的异常,剩余的代码将不会执行,您的机器人在此回合中将不会执行任何操作。避免引发未捕获的异常非常重要。

首先,在 Visual Studio 的“调试 / 异常”对话框中打开。确保选中所有 CLR 异常。

Exceptions configuration

在开发期间,我建议不要使用 try / catch 语句,因为您的程序将在任何异常抛出时停止,您将能够进行调试。对于您程序的最终版本,添加一些 try / catch 语句来保护您的程序可能是一个好主意。但请记住,这可能会减慢您的程序。

结论

现在,您应该能够正确调试您的程序了。测试程序的​​好方法是使用 PHAutomate 在多个地图上自动玩多场游戏。然后,您可以研究得分和日志文件,以查找异常行为。

祝您好运!

历史

本文发布于 2007 年 5 月 11 日。

© . All rights reserved.