这与我之前的问题有关; Vector & Stack Overflow
但希望能够解释新情况(以及我的新问题)。 所以昨天我以为我在这个堆栈溢出异常中有突破,我以为我已经解决了它。虽然当时我很累,并且有很多代码被注释掉了。
今天早上,重新开始我的比赛,我开始让一切恢复正常。我大约半小时前的绝望,来到我昨天已经克服的说出血腥的错误信息:/。
唉,我回到第一个方向,但是回到我之前的问题的答案,我正在寻找找到我认为是敌人动画的根本原因。下面是我对敌人的头文件&动画类:
Anim - http://pastebin.com/uKQB1RVq
敌人 - http://pastebin.com/pktA1vXi
正如你在我的敌人课上所看到的那样,除了动画之外,没有任何值得讨论的东西,我觉得会引起这种异常。 (唯一的另一件事是我的Timer类,这只是几个整数和bool,再没有什么我可以考虑的内存广泛。)
所以我的问题是这个;
*我已经设置了测试场景,我知道如果我减少Vector2的数组并使用普通的旧4动画调用RectArray是15而不是20(只是说这些是简单的结构,包含普通旧x& y的整数,然后是x,y,width& height )游戏编译很好(这很可能是我倾向于动画类的主要原因),如果我可以测量它使用了多少堆栈内存然后将其与创建动画矢量数组的内容进行比较,那么我希望能够很好地调用这个问题是否更重要的是真正的问题,或者是否是其他问题。
编辑: 所以进一步调查我的溢出,我正在调查我的游戏的拆卸信息。堆栈溢出特定指向发生溢出的特定地址; 的 0000005 即可。
搜索该地址,我看到我来到这个观点;
我真的不知道该怎么做这些地址中的内容,当我将鼠标悬停在它上面时,我得到的只是一个非常大的数字。我只能说有很多这些“???”但我想这些可能意味着什么。
答案 0 :(得分:1)
正如您在上一篇文章的回答中所提到的,基本上有三种方法可以获得Stack Overflow错误。
无限递归。这很容易确定 - 只要检查所有递归函数,如果它们正常工作并且在某些情况下总是会终止。
在堆栈上分配巨大的变量。这实际上连接到第一个问题 - 发生递归堆栈溢出,因为堆栈上没有空间用于另一个递归调用的局部变量。它也很容易确定 - 你必须使用许多(或很少但很大)静态分配的数组(编译时已知的大小)或结构来引起问题。
Bufer overrun。这是追踪的最糟糕的噩梦,因为实际问题可能在其原因之后发生很久。
我建议尝试通过以下方式解决问题。
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
使用 commands.txt中
.sympath+.
.reload
kb
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\""
祝你好运:)