【发布时间】:2012-09-30 00:30:59
【问题描述】:
我使用pnet tcp/udp toolbox) 和psychtoolbox 在不同机器上的两个matlab 实例之间进行通信。我的一台机器是运行 matlab 2010b 的 32 位 win7。另一个是运行 matlab 2012a 的 64 位 win 7。我在将数据从一台计算机传输到另一台计算机时遇到问题。
实验一:在 64 位电脑上运行 udp_send_demo,在 32 位电脑上运行 udp_plotter_demo。 预期结果:32 位计算机绘制数据,等待键盘输入。如果输入 Kb,则关闭图形并结束演示。 64位完成发送并停止演示。 实际结果:64 位的行为应该如此。 32 位计算机绘图但挂起并拒绝关闭演示。它不响应任何键盘输入,必须强制关闭。
实验 2:以 32 位发送和 64 位读取反向运行上述实验。 预期结果:64 位绘图并等待键盘输入。如果找到 kb 输入,则停止演示。 实际结果 64 位 matlab 崩溃,声称 mex 文件中存在分段违规。它显示一个堆栈跟踪(我在最后附加了它的一部分)。
使用端口号没有区别。重新编译“pnet.c”源文件而不是使用预编译的 mex 没有区别。 问题:有人尝试过这样的事情吗?你让它工作了吗?你能建议一些事情来尝试让它工作而不必在我的 Win64 计算机上安装 32 位 matlab 吗?
============
代码:
服务器端:
udp_send_demo('sin(0:0.1:6)',clientIPStr,portToListen)
客户端:
udp_plotter_demo(portToListen)
=============
堆栈跟踪
2012 年 9 月 29 日星期六 16:41:11 检测到分段违规
配置:
崩溃解码:禁用
默认编码:windows-1252
MATLAB 根目录:C:\Program Files\MATLAB\R2012a
MATLAB 版本:7.14.0.739 (R2012a)
操作系统:Microsoft Windows 7
处理器 ID : x86 Family 6 Model 58 Stepping 9, GenuineIntel
虚拟机:Java 1.6.0_17-b04 与 Sun Microsystems Inc. Java HotSpot(TM) 64 位服务器 VM 混合模式
窗口系统:版本 6.1(内部版本 7601:Service Pack 1)
故障数:1
异常终止: 分割违规
注册状态(来自故障): RAX = 0000000000000000 RBX = 0000000000000000
RCX = 000000005d0df7d7 RDX = 0000000000000001
RSP = 00000000040671b0 RBP = 0000000004067289
RSI = 000000000000003d RDI = 000000000000003d
R8 = 000000005d0df7d6 R9 = 000050490ee40167
R10 = 000000000000003d R11 = 0000000000000000
R12 = 0000000000000008 R13 = 000007fefb997678
R14 = 0000000000000002 R15 = 0000000000000002
RIP = 000007fefb99238a EFL = 00010202
CS = 0033 FS = 0053 GS = 002b
堆栈跟踪(来自错误):
[0] 0x000007fefb99238a C:\Users\ephys-data\Desktop\temp\tcp_udp_ip\pnet.mexw64+00009098 (perror+004298)
[1] 0x000007fefb99389b C:\Users\ephys-data\Desktop\temp\tcp_udp_ip\pnet.mexw64+00014491 (mexFunction+001979)
[2] 0x0000000074f10f63 C:\Program Files\MATLAB\R2012a\bin\win64\libmex.dll+00069475 (mexRunMexFile+000131)
[3] 0x0000000074f0fce2 C:\Program Files\MATLAB\R2012a\bin\win64\libmex.dll+00064738 (inSwapMexfileReader+000226)
[4] 0x0000000074f0fe58 C:\Program Files\MATLAB\R2012a\bin\win64\libmex.dll+00065112 (inSwapMexfileReader+000600)
[5] 0x0000000074e4b046 C:\Program Files\MATLAB\R2012a\bin\win64\m_dispatcher.dll+00045126 (Mfh_file::dispatch_fh+000486)
....更多的东西....
在运行 MEX 文件时检测到此错误。如果 MEX 文件不是 MathWorks 的官方函数,请检查其源代码是否有错误。有关调试 MEX 文件的信息,请参阅外部接口指南。
如果此问题可重现,请通过以下方式提交服务请求:....
技术支持工程师可能会与您联系以提供更多信息。
感谢您的帮助。
谢谢
-b
【问题讨论】:
-
您自己编译了 .mexw64 文件吗?我在 pnet 发行版中没有看到,只有 .mexw32。
-
最新的 psychtoolbox 带有预编译的 .mexw64。但是,我确实尝试自己重新编译它。它没有任何区别
-
您是否也尝试在两台 32 位或两台 x64 计算机之间运行此程序,以确保位数差异是问题所在,而不是始终是读者有问题?我认为您对读者的预期行为可能有点偏离:
udp_plotter_demo代码循环调用 pnet('readpacket'),我认为默认情况下会无限期阻止。由于它在 mex 文件中被阻止,因此在等待另一个数据包时它可能不会响应键盘输入。请注意注释说“使用超时不会永远阻塞”,但实际的函数调用没有传递超时值。 -
我是说 - 段错误肯定很糟糕。但是 64->32 的情况可能与所写的一样。要对其进行测试,请尝试使用不同的输入对它多次运行
udp_send_demo,并查看是否得到多个图。如果你这样做了,它会在pnet(udp,'readpacket')中被阻止,并且实验 2 中的 x64 崩溃是一个单独的问题。 -
x64版本什么时候崩溃?当您第一次运行
udp_plotter_demo或使用udp_send_demo发送数据之后?
标签: matlab mex win64 psychtoolbox