矢量& Stack Overflow - Part Deux

时间:2012-07-24 07:50:46

标签: c++ animation vector

这与我之前的问题有关; Vector & Stack Overflow

但希望能够解释新情况(以及我的新问题)。 所以昨天我以为我在这个堆栈溢出异常中有突破,我以为我已经解决了它。虽然当时我很累,并且有很多代码被注释掉了。

今天早上,重新开始我的比赛,我开始让一切恢复正常。我大约半小时前的绝望,来到我昨天已经克服的说出血腥的错误信息:/。

唉,我回到第一个方向,但是回到我之前的问题的答案,我正在寻找找到我认为是敌人动画的根本原因。下面是我对敌人的头文件&动画类:

Anim - http://pastebin.com/uKQB1RVq

敌人 - http://pastebin.com/pktA1vXi

正如你在我的敌人课上所看到的那样,除了动画之外,没有任何值得讨论的东西,我觉得会引起这种异常。 (唯一的另一件事是我的Timer类,这只是几个整数和bool,再没有什么我可以考虑的内存广泛。)

所以我的问题是这个;

  1. 我怎么能100%肯定这个?在我的IDE(Visual C ++ 2010)中是否有办法查看正在使用多少堆栈内存?
  2. 从q领先。 1,这个问题的解决方案是什么,例如,即使我不是100%确定动画是异常的实际原因,也可以对动画进行评论并说创建一个动画矢量可以很好地编译。这会是要走的路吗?
  3. *我已经设置了测试场景,我知道如果我减少Vector2的数组并使用普通的旧4动画调用RectArray是15而不是20(只是说这些是简单的结构,包含普通旧x& y的整数,然后是x,y,width& height )游戏编译很好(这很可能是我倾向于动画类的主要原因),如果我可以测量它使用了多少堆栈内存然后将其与创建动画矢量数组的内容进行比较,那么我希望能够很好地调用这个问题是否更重要的是真正的问题,或者是否是其他问题。

    编辑: 所以进一步调查我的溢出,我正在调查我的游戏的拆卸信息。堆栈溢出特定指向发生溢出的特定地址; 的 0000005 即可。

    搜索该地址,我看到我来到这个观点; enter image description here

    我真的不知道该怎么做这些地址中的内容,当我将鼠标悬停在它上面时,我得到的只是一个非常大的数字。我只能说有很多这些“???”但我想这些可能意味着什么。

1 个答案:

答案 0 :(得分:1)

正如您在上一篇文章的回答中所提到的,基本上有三种方法可以获得Stack Overflow错误。

  1. 无限递归。这很容易确定 - 只要检查所有递归函数,如果它们正常工作并且在某些情况下总是会终止。

  2. 在堆栈上分配巨大的变量。这实际上连接到第一个问题 - 发生递归堆栈溢出,因为堆栈上没有空间用于另一个递归调用的局部变量。它也很容易确定 - 你必须使用许多(或很少但很大)静态分配的数组(编译时已知的大小)或结构来引起问题。

  3. Bufer overrun。这是追踪的最糟糕的噩梦,因为实际问题可能在其原因之后发生很久。

  4. 我建议尝试通过以下方式解决问题。

    • 尽可能多地注释掉代码,但问题仍然存在。如果你很幸运,你会将这个地方注释掉,这实际上会导致问题。否则,您将需要更少的代码进行分析。
    • 使用WinDbg(在平台SDK中提供)在崩溃时获取详细的调用堆栈。您可以将以下条目添加到系统注册表以强制操作系统将部分或完整的进程内存转储收集到文件中,以便您可以尝试执行事后分析:

    Windows Registry Editor Version 5.00

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\YourAppName.exe] "DumpFolder"=hex(2):63,00,3a,00,5c,00,44,00,75,00,6d,00,70,00,73,00,00,00 "DumpType"=dword:00000002 "DumpCount"=dword:0000000F

    每次应用程序崩溃时,此更改都会对c:\ dumps文件夹进行完全转储。

    Windows Registry Editor Version 5.00

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\YourAppName.exe] "DumpFolder"=hex(2):63,00,3a,00,5c,00,44,00,75,00,6d,00,70,00,73,00,00,00 "DumpType"=dword:00000001 "DumpCount"=dword:000000FF

    每次应用程序崩溃时,此更改都会对c:\ dumps文件夹进行小型转储(~40 Mb)。

    • 使用Application Verifier工具跟踪潜在的缓冲区溢出,这可能会损坏存储在堆栈中的返回地址。

    • 为您的结构和类的一些重要字段添加警卫,即:

    const char * sentry1 = "0123456789";
    void * vitalField;
    const char * sentry2 = "0123456789";
    

    特别是在类,结构和方法的开头和结尾使用它们。使用调试模式确保优化器不会优化它们(如未使用)。

    崩溃后,收集内存转储并尝试检查,如果你的所有警卫都没有改变(这可能很困难,但并非不可能)。

    • 最后,您可以进行非常详细的代码审查,以确保不会发生缓冲区溢出。

    <小时/> 修改:

    您可以通过以下方式使WinDbg转储测试更加自动化:

    • 设置以下环境变量:

    _NT_SYMBOL_PATH=symsrv*symsrv.dll*c:\symbols*http://msdl.microsoft.com/download/symbols

    它将由WinDbg,Visual Studio和Process Explorer

    使用
    • 在WinDbg目录中创建以下文件:

    commands.txt中

    .sympath+.
    .reload
    kb

    • 将以下条目添加到您的注册表中(检查您的系统是32位还是64位并在必要时进行更改):

    Windows Registry Editor Version 5.00

    [HKEY_CLASSES_ROOT.dmp] @="Debugger.Dump"

    [HKEY_CLASSES_ROOT\Debugger.Dump]

    [HKEY_CLASSES_ROOT\Debugger.Dump\Shell]

    [HKEY_CLASSES_ROOT\Debugger.Dump\Shell\Debug_Without_Remote] @="WinDbg This Dump"

    [HKEY_CLASSES_ROOT\Debugger.Dump\Shell\Debug_Without_Remote\Command] @="\"C:\Program Files\Debugging Tools for Windows (x64)\windbg\" -z \"%1\" -QY -c \"$<C:\Program Files\Debugging Tools for Windows (x64)\commands.txt\""

    祝你好运:)