开源改变世界

调用 python linuxcnc.command.mdi(“o call”) 导致 milltask 在 ~1000 次后发生段错误 #1088

推推 grbl 3年前 (2023-01-30) 256次浏览
关闭
2个任务
ZincBoy 打开了这个问题 2021 年 2 月 19 日 · 4条评论
关闭
2个任务

注释

调用 python linuxcnc.command.mdi("o<myfunction> call") 导致 milltask 在 ~1000 次后发生段错误 #1088
贡献者
锌男孩 评论了 2021 年 2 月 19 日  

以下是我重现该问题所遵循的步骤:

  1. 使用 Gmoccapy 打开磨机模拟(其他界面可能会显示此行为,但我没有测试过)
  2. 找到{milltask的进程号}
  3. lsof | grep {milltask 的进程号} | wc -l
  4. 记录milltask的打开文件数
  5. 使用 MDI 屏幕宏按钮之一运行宏。这些使用python linuxcnc.command.mdi接口来调用o word函数。
  6. lsof | grep {milltask 的进程号} | wc -l
  7. 看到milltask打开的文件数增加了一个
  8. 重复步骤 6-7,您会发现每按一次按钮打开的文件都会增加一个。
  9. 如果按钮被按下大约 1024 次(或任何系统打开文件限制),milltask 将出现段错误并读取一个空指针
  10. 我没有按下按钮 1024 次,但我有一个 python 脚本重复调用 o word 函数,它在大约 1024 次迭代后崩溃。
  11. 如果通过 EMC_MDIHistory 小部件调用 o word 函数或通过循环启动重复运行程序,则不会发生文件打开问题。

这是我期望发生的事情:

我希望 o-word.ngc 文件在访问后关闭,就像使用 EMC_MDI_History 小部件时发生的情况一样。

这是发生了什么:

每个 o-word.ngc 调用都会打开文件的一个新实例并保持打开状态。最终达到系统打开文件限制并导致 milltask 发生段错误

在此之前它工作正常:

在 2.8.1 的模拟和硬件上进行了测试。未在其他版本上测试。

有关我的硬件和软件的信息:

  • 我正在使用这个 Linux 发行版和版本(通常显示为lsb_release -a):Debian Buster
  • 我正在使用此内核版本(显示为uname -a): Linux VK45 4.19.0-14-rt-amd64使用 Tcl_SetResult 和 Tcl_GetStringResult  #1 SMP PREEMPT RT Debian 4.19.171-2 (2021-01-30) x86_64 GNU/Linux
  • 我在跑步 …
    • [ X] 来自 linuxcnc.org 的二进制版本(包括 buildbot.linuxcnc.org)
    • 我自己构建的二进制文件
    • 来自 linuxcnc.org 之外的其他来源的二进制版本
  • 我正在使用这个 LinuxCNC 版本(显示在包管理器中,或者对于 git 版本,scripts/get-version-from-git):2.8.1
  • 我正在使用此用户界面 (GUI)(例如 AXIS、Touchy、gmoccapy 等):gmoccapy
  • 我正在使用此接口硬件供应商和芯片组(例如,并行端口、以太网端口、FPGA 卡):Mesa 和 Simulation

段错误信息: 2 月 17 日 23:10:31 VK45
内核:[132086.124829] milltask [10042]:段错误在 0 ip 00007fd2b18886a3 sp 00007fff116632a8 libc-2.28.so[7fd2b1833000+123 Kernel 1:145100] 中的错误 4
: [132086.124836] 代码: 1f 84 00 00 00 00 00 c3 0f 1f 80 00 00 00 00 8b 42 04 83 e1 cf 8d 70 01 89 72 04 89 0f eb 99 0f 1f 84 00 < 08 08 00 > 07 f6 47 74 80 0f 84 b9 00 00 00 89 c1 81 e1 00 80 00 00 0f 85

编辑:修复了尖括号的意外使用。

调用 python linuxcnc.command.mdi("o<myfunction> call") 导致 milltask 在 ~1000 次后发生段错误 #1088
合作者

我检查了那个并且我能够重现该行为。

但我需要使用:
lsof | grep 任务 | wc -l

如前所述,每次调用子程序后,文件数都会增加一个。我也用轴检查过,那里没有!

gscreen 的行为与 gmoccapy 相同,因此数量增加。

恕我直言,这意味着它与 linuxcnc 的 GladeVCP 部分有关

调用 python linuxcnc.command.mdi("o<myfunction> call") 导致 milltask 在 ~1000 次后发生段错误 #1088
贡献者作者

我发现只有在自动模式页面中没有打开 .ngc 文件时才会发生这种情况。如果您将文件设置为在启动时加载,则不会发生此问题。目前的解决方法是在尝试调用任何 o word 宏之前始终加载 .ngc 文件。

这就是为什么我认为通过 EMC_MDIHistory 小部件调用 o-word 时不会发生这种情况。它确实如此,但在我测试时,我首先在自动模式下运行了一个 .ngc 文件。重新启动系统时,我发现 EMC_MDIHistory 小部件导致打开的文件保留。打开 .ngc 文件后,不会再打开其他文件。打开 .ngc 不会关闭任何打开的文件。

调用 python linuxcnc.command.mdi("o<myfunction> call") 导致 milltask 在 ~1000 次后发生段错误 #1088
合作者
gmoccapy 评论了 2021 年 2 月 20 日  

非常奇怪的是:

  • 我在 MDI 历史中做 o<increment> call [1] [1]
  • 机器按预期在每个轴上移动 1 mm
  • lsof | grep increment | wc -l 给出 1
  • 再次执行相同的宏后o<increment> call [1] [1] 给出 2
  • 所以文件的数量在增加。
    我检查了 hal_mdihsitory 并且在 hal_glib 和 hal_actions 中都找不到奇怪的东西似乎做奇怪的事情。我不知道去哪里看,可能有 C 知识的人可以检查 python 接口

诺伯特

调用 python linuxcnc.command.mdi("o<myfunction> call") 导致 milltask 在 ~1000 次后发生段错误 #1088
贡献者作者

我在 Axis 中重现了这个问题,但前提是在 INI 中设置了 OPEN_FILE=””。 @dngarrett的修复对我有用。我在2.9pre测试了一下,问题解决了。这是一个快速修复!