【发布时间】:2018-07-25 16:38:17
【问题描述】:
我们的软件应用程序在客户的系统上随机崩溃。坏事是我们无法重现我们这边的崩溃。客户向我们发送了日志文件和转储文件,通过分析我们认为崩溃是由某些堆对象的过早删除引起的。但是我们无法找到这些堆对象被删除的位置。我的问题是是否有办法确定哪个函数删除了一个堆对象。由于我们可能需要在客户的系统上运行它,因此该解决方案不应过多地降低效率。
应用程序是用原生 C++ 编写并在 Windows 7 中运行。堆对象被包装在智能指针中,并由多个线程创建和使用。
【问题讨论】:
-
我想知道如果您使用智能指针,您是如何结束过早删除的? (如果您还没有这样做,我要做的第一件事是 grep 关键字
delete的所有源代码,并确保没有人做错了(tm)。即在使用智能指针的应用程序中delete关键字不应出现在任何地方) -
请阅读stackoverflow.com/help/how-to-ask。我们需要更多信息来帮助您。
-
请注意,如果您的代码库中的某个地方有人/某物正在写入无效/未分配的内存地址并设法覆盖一些堆的元数据,从而破坏堆,则您可能会遇到类似的崩溃而不会过早删除。 valgrind 通常是您追踪此类损害的朋友...
-
我想对@JeremyFriesner 所说的添加一些内容。在所有者线程释放该对象之后,线程可能会写入该对象。
-
@Jeremy Friesner 这些类的析构函数都受到保护。
标签: c++ multithreading debugging heap-memory heap-corruption