gpt4 book ai didi

c++ - Mavericks 上无意义的 C++ 和 Objective-C++ 崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:35:06 25 4
gpt4 key购买 nike

我有一个大型 Mac 应用程序,一次可以运行几天,对大型数据集进行操作。它是 Objective-C++ 和 C++ 的混合体。它在 Mountain Lion 上运行良好,但在 Mavericks 上运行大约 10 到 20 分钟后(其中分配和销毁了数百万个对象),它崩溃了。它的行为就好像它因无效指针而崩溃(即在已删除的 C++ 对象上调用函数),但它指向的对象处于完全没有意义的状态。

我所有的 C++ 类都继承自一个公共(public)基类,其中的构造函数如下所示:

MyClass::MyClass()
{
mCreated = 12345; //int member variable set here and NEVER TOUCHED AGAIN.
//other initialization stuff
}

当它崩溃时,调试器显示在坏对象中,mCreated 的值为 0。它的行为就好像该对象从未运行过它的构造函数一样!

我不认为这是内存踩踏,因为这个值永远不会是 0 或其预期值以外的任何值,并且对象中的其他字段都没有看起来像内存踩踏所期望的垃圾的值。

我也试过在打开涂鸦的情况下运行,0x5550xaaa 值没有出现在任何地方。我也尝试过 Guard Edges。

深入调查没有发现任何问题。坏对象甚至不总是同一个类。我能想到的是,Mavericks 中的新内存内容(压缩未使用的内存)导致了一些新行为(可能是一个错误,或者可能是一些以前未知的、大部分未强制执行的规则现在真的很重要)。

有人见过类似的东西吗?或者有谁知道在 Mavericks 下会更强烈地应用任何几乎未知的内存规则?

最佳答案

我认为您对无效指针的怀疑是正确的。它可能是指向已删除对象的指针,也可能是垃圾指针。任何一个都与 mCreated 成员一致,与您预期的不同。在删除对象的情况下,内存可以用于其他用途,因此可以设置为其他值。在垃圾指针的情况下,您没有指向任何曾经是您的类的实例。

我不知道 Allocations 工具对 C++ 对象的工作情况如何,但您可以尝试在其下重现崩溃。当它在调试器中停止时,获取 this 指针,然后从 Instruments 获取该地址的历史记录。

如果 Instruments 不起作用,您可以设置 MallocStackLoggingNoCompact 环境变量。然后,当它在调试器中停止时,检查 this 指针并使用以下命令查看该地址的历史记录:

(lldb) script import lldb.macosx.heap
(lldb) malloc_info --stack-history 0x10010d680

(当然,使用this地址代替0x10010d680。)

或者,您可以使用 malloc_history来自 shell 的命令来调查历史,如果在 LLDB 中这样做很麻烦的话。

关于c++ - Mavericks 上无意义的 C++ 和 Objective-C++ 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20108595/

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