问题
对于高版本的系统(Manjaro、Centos8、部分Centos7),IC617用于处理多线程产生GUI界面的cds-vnc无法正常启动。导致在多线程仿真时会pending,经尝试无法通过安装字体解决。
解决思路
通过分析cadence调用vnc命令
/opt/cadence/IC617/tools/bin/cdsDaemonStarter -- /opt/cadence/IC617/tools/bin/cdsXvncd :82 -desktop 'sics-server-4:82 (yezoli)' -geometry 1024x868 -depth 16 -rfbwait 30000 -rfbauth /home/yezoli/.vnc-cds/passwd -rfbport 5982 -pn -ac -localhost -terminate -fp /usr/share/X11/fonts/,/usr/share/X11/fonts/misc/,/usr/share/X11/fonts/75dpi/,/usr/share/X11/fonts/100dpi/ -co /usr/share/X11/rgb '-co' '/usr/share/X11/rgb' >> '/home/yezoli/.vnc-cds/sics-server-4:82.log' 2>&1)
可以发现cadence实际通过守护进程cdsXvncd调用了cdsXvnc。同时在cdsVncserver中打印环境变量和链接信息可以发现cdsXvnc是使用系统的环境变量和动态链接库运行的。但是在系统的运行环境下单独调用cdsXvncd可以发现其就是realvnc3.3.7同时已经无法正常运行了(观察strace的系统调用可以发现其会打开/usr/share/X11/fonts/misc/但是无法识别到正确的字体,因而无法启动)。但是cadence对于vnc的执行策略是在调用cdsXvnc后延时3秒,然后开始轮询vnc的端口来检测vnc是否正常启动,这点从strace的日志中可以发现(cadence会不停尝试连接vnc的端口。
由于cadence是通过轮询特定端口来判断vnc是否已经打开,而和vnc的实现无关。因此可以用系统的Xvnc(tigervnc)来替换cadence的cdsXvnc。
解决方法
第一步
备份cdsXvnc后把cdsXvnc链接到/bin/Xvnc
第二步
修改cdsVncserver脚本淘汰无效的选项