我们的软件应用程序随机崩溃在客户的系统上。糟糕的是,我们无法重现我们身边的崩溃。客户通过分析我们认为崩溃是由过早删除某些堆对象引起的,向我们发送了日志文件和转储文件。但我们无法找到这些堆对象的删除位置。我的问题是,是否有办法确定哪个函数删除堆对象。由于我们可能需要在客户的系统上运行它,因此解决方案不应该过多地降低效率。
应用程序使用本机C ++编写,并在Windows 7中运行。堆对象包含在智能指针中,并由多个线程创建和使用。
答案 0 :(得分:0)
我的问题是,是否有办法确定哪个函数删除堆对象。
你不是编写应用程序的团队吗?你应该知道哪些函数做了什么,如果你没有,那么阅读文档,如果没有,那么阅读代码。
现在手续已经不在了,我很同情。这些事件的发生可能是一种真正的诊断痛苦,特别是考虑到可能需要在客户系统上进行复制的敏感性。您的第一步是将转储文件加载到调试器中并彻底检查系统状态。你最好的开发者需要注意意外的线索,这些线索会在他们的蜥蜴脑中引发“尤里卡”时刻,这会让他们看到一些意想不到的系统状态,尽管如此,他们仍然认为这是远程可能的。如果那不发生,那你就是SOL tbh。
杰里米也提出了一些好主意。现在无法保证运行valgrind会显示问题,但如果 在您的代码库中存在系统性问题,那么在valgrind上进行彻底的测试可能会揭示它。通过运气和人类启发式方法,您可以充满信心地确定问题是导致客户崩溃的原因。但是......你已经在发布检查中进行了valgrind测试,对吧......?
还有什么......嗯......你问跟踪。你不能只是翻转一个开关来获得你想要的东西 - 你必须创建然后在你的应用程序中激活一些高度冗长的调试模式,这必然会影响性能,如果问题是罕见/意外的,它会听起来,你可能要运行这个东西好几个月了。可能不是很可行。
最后,为了覆盖所有基础,通过静态分析器运行代码(再次,如果你还没有),检查真正的明显的错误。不要期待太多,但有时候当有人编写代码时,它有时会导致快速获胜。 CppCheck有它的时刻(虽然如果我是诚实的话,它也可以是一个dingleberry)。
祝你好运!