偶尔发生错误,但优先级高


16

我正在从事一个CNC(计算机数控)项目,该项目借助激光将形状切割成金属。

现在我的问题是,有时(每20天奇数次要1-2次)切割是否出错,取决于设置的是什么。

但这会造成损失,因此客户对此并不满意。

我试图找出原因

  1. 包括日志文件
  2. 调试
  3. 重复相同的环境。

但不会重复。

暂停并继续操作将再次使其平稳运行,而不会再次出现该错误。

我该如何解决这个问题?我应该将其声明为硬件问题吗?


15
欢迎来到heisenbug的美好世界* 8')
Mark

当您说它在20天内发生1至2次时,是否表示它需要大约20天的时间出现,或者它有时在第1天之后出现,有时在第3天之后出现,等等?
Dunk 2012年

@Dunk尚无具体时机,但到目前为止从未在一周内两次出现。
Shirish12年

@Shirish-我倾向于解决时钟溢出问题,这种问题我没有在系统上好几次出现过,而问题似乎每隔很多天就会发生一次,并且经过进一步检查,恰好每隔几天(或多次)发生一次。
Dunk 2012年

系统暂停时会发生什么情况?哪些内存/计数器/硬件仍在变化?继续的时候呢?似乎在执行这些操作时进行任何更改都可以找出问题的原因。
Dunk 2012年

Answers:


25

工作环境

正如ChrisF所建议的那样,务实的短期解决方案可能是使用暂停和恢复技巧,但是您必须与客户交谈以了解应优先考虑的事项。例如:

  • 如果故障会浪费£1000的零件或每周导致4个小时的停机,而暂停恢复修复会使生产减少1%,则他们现在可能会更喜欢修复。

  • 如果故障每周浪费一次£1零件或导致4分钟的停机,但是暂停恢复修复将生产减少了1%,则他们可能更愿意等待不会影响生产率的修复。

我在激光微加工行业工作了多年,我知道您需要承受多少压力才能优化工艺,并使您的机器每小时生产尽可能多的零件,所以无论哪种方式正确解决问题的压力。

记录中

以我的经验,有效跟踪Heisenbug的唯一方法是大量日志记录。在可能导致错误的代码部分及其周围记录所有内容。了解如何有效地读取日志文件,确保您正在监视电动机上的跟随错误(您的载物台在应该移动的位置移动了?)。查看机器上的内存使用情况,是否是内存泄漏导致关键进程饿死了?

确保您也记录了用户的操作,是否确定操作员没有按下紧急停止按钮,以便他们可以在固定过程中突然冒出烟头休息?我已经看到了这种情况!

静态分析

另外,还要寻找在特定模式的划线与或多或少被触发的错误之间的相关性。如果您找到触发问题的频率更高(或从不触发)的模式,则可能表明您的问题。

尝试使触发问题的模式更加频繁。如果您找到一种可靠地触发问题的方法,那么您就可以找到解决方案的一半。

其他选择

最后,不要很快责怪硬件,但不要以为它是完美的。很多次我被归咎于实际上是电气或机械问题,因此您始终必须将这些问题放在脑后。

即使您通常可能无法使用机器,也请记住,某些问题只能在机器上有效解决。有时,通过远程桌面在现场几天可以花上几个星期,而在离线状态下则可以花上数月。如果您用完了脱机选项,请不要害怕提出现场访问,他们只能说不。

您可能还想看看“ 如何使用heisenbug?”的问题和答案如何处理无法复制的错误?但是这些可能对您的情况没有太大帮助。


还有更多要解决的问题,我没有可用的硬件。而且客户不了解这些编程术语,因此无法远程挂接到其系统上。顺便说一句,谢谢您的建议,请尝试解决。
Shirish12年

6

我将提出一个建议。

转到工厂经理,要求查看发生该故障的时间该工具或该区域的电源线监视器记录。还要问他在那个时候是否有焊接或其他异常活动。

几十年前,我父亲曾经与一台无缘无故崩溃的小型计算机混在一起。他们致电制造商的客户代表。

销售代表来到他们工厂区的办公室,将电压表插入迷你旁边的墙上,然后说:“注意这一点”。

几分钟后,电压表突然下陷,明显地,然后又回来了。代表说:“那是他打击测试弧线。请稍等。” 此后不久,电压表再次下沉,这次保持下垂。

代表说:“那是您的问题。您在工厂车间焊接了一个家伙,而他与您的功率相同。在我走进去时,我看到他正在安装。”

他们必须为办公室运行完全独立的电源。



4

