1

我正在使用 C# 和 MonoDevelop 在 Monotouch 中制作 iOS 游戏。我有一个非常奇怪的崩溃。

背景信息:制作 2D 战争游戏。我已经实现了Dijkstra 的算法来计算从源到目的地的最短路径,中间有对象(例如:从这里到那里,但自动绕过汽车/树木/建筑物/或任何挡路的东西)。我的崩溃似乎与我为这个 Dijkstra 算法的实现创建的二维字节数组有关。如果您从未听说过 Dijkstra 的算法,请查看此图片http://en.wikipedia.org/wiki/File:Dijkstras_progress_animation.gif

基本上,我的2D 数组中的节点越多,士兵在战场上的动作就越详细。如果我在二维数组中使用 2,400 个节点,则一切正常/加载正常。但是,如果我将节点数增加到 4,266 以获得更详细的坐标,则程序在计算节点距离时会崩溃。它在崩溃之前完成了大约 30%。

有关崩溃的更多详细信息: 它仅在我使用 Debug/iPhone 模式或 Release/iPhone 模式时才会崩溃。当我使用调试/iPhone 模拟器时,它工作正常。还有一点需要注意的是,当我构建应用程序并使用 Debug/iPhone 模式将其传输到我的手机时,然后停止调试器,打开 XCode Instruments,它工作正常!我不知道为什么它可以在模拟器和 XCode Instruments 中工作,但不能在 Monodevelop Debug/iPhone 模式下工作。XCode Instruments 是否正在做一些“修补”问题的事情?还是 MonoDevelop 的调试器正在做一些事情来“破坏”程序?

这是在 XCode Instruments 中运行的程序的屏幕截图:

让我解释一下您在屏幕截图中看到的内容。我的应用程序被称为“战争游戏”。查看时间线,CPU 使用率约为 100%,从大约 2 秒到大约 35 秒。当 CPU 使用率下降到零时,它就完成了加载。因此,加载 2D 节点数组并用距离填充它们实际上花了大约 33 秒。

请记住,在这种情况下,崩溃有 4,266 个节点,这意味着 2D 数组是一个字节 [4266, 4266] 数组。所以这是二维数组中的 18,198,756 个字节。并且在 XCode Instruments 运行时加载成功,在 MonoDevelop 的 Debug/iPhone Simulator 中运行时加载成功。但在我的 iPhone 4s 上以 Debug/iPhone 模式运行时,它会崩溃且没有错误消息。从屏幕截图中可以看出,此应用程序的内存使用量约为 60.73MB。

在没有崩溃的实例中,有 2,400 个节点,这意味着 2D 数组是一个字节 [2400, 2400] 数组。所以这是 2D 数组中的 5,760,000 字节。那个在任何地方都工作得很好。

问题显然是,当我将节点数增加到大约 4,266 或更多时,程序崩溃了。但我没有收到错误消息,它只是在加载时突然停止...... 这可能是垃圾收集问题吗? 你会认为我会收到一条错误消息吗? 这可能是“内存不足”问题吗? 但是当它使用 XCode 的 Instruments 加载时,它说我只使用了 60MB,而且我之前在这个应用程序中使用了多达 150MB 作为测试,所以我知道在它崩溃之前我至少可以达到 150MB 的内存使用量“内存不足错误”。

这是 XCode Instruments 的内存分配截图 这是 XCode Instruments 的内存分配截图

这是 XCode Instruments 的内存泄漏页面截图 这是 XCode Instruments 的内存泄漏页面截图

4

1 回答 1

1

这很奇怪。它看起来像一个调试器错误,可能是使用调试器时内存不足的情况(因为这将需要比正常构建更多的内存)。

但是,您应该能够手动启动发布构建而不会出现问题......就像使用 Xcode 的 Instruments 一样。

我怀疑有不止一个问题在起作用。例如,启动您的应用程序需要很长时间,并且看门狗会杀死它(用于发布构建)。从 Xcode 的 Instrument 开始时这仍然有效,因为它会使看门狗静音。

如果没有更多信息(不适合stackoverflow),我无法更精确。我建议您打开一个错误报告并附上调试版本(由 MonoDevelop 启动)和发布版本(手动启动)的崩溃日志。

于 2012-11-26T19:04:27.083 回答