Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何确定谁删除堆对象_C++_Multithreading_Debugging_Heap_Heap Corruption - Fatal编程技术网

C++ 如何确定谁删除堆对象

C++ 如何确定谁删除堆对象,c++,multithreading,debugging,heap,heap-corruption,C++,Multithreading,Debugging,Heap,Heap Corruption,我们的软件应用程序在客户的系统上随机崩溃。糟糕的是,我们无法重现我们这边的崩溃。客户向我们发送了日志文件和转储文件,通过分析,我们认为崩溃是由于过早删除某些堆对象造成的。但是我们找不到这些堆对象被删除的位置。我的问题是,是否有办法确定删除堆对象的函数。因为我们可能需要在客户的系统上运行它,所以解决方案不应该过分降低效率 应用程序采用原生C++编写,运行于Windows 7。堆对象包装在智能指针中,由多个线程创建和使用 我的问题是,是否有办法确定删除堆对象的函数 您不是编写应用程序的团队吗?您应该

我们的软件应用程序在客户的系统上随机崩溃。糟糕的是,我们无法重现我们这边的崩溃。客户向我们发送了日志文件和转储文件,通过分析,我们认为崩溃是由于过早删除某些堆对象造成的。但是我们找不到这些堆对象被删除的位置。我的问题是,是否有办法确定删除堆对象的函数。因为我们可能需要在客户的系统上运行它,所以解决方案不应该过分降低效率

应用程序采用原生C++编写,运行于Windows 7。堆对象包装在智能指针中,由多个线程创建和使用

我的问题是,是否有办法确定删除堆对象的函数

您不是编写应用程序的团队吗?您应该知道哪些函数做什么,如果没有,请阅读文档,如果没有,请阅读代码

既然手续已经取消了,我表示同情。此类事件可能是诊断的一大难题,特别是考虑到可能需要在客户系统上复制的敏感性。第一步是将转储文件加载到调试器中,并彻底检查系统的状态。你最好的开发人员需要留意那些在蜥蜴大脑中触发“尤里卡”时刻的意外线索,这些线索指向一些他们仍然认为是遥不可及的意外系统状态。如果那不发生,你就完蛋了

杰里米在上面也给出了一些好的想法。现在运行valgrind并不能保证会发现问题,但是如果代码库中存在系统性问题,那么对valgrind进行彻底的测试运行可能会发现问题。有了运气和人类的启发,您可能能够自信地确定问题是导致客户崩溃的原因。但是作为发布检查的一部分,您已经在进行valgrind测试了,对吧

还有什么。。。六羟甲基三聚氰胺六甲醚。。。你问的是追踪。你不能仅仅通过扳动开关来获得你想要的东西-你必须在你的应用程序中创建然后激活一些非常详细的调试模式,这必然会影响性能,如果问题像听起来那样罕见/出乎意料,你可能需要运行数月。可能不太可行

最后,为了覆盖所有基础,通过静态分析器运行代码(同样,如果您还没有),以检查是否存在明显的错误。不要对此期望太高,但有时当有人编写代码宿醉时,它会带来快速的胜利。CppCheck也有它的时刻(不过,老实说,它也可能有点像一个小麻烦)


祝你好运

我想知道如果你使用智能指针,你怎么会提前删除?(如果您还没有这样做,我会做的第一件事是将所有源代码中的关键字
delete
,并确保没有人做错(tm)。即,在使用智能指针的应用程序中,
delete
关键字不应该出现在任何地方)请阅读。我们需要更多信息来帮助您。请注意,如果代码库中的某个地方有人/某物正在写入无效/未分配的内存地址,并试图覆盖堆的某些元数据,从而损坏堆,则您可能会遇到类似的崩溃,而不会过早删除。valgrind经常是你追查这类损失的朋友……我想补充一下@JeremyFriesner说过的话。有可能是一个线程在所有者线程释放对象后写入该对象。@Jeremy Friesner这些类的析构函数都受到保护。我不是设计和实现该应用程序的程序员之一。这是一个相当复杂的制造自动化应用程序。查看代码对我没有多大帮助。我做了静态代码分析,发现了一些问题。在我们解决了这些问题之后,应用程序看起来更稳定了,但仍然崩溃了。@user3552888:那些程序员还在你的公司工作吗?