您已经发货,断言被关闭,您收到一个罕见的崩溃报告,指示代码中发生了空指针冲突。在开发环境中,问题将被断言所捕获。
您所拥有的只是一份崩溃报告,因此重现该问题几乎是不可能的。追踪回溯并没有提供任何有关崩溃为什么首先发生的线索。
选项:-添加指针检查以防止崩溃。这样可以防止崩溃,但是您可能甚至根本不知道为什么会发生崩溃。-让它飞起来,希望它在repro场景下再次发生
假设该应用程序不适合引导导弹或自动制动系统...
您会选择哪一个?
您已经发货,断言被关闭,您收到一个罕见的崩溃报告,指示代码中发生了空指针冲突。在开发环境中,问题将被断言所捕获。
您所拥有的只是一份崩溃报告,因此重现该问题几乎是不可能的。追踪回溯并没有提供任何有关崩溃为什么首先发生的线索。
选项:-添加指针检查以防止崩溃。这样可以防止崩溃,但是您可能甚至根本不知道为什么会发生崩溃。-让它飞起来,希望它在repro场景下再次发生
假设该应用程序不适合引导导弹或自动制动系统...
您会选择哪一个?
Answers:
我选择了第二种方法。如果在崩溃发生时NULL指针是意外的,则隐藏崩溃是没有意义的。在大多数情况下,此NULL指针只是其他错误的症状之一。如果我们使用NULL指针将其隐藏,请检查几乎可以确定是否有其他东西会损坏。如果您知道每次崩溃的地点,而不是在某个随机的地方,我觉得您有更好的机会抓住这种情况。
崩溃多久发生一次?在某种晦涩的情况下,这种情况只发生在众多客户中吗?有什么后果(数据丢失,系统崩溃)?如果在一百万个案例中每1个事件发生一次,而他们只需要重新启动应用程序并且没有数据丢失,那么您可能就不需要修复它-像这样保留它。
添加断言并将其发送给所有客户的成本(时间和金钱)有多昂贵(如果只有一部分客户获得了新版本,那么其余客户可能会陷入未检查的null问题)?发现问题的机会是什么?如果您只是在代码中进行随机检查以希望捕获错误,那么这是一个不好的做法...
问题可以在客户的机器上重现吗?您可以访问该机器吗?这可能真的很有价值
查看您的崩溃报告,并确保所提供的信息有用,并且可以帮助您诊断问题
在开发环境中,问题将被断言所捕获。
按照特定的顺序,它会被捕获并修复,但是从未捕获到当前的跟踪。
您应该能够看到故障转储出了什么问题,是否检查了参数等等?
可以根据您要投入的时间来完成这些额外工作:
存档崩溃转储,并在代码中对其进行了注释,并在崩溃的行上添加了注释,
这使检查非常相似的崩溃转储的人员可以知道它已经发生过……
[花费的时间:短]
其他检查,日志记录,... 您想阻止它并在下次获得更多信息。
[花费时间:中]
空指针冲突发生在您的代码中。
检查是否不可能以这种方式调用应用程序来发生这种违规情况。
[花费的时间:长]
这些天来,我在assert()打开的情况下发货。它的成本不高,在敌对的情况下可以使生活变得更加轻松(即,客户的环境通常比开发或QA环境更具敌意)。