在使用 Cadence Virtuoso 进行芯片设计时,软件的稳定性与性能至关重要。当遇到程序崩溃、卡顿或图形显示问题时,如何快速定位根因?Virtuoso 提供了一套完整的诊断(Diagnostics)功能,帮助用户和管理员进行问题排查。
本文基于 Virtuoso IC23.1 版本文档,详细介绍应用崩溃报告(Application Crash Reporting)、健康监控(Health Monitor)以及图形性能测试(Graphics Performance Measurement)。
1. 应用崩溃报告 (Application Crash Reporting)

当 Virtuoso 应用程序发生异常终止(Crash)时,系统会自动生成一份崩溃报告(Crash Report)。这份报告包含了命令日志、堆栈跟踪(Stack Traces,甚至包含 SKILL 调用栈)等关键信息,是 Debug 软件问题的核心依据。
致命应用程序错误对话框 (Fatal Application Error)
当程序崩溃时,通常会弹出一个 “Fatal Application Error” 对话框。在该对话框中,你可以:
- View Report: 查看生成的崩溃报告内容。

- 选择崩溃原因:
Virtuoso unexpectedly crashed: 软件无故自动退出。Virtuoso killed due to hang or slowness: 因卡顿手动结束进程。Virtuoso killed (non-bug): 因其他原因手动结束进程。
选择正确的原因有助于 Cadence 官方进行问题分类和统计。
[!NOTE] 如果 Virtuoso 运行在
-nograph模式下,不会弹出对话框,崩溃信息会直接发送到stderr日志中。
2. 自定义崩溃报告 (Crash Report Customization)
Virtuoso 允许通过环境变量 CDS_ERRORLOG 来深度定制崩溃报告的行为。你可以通过设置一系列的 Name=Value 对来控制报告的生成位置、内容详细程度等。
基本语法:
1
setenv CDS_ERRORLOG "KEY1=VALUE1 KEY2=VALUE2"
常用配置项详解
📊 报告内容与详细度
EXTENDED=TRUE(默认: TRUE)- 记录额外的系统信息,包括所有加载工具中与默认值不同的
.cdsenv变量值,以及.cdsinit文件内容。 - 还会包含
checkSysConf(系统预检)和xdpyinfo(图形显示信息)的结果。
- 记录额外的系统信息,包括所有加载工具中与默认值不同的
USE_DEBUGGER=YES(默认: YES)- 尝试在崩溃时挂载平台调试器(如 gdb 或 dbx)以获取更详细的堆栈信息。
- 需要确保系统 PATH 中能找到调试器,或者通过
DEBUGGER环境变量指定路径。
📂 报告路径与命名
DIR=/path/to/logs- 指定崩溃报告存放的目录。如果不设置,默认使用
cdsGetTmpDir()生成的临时目录(通常是/tmp)。
- 指定崩溃报告存放的目录。如果不设置,默认使用
AUTO_DIR=my_crashes- 自动按年月归档。例如设置
AUTO_DIR=crashes,报告会存放在crashes/25_12/目录下。
- 自动按年月归档。例如设置
NAME_FMT=%PID.log- 自定义报告文件名格式。支持的变量包括:
%DATE,%TIME: 日期时间%VERSION: 软件版本%USER,%HOST: 用户名与主机名%PID: 进程 ID
- 示例:
NAME_FMT=crash_%DATE_%USER.log
- 自定义报告文件名格式。支持的变量包括:
📧 自动化处理
SAVELOGS=ONCRASH(默认: ONCRASH)ONCRASH: 仅在崩溃时保存CDS.log的副本到崩溃目录。ALWAYS: 每次退出都保存。OFF: 关闭此功能。
LOG_EMAIL=app:user@example.com- 崩溃时自动发送邮件通知。格式为
application:email_address。
- 崩溃时自动发送邮件通知。格式为
SCRIPT=/path/to/script.sh- 崩溃时执行指定的 Shell 脚本。系统会传递 PID、日志路径、退出状态等参数给脚本,适合集成企业内部的监控系统。
🕵️♂️ 趋势监控 (Start Info)
STARTINFO_FILE=/path/to/startinfo.log- 记录每次 Session 的启动和结束(或崩溃)信息。
- 通过分析由于
signal:Abort或signal:Hangup导致的退出,可以统计崩溃率和软件稳定性趋势。
3. 清除受损数据 (Purge Compromised Data)
当 Virtuoso 在读取数据过程中数据库文件被外部修改,或者读取了已损坏的数据(Compromised Data)时,为防止级联错误,软件可能会强制退出。
如果遇到这种情况,可以使用 SKILL 函数 ddsHiCheckCompromisedData() 打开清除向导,或者在界面上根据提示清除内存中的受损数据,确保当前 Session 可以继续安全运行。
4. 图形性能测试 (Measuring Graphics Performance)
觉得 Virtuoso 界面操作卡顿?不知道是网络问题还是显卡驱动问题?可以使用内置的基准测试工具进行量化评估。


