利用Core Dump功能进行错误分析
问题背景:
众所周知,当PLC发生除零、溢出、指针错误时会立即停止,并报告Exception错误,著名的Page Fault就是Exception的一种:
这些提示看似精确,但是因为无法将RBP、RIP和RSP的内存指针与PLC代码对应起来,用户虽然知道发生了除零、发生了溢出,但仍然需要自己想办法查程序到底是哪一行代码出了问题。对于大型项目,这是一个非常耗时耗力的过程。
大部分Exception错误可以用Check函数加断点来规避或排查,此前本公众号和倍福虚拟学院上已有多篇文档介绍。但是加断点的方式要求PLC程序必须在Login状态,工程师必须开着笔记本连上PLC等着故障出现,如果错误是不定期出现,或者发生时工程师不在现场,就很难定位故障到底发生在哪一行。还有部分Exception并没有对应的Check函数,比如负数开平方。
解决办法:
针对这个长期烦扰工程师的问题,TwinCAT 3.1在 Build 4024.11及以上的版本提供了核心转储功能Core Dump,可以在PLC运行过程中发生Exception故障时在控制器的“C:\TwinCAT\3.1\Boot\Plc”目录下自动生成后缀名为.core的PLC内存转储文件:
注意:下载程序前在PLC项目的Setting页面要勾选“Core Dump”。
事后工程师打开原项目,装载指定的.core文件,就可以重现故障发生的瞬间代码执行到哪一行:
上图中,从指针 0x04D2取值赋给nWord,这个指针是未分配物理内存的无效地址,会报Page Fault错误。
操作步骤:
详细的使用方法,见倍福虚拟学院上的文档:
《TwinCAT 3使用Core Dump工具分析Exception错误》
https://tr.beckhoff.com.cn/mod/folder/view.php?id=936
以下是简单说明:
从主菜单PLC|Core Dump 选择核心转储相关操作:
注意 :
创建核心转储 Create Core Dump:这里是指手动创建,在Login状态遇到断点时使用。如果是发生了Exception,这个功能会自动触发,在 \boot\plc下会自动生成.core文件。
加载核心转储Load Core Dump:这是分析故障时的关键,要求与故障发生时PLC运行代码完全匹配的编译文件。通常这个编译文件只存在于调试电脑上,只有拥有源代码的工程师才能利用Core Dump来分析故障。加载Core Dump以后,类似PLC遇到断点,可以查看故障发生时的程序变量、调用堆栈(菜单:PLC|Windows|Call Stack)
关闭核心转储Close Core Dump:需要关闭Core Dump才能退出故障分析状态,继续其它TwinCAT调试步骤。
本文暂时没有评论,来添加一个吧(●'◡'●)