变量周围的 C++ 堆栈已损坏

标签 c++ xml com stack

我遇到了 this错误,我看到 its相反 popular

这个问题比较困惑。我试图找出哪个变量没有正确返回。这个问题是在将 VC6 项目移植到 VS 2012 时发现的。这里发生的是从数据库中获取记录集并将其转换为 XML。

CGenAction GenAct(lUserId, O_ALARM, A_GET_TREE, ppALResult)
{
    try
    {
        if (GenAct.BeginAction())
        {
            checkuserPremission(info);

            Result Res;
            Dynaset DynaSet;

            if (type.GetRecordSet(UserId, DynaSet, Res)) {
                turnToXml(DynaSet,Res.m_bstrXMLString);
            }

            returnToUI(Res);
        }
    }
}

在我知道这种类型的错误之前,我尝试将 ResDynaSet 放在堆中而不是堆栈中,方法如下:

static Result * ResPtr = NULL;

if(ResPtr != NULL)
{
    delete ResPtr;           
}

ResPtr = new Result();

这对解决问题没有帮助。以下变量周围的堆栈已损坏:ResDynaSet 我将尝试进一步缩小范围并尽快更新问题。

最佳答案

这是一个非常可靠的诊断,VC6 没有。错误警告的可能性为零。请注意,在您移植之前,这个问题很可能已经存在于您的代码库中。它警告的错误是一个非常严重的错误,通常在没有帮助的情况下极难诊断。然而,它不一定是致命问题,它可以在代码中潜伏很长时间。只是突然弹出并通过一个看起来非常无辜的代码更改造成严重破坏。只需使用 Release build设置重建您的程序就足够了,这使得诊断问题变得更加困难。

您的代码片段太不透明,无法说明原因,未记录的函数很可能会导致它。我将只描述诊断的工作方式,以便您调试它。

/RTC 调试选项导致编译器在堆栈帧中分配局部变量,因此它们之间有一个空格。它会生成一个表来标识这些空间。在函数入口处,这些空间用值 0xcc 填充。在函数退出时,它运行一个调试函数,遍历表并检查这些空间是否仍然包含 0xcc。如果没有,您将得到一个非常可靠的指示,表明代码正在写入它不应该接触的堆栈帧位置。堆栈缓冲区溢出是一种可能性,还有其他可能性。

调试方法是使用Debug + Windows + Memory + Memory 1窗口。在函数的第一条语句处设置断点。命中时,将EBP放入地址框,向上翻页(注意栈向下增长)。您现在正在查看堆栈帧中的字节,切换到 4 字节 View 通常是最好的。尝试将局部变量与您看到的值相匹配。您还应该看到填充变量之间空格的 0xcc 值。现在开始单步执行,使用调试器的 StepOver 命令。堆栈帧中更改的值显示为红色。尝试找到之前是红色且包含 0xcc 的那个。

你现在有一个被破坏的字节的地址。重新启动并使用数据断点让调试器在破坏该字节的语句处停止。

关于变量周围的 C++ 堆栈已损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16187481/

相关文章:

c++ - 使用原始套接字 (c++)

java - 不匹配的输入异常 : Cannot deserialize instance of `java.lang.Integer` out of START_OBJECT token

com - DllRegisterServer的使用

com - CLSIDFromProgID() 在注册表中的哪里查找?

c# - 在哪里可以找到有关 C# MSTSCLib 的文档,特别是 MsRdpClient 类?

c++ - 结构数组和新建/删除

c++ - 排序 vector 不起作用

c++ - MSVC 如何优化静态变量的使用?

android - 卡片 View : How do I add a gradient background while maintaining the radius

xml - 如何在 DTD 上声明具有相同名称(在 XML 上)的元素?