gpt4 book ai didi

c++ - 因未执行的代码而崩溃

转载 作者:太空宇宙 更新时间:2023-11-04 14:18:05 24 4
gpt4 key购买 nike

我正在为商业软件调试插件。应用程序在按下退出按钮后立即崩溃。这些崩溃出现在 windows vista 64 sp2 或 vista 32(不记得是不是 sp)上,但不会出现在 windows xp sp3 上。根据应用程序生成的崩溃日志,我似乎遇到了一些堆问题,所以我在激活页面堆的情况下进行调试。

几乎是从头开始,我使用了一个插件示例代码,并在其中逐渐添加了我的代码。我的插件添加了一个创建我的工具的按钮。工具和按钮是两个独立的 COM 对象。按钮总是被创建,但工具对象只有在我按下按钮时才会创建。现在,我在工具部分添加了一些代码,代码没有执行,甚至没有创建工具对象,但程序崩溃了。如果没有那部分代码,它就不会。它似乎不依赖于那部分代码,当我对其进行注释并在其他地方添加一些代码(不会执行)时,程序以同样的方式崩溃。

adplus 告诉我:损坏的堆指针或使用了错误的堆xx :调用中使用的堆xx : 堆 block xx : block 大小xx : 拥有 block 的堆

我可以从什么想法或调试策略开始?

谢谢。

最佳答案

提供代码示例总是有帮助的。

堆损坏真的很棘手,因为即使它是错误的也可能检测不到。因此,虽然您可能会以一种方式持续崩溃,但这并不意味着它在您没有崩溃时没有损坏。

无法附加的崩溃可能是由于静态初始化造成的。当您的 DLL 被附加时,我会尝试手动初始化这些类型的资源。分离 DLL 时删除资源,并将指针设置为零。具有处理此问题的“主要”静态函数,您可以介入。

您可能还对静态的初始化顺序进行了假设,这丝毫没有保证。更糟糕的是,它们会在很长一段时间内表现得相对一致,然后由于某种根本不明显的原因在看似随机的时间中断。

COM 对象的另一种可能性是您的二进制兼容性不再与调用代码期望的接口(interface)匹配。如果您实现的接口(interface)不是纯虚拟的,这可能特别出乎意料。如果接口(interface)有任何具有默认实现的方法,您需要覆盖它们。

struct foo_base {
virtual ~foo_base() {}
virtual std::string getName() const {
return "Willem Dafoe";
}
};

struct foo_derived : public foo_base {
virtual ~foo_derived() {}
};

即使这是完全有效的 C++,它也不能作为 COM 对象工作。

如果您对血淋淋的细节不感兴趣,请为仅调用基础的虚拟方法添加一个实现。

struct foo_base {
virtual ~foo_base() {}
virtual std::string getName() const {
return "Willem Dafoe";
}
};

struct foo_derived : public foo_base {
virtual ~foo_derived() {}
virtual std::string getName() const {
return foo_base::getName();
}
};

我个人从未见过堆损坏消息,但我见过它调用带有垃圾指针的方法。如果您尝试释放它,我可以看到它可能在何处被检测为堆损坏。

关于c++ - 因未执行的代码而崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9687439/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com