运行基准测试
在终端中执行以下命令启动测试工具:
1
$CDSHOME/tools/dfII/bin/hiGraphicsBenchmark
主要功能:
- Benchmarks: 选择不同的测试项(如屏幕重绘、区域拷贝、图像操作等)点击 “Run”,评估当前环境的图形处理能力。
- Calibrator: 运行校准工具,它会根据测试结果提供优化建议。
- Task Viewer: 查看当前运行的系统进程及 CPU/内存占用情况,帮助排查是否有后台进程抢占资源。
通过定期进行图形性能测试,可以在系统升级或驱动更新后对比性能变化,快速定位环境瓶颈。
5. 进程与资源监控 (Task Viewer)

在Linux平台上,hiGraphicsBenchmark 工具还提供了一个 Task Viewer 组件,用于实时监控系统资源。
启动方式:
- 运行
hiGraphicsBenchmark。 - 在菜单栏选择
Tools->Task Viewer。
主要特性:
- 实时更新:每2秒刷新一次数据。
- 进程管理:在
Processes标签页,可以查看当前影响性能的进程,甚至可以直接选中 PID 并点击End Process终止进程。 - 资源监控:
CPU_Memory Usage标签页显示 CPU 和内存使用率,支持在 1G 和 2G 单位间切换。 - X Resources:监控 X Server 资源占用情况。
- 快照 (Snapshot):可以对当前状态进行截图(Snapshot),保存为 ASCII 文本文件,包含进程列表、堆栈信息、X Server 配置和日志等,便于后续分析。
6. 诊断中心与健康监控 (Diagnostic Center & Health Monitor)
Virtuoso 集成了一个诊断中心 (Diagnostic Center),作为排查性能问题的一站式入口。
启动诊断中心
在 CIW (Command Interpreter Window) 菜单中选择 Tools -> Diagnostic Center。
界面分为两个标签页:
- Performance (Health Monitor): 专注于性能调优和卡顿分析。
- Data Integrity: 检查库和设计数据的完整性。
初始化与启动参数 (Initialization & Launch Arguments)
为了更灵活地使用诊断功能,特别是 Health Monitor,可以通过以下方式进行初始化配置:
installAtStartup: 默认情况下,Health Monitor 会通过该环境变量自动安装。launchUI: 设置此环境变量可在启动 Virtuoso 时直接打开 Health Monitor 界面。-perfdiag参数:virtuoso -perfdiag: 启动时安装 Profiler 工具但不显示 UI。virtuoso -perfdiag ui: 启动时安装并立即显示 Health Monitor UI。
- 禁用诊断: 若需在回归测试中避免性能诊断工具干扰,可设置
setenv CDS_PERFDIAG_DISABLE。
健康监控 (Health Monitor)
Health Monitor 是诊断中心的核心组件,用于实时监控 Virtuoso 的运行状态。
- 红绿灯指示器:当 Session 变慢时,指示灯会变黄或变红,并提供性能提示。
- 调用栈记录 (Callstacks):
- 点击
Start Recording开始记录,复现卡顿操作,然后点击Stop Recording。 - 工具会生成一份高层摘要(High-level summary),根据时间占比排序函数调用(Call-chains)。
- 例如:
Total 173 non-idle callstacks ('*' >30%),如果某个底层函数(如 OpenAccess 读取)占用过高,即可定位瓶颈。
- 点击
- 处理未响应程序:
- 如果 Virtuoso彻底卡死(Freeze),可以使用外部命令唤起 Health Monitor:
cdsPerfDiag -p <pid>。 - 在工具中点击
Terminate Virtuoso,它会在终止进程前收集最后10秒的调用堆栈和top命令输出,生成hangReport,这比直接kill -9能提供多得多的调试信息。
- 如果 Virtuoso彻底卡死(Freeze),可以使用外部命令唤起 Health Monitor:
故障排查:处理未响应的程序 (Troubleshooting Unresponsive Application)
当 Virtuoso 界面完全卡死(Unresponsive)时,不要急着 kill -9!
- 模拟卡死: 若要测试此功能,可在 CIW 执行死循环代码:
while(t nil)。 - 从外部唤起诊断: 在终端运行
cdsPerfDiag -p <PID>。 - 终止进程: 在弹出的 Diagnostics 窗口中,点击 “Terminate Virtuoso”。
- 填写原因: 输入卡死原因(这将记录在日志中),点击 Terminate。
此时,系统会收集最近 10 秒的 Callstacks 并在 hangReport 中生成高层摘要,这对于分析死锁或死循环至关重要。
7. 自动日志提交 (VAILS)
VAILS (Virtuoso Analysis of Interaction Learning System) 是一套自动化的日志收集和提交系统。当 Virtuoso 崩溃或通过 Health Monitor 终止时,VAILS 可以自动将诊断日志打包发送给 Cadence。
VAILS Enabled Script 详解
VAILS 的核心开关在于 install_dir/share/cdssetup/vails/vails_enabled 脚本。
该脚本不仅控制是否启用上传,还可以通过接收参数(submission_type 和 log_path)来实现复杂的逻辑判断。
脚本接收两个参数:
$1(Type):crash或hang。$2(Log Path): 日志存放路径。
示例脚本逻辑:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/sh
type="$1"
log="$2"
case $type in
crash | hang)
# 仅允许 crash 和 hang 类型的日志上传
# 还可以检查用户目录下是否有启用标记
if [ -f $HOME/enable_vails ]; then
exit 0 # 返回 0 代表允许上传
fi
exit 1
;;
*)
exit 1 # 其他类型默认禁止
;;
esac
日志脱敏 (Anonymization of Diagnostic Logs)
为了防止敏感信息泄露,在日志上传前,VAILS 会运行脱敏流程。配置文件位于 install_dir/share/cdssetup/vails/vailsAnonymizeLog.cfg。
Virtuoso 使用 UNIX sed 命令的正则语法来定义脱敏规则。配置文件格式为 CSV 风格:
Rule Name, Regular Expression, Action, Grp, Replacement
常用脱敏技巧与 sed 命令:
- 替换用户名:
1
UserName, ^.*User Name:\s*\(.*\)$, anonymize, 1
^.*User Name:\s*: 匹配 “User Name:” 前缀。\(.*\): 捕获组 1,即括号内的内容(用户名)。anonymize: 动作,系统会自动将其哈希化(Hash)。1: 针对第 1 个捕获组操作。
-
使用
sed命令逻辑: 配置文件的正则会被直接翻译给sed。因此,你需要确保正则能精确匹配整行 (^...$),并通过捕获组 (\(...\)) 提取出需要处理的子串。 - 替换为固定字符:
若不想用哈希,也可以直接替换为固定字符串:
1
ProjectName, ^.*Project:\s*\(.*\)$, replace, 1, MY_PROJECT
验证配置
可以使用 vails_test 脚本来验证配置是否正确以及能否连接到 AWS(日志存储端):
1
$share/cdssetup/vails/vails_test
如果带上 yes 参数,它甚至会模拟一次崩溃来完整测试日志生成和上传流程。
总结
熟练掌握 Virtuoso 的诊断工具,不仅能帮助能在遇到 Crash 时从容应对,收集高质量的 Log 提供给原厂支持,还能通过长期监控分析出环境的潜在隐患,从而提升整体的设计环境稳定性。
参考文档: Virtuoso Studio Design Environment User Guide (IC23.1) - Diagnostics Chapter