该问题是对用户产生实际后果的真实问题,即工作损坏等,因此需要修复。但是,不必“正确”修复它。您声明:

暂停并继续操作将再次使其平稳运行,并再次出现该错误。

在这种情况下,只需执行此操作即可。即使正常运行时间要花几秒钟,客户也不会在有缺陷的运行中浪费材料,这将使他们感到满意。

显然,从长远来看,你可能需要修正这个“正常”,但暂时削减你的损失,去与解决方法,并获得到别的东西。


4

我在一个游戏中遇到了一个错误,该错误只发生了十亿次。幸运的是,这意味着我每15到30分钟就会看到一次,但是单步调试一下调试器中的代码将无法正常工作。我最终输入了调试消息。他们需要使用精美的if语句,因为我只在出现问题时才需要某些东西。在大多数情况下,调试代码是在常规代码中重复计算,但是使用了不同的技术。重复不必很精确。如果我知道一个数字应始终小于10,000,并且有时看起来会达到150,000,那么我只想检查一个大于100,000的值。每次发生此错误时,我都会研究我的结果,设计更复杂的调试消息(或更准确地说,进行更复杂的检查以查看是否应该显示一条消息),然后等待问题再次出现。

您的周期将比我的周期长很多,但是最终您将解决这个问题。我确实希望您可以通过其他更快的方法找到解决方案,但是如果没有其他措施,最终还是可以找到解决方案的,并且可以让您感觉到您正在做某事,直到您提出一个更好的主意。

(在有帮助的情况下,我最终通过清理最终确定为问题的几行代码解决了我的问题。我发誓它们没什么问题,但是我认为优化器和CPU都在重新排序指令以用于在性能方面,我认为它们有时会偶尔获得一些额外的速度,即使是现在单核也要进行多进程,而且我认为每一次出色的工作都会在寄存器写入之前被读取。我将所有计算都切换为使用局部变量,“实例字段”值从一开始就移至局部变量,而局部值仅在同步块内最后才移回局部变量。方法的返回值,而不是“实例字段”我一直在使用。)


+1用于完整性检查和对日志消息的迭代改进,以收敛于问题的根源。
Mark Booth

1

调试中的规则1第一:您需要可重现的方案

如果您没有,请先进行处理。您是否可以在机器的某种“模拟模式”下重现该错误,而实际上并未切割任何金属?这似乎很有意义。您能否在几分钟内模拟20天的过程来快速,自动地运行几种不同的切割程序?这可能会增加出现问题的可能性。

然后,当您遇到这种情况时,下一步就是收集尽可能多的信息并真正开始调试。


在几分钟内无法模拟20天的过程。我必须考虑硬件。
Shirish12年

2
我从未遇到过使用模拟模式可以复制的heisenbug。问题几乎总是存在于被模拟的组件或它们之间的耦合中。就像我说的,如果您可以可靠地重现该问题,那么您就可以找到解决方案的一半。
Mark Booth

@Shirish:“在几分钟内模拟过程”可能是一个极端,但是等待20天让该错误发生并切掉很多金属以使该错误弹出显然是另一个极端。也许两者之间有可能。
Doc Brown

2
@ shirish-如果您尚未抽象出硬件,则可以对其进行仿真,这意味着缺乏设计。这也意味着您的系统可能尚未经过充分测试。因此,系统出现问题也就不足为奇了。
Dunk 2012年

1
@Dunk-您曾经在激光刻划行业工作过吗?您不一定总是拥有模拟器的奢华,即使您拥有出色的模拟器,也无法完全模拟复杂的机电一体化系统的所有复杂性,而且成本效益不高。跟随误差,速度分析,以亚微米精度进行脉冲跟踪,软实时系统与硬实时系统之间的相互作用,Takt时间压力-实时模拟该批次将需要一个群集,更不用说在1 / 10,000即时的。更快/更好/更便宜-您几乎无法同时拥有这三个,所以请不要这么判断。
Mark Booth

1

不确定使用哪种语言,但是如果我在代码(C ++)中遇到不稳定的错误,我将使用valgrindcppcheck之类的工具来确保在内存方面没有任何问题。


0

RalphChapin答案的扩展:

多年来,我不得不寻找大量的错误,这些错误只能在由于附加硬件而无法复制的系统上显示出来。

除了疯狂地记录日志之外,我还发现了另一件事:将信息放在屏幕上,显示代码在哪里以及一些相关变量的值。当问题出现时,甚至工厂的工作人员都可以阅读我的信息。

通常需要经过几轮改进才能将其精确定位,但是非常有效。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.