为什么这段代码没有正确执行(视频)?

时间:2011-12-03 04:28:33

标签: c# monodevelop unity3d

我正在使用Unity(3.4)Monodevelop(2.4.2),当我在调试器中逐步执行它时,它没有正确执行代码。这是显示它的视频的链接,请在720p运行并全屏显示...

http://www.youtube.com/watch?v=LGN7kxMUqjA

此外,这里有一些屏幕截图显示调试器在鼠标悬停变量时显示非常奇怪的值。这是在第一个if块中正确显示xSectionPixel的值时的样子... enter image description here这就是它在第二个if块中错误地显示xSectionPixel的值时的样子...... enter image description here
这也是它开始不正确地执行代码的代码行。

导致这种情况的原因是什么?

我尝试使用存储库中的代码的新副本重新安装这些工具,我甚至将它们全部设置在具有不同操作系统(Win 7)的不同计算机上,并且它总是做同样的事情。这不是说它必须是我的代码吗?

值得注意的是,我正在使用SVN从存储库中推送/拉取代码,而我的本地副本存在于我的Dropbox文件夹中。

非常感谢您的智慧!如果你可以发现任何可能破坏事物的东西(也就是我使用浮点数和整数的方式,那么这里也是代码?)

Vector2 textureCoordToHexGridCoord(int textX, int textY)
    {
        Vector2 hexGridCoord = new Vector2();
        float m = hexH / hexR;

        int xsection = (int)(textX / (hexH + hexS));
        int ysection = (int)(textY / (2 * hexR));

        int xSectionPixel = (int)(textX - xsection * (hexH + hexS));
        int ySectionPixel = (int)(textY - ysection * (2 * hexR));

        //A Section
        if(xsection % 2 == 0)
        {
            hexGridCoord.x = xsection;
            hexGridCoord.y = ysection;

            if(xSectionPixel < (hexH - ySectionPixel * m))
            {
                hexGridCoord.x--;
                hexGridCoord.y--;
            }

            if(xSectionPixel < (-hexH + ySectionPixel * m))
            {
                hexGridCoord.x--;
            }
        }

        //B Section
        else
        {
            if(xSectionPixel >= hexR)
            {
                if(ySectionPixel < (2 * hexH - xSectionPixel * m))
                {
                    hexGridCoord.x = xsection - 1;
                    hexGridCoord.y = ysection - 1;
                }
                else
                {
                    hexGridCoord.x = xsection;
                    //hexGridCoord.y = ysection;
                    hexGridCoord.y = ysection - 1;
                }
            }

            if(xSectionPixel < hexR)
            {
                if(ySectionPixel < (xSectionPixel * m))
                {
                    hexGridCoord.x = xsection;
                    //hexGridCoord.y = ysection - 1;
                    hexGridCoord.y = ysection;
                }
                else
                {
                    hexGridCoord.x = xsection - 1;
                    hexGridCoord.y = ysection;
                }
            }
        }

        return hexGridCoord;
    }

6 个答案:

答案 0 :(得分:7)

我对您使用的框架没有具体经验,但我对调试器有很多经验。 您看到的调试器行为可能发生在两种情况之一(我能想到......)

  1. 符号文件和执行代码与源代码不同步,通常IDE会检测到它,但在某些情况下它不会检测到,解决方法是删除所有二进制文件,重新编译并重试。< / p>

  2. 调试器或调试器扩展中的错误(用于在您所处的特定环境中进行调试,即统一/单一开发)。

  3. 如果您无法解决问题,我会在您的代码中添加日志记录并使用它来真正了解会发生什么。

答案 1 :(得分:2)

我在使用WinForms应用程序的MonoDevelop上看到了类似的行为,通过重新安装调试器解决了这个问题。

您是否尝试过或使用Visual Studio验证问题是否在代码中?

答案 2 :(得分:2)

您是否启用了优化功能?如果是这样,那么禁用它们会使步进变得不那么不稳定吗?

启用优化是我能想到的一件事,没有其他人提到过这可能会导致您所看到的内容。

答案 3 :(得分:1)

您可以尝试删除断点,设置新断点并单步执行代码吗?

我问的原因是有些方法可以使用断点设置值。一个非常类似的事情发生在我身上,并确信存在编译器错误。在单步执行CLR和其他一些没有答案的事情之后,我们偶然发现了之前设置用于测试的断点,并且从未删除过。

答案 4 :(得分:0)

当我调试应用程序的多线程部分时,这种行为通常会发生在我身上。

当您同时调试多个线程时,Visual Studio中的调试器会在默认情况下不通知您的情况下在它们之间切换。 现在因为线程没有同时执行相同的行,所以你会意外地“跳转”。

我相信它广泛用于游戏开发,所以在你的情况下你有两个选择:

1)在进行调试时只运行一个线程。

2)进行单元测试&lt; =这是“最佳实践”    您可以先查看NUnit

答案 5 :(得分:0)

第一个问题很可能与JITed代码中的序列点有关。这些是调试器可以停止的点。它们由运行时基于编译器生成的IL和调试符号计算,因此很可能是运行时或编译器错误。我不知道Unity正在使用什么版本的Mono运行时和编译器,但是它已经在新版本中修复了。如果您可以使用最新的官方MonoDevelop和Mono 2.10.x使用“普通”控制台应用程序重现这一点,请在http://bugzilla.xamarin.com处提交一个包含测试用例的错误。如果没有,请让Unity升级他们的Mono版本。

第二个问题在MonoDevelop的表达式解析器中看起来像一个问题,用于解析鼠标下的符号。这可能已在较新版本的MonoDevelop中修复 - 同样,请尝试使用官方MonoDevelop 2.8.4进行重新编辑,如果仍有问题,请提交错误。