在公式管理器里点下导入,软件窗口直接没了,没有提示框,重开之后公式列表里也看不到新导入的内容。遇到通达信导入公式闪退,能拿来定位的线索比报错少得多,因为进程结束之后提示文字根本来不及留下。这种情况下该从哪一处开始查?
下面把这个问题拆成入口、文件、源码三层,每层给出可以自己核对的位置与顺序,最后附一份按步骤走的清单。全文只讨论软件操作与文件结构,不评价任何公式的效果,也不给出操作结论。文中提到的目录名与菜单路径以通达信金融终端个人版为参照,版本号可以在「帮助 → 关于」里核对。
一、闪退与报错不是同一类问题
报错的特征是进程还在,并且给出一段提示文字。提示原文里会写明编译器停下的位置或检查项名称,顺着原文找就能落到具体的一行。这类问题的处理入口是提示文字。
闪退的特征是进程结束,没有提示文字。它留下的线索只有三处:操作系统日志里该进程的退出记录、软件目录下的临时文件、以及被写到一半的公式库文件。处理通达信导入公式闪退,入口是「刚才点了什么」与「刚才在写哪个文件」,与提示原文无关。
二、动手之前先把 T0002 复制一份
自定义公式与相关索引文件都放在软件安装目录下的 T0002 里,自定义公式数据文件是 PriGS.dat,备份目录是 gs_bak。在排查开始之前,把整个 T0002 目录复制到别的位置存好。
{ 排查前的准备动作 }
1. 关闭行情软件进程
2. 找到软件安装目录下的 T0002 目录
3. 整个 T0002 复制到别的位置(不要只复制 PriGS.dat)
4. 记下复制的时间点
{ 需要还原时 }
把复制出来的 T0002 整个放回原位置覆盖
或从 gs_bak 中取对应时点的副本
只复制 PriGS.dat 是不够的。导入过程可能同时改写公式索引与其它配置项,只还原这一个文件,会出现数据文件与索引对不上的情况。
三、从导入入口分开看
通达信的公式导入有几种入口,触发通达信导入公式闪退的原因不在同一处。先把「刚才用的是哪个入口」确定下来,排查范围就能收窄。
| 导入入口 | 操作位置 | 先核对什么 |
|---|---|---|
| 管理器内导入 | 功能 → 公式系统 → 公式管理器(快捷键 Ctrl+F),在左侧对应分支上点「导入」 | 选中分支的类型与公式类型是否对应 |
| 双击公式文件 | 在资源管理器中双击扩展名已关联到本软件的公式文件 | 该扩展名当前的关联程序是不是这个版本 |
| 编辑器内粘贴 | 公式管理器里新建公式后,把源码粘贴进编辑区 | 源码的字符集与单行长度 |
| 批量导入 | 一次选中多个公式文件,或导入整套公式包 | 文件数量、封装方式与压缩包结构 |
四、文件层面的三类中断
第一类是扩展名与封装类型不被当前版本接受。通达信公式导出文件用到过扩展名 tnf、tni 等,加密导出与未加密导出的封装结构不同。把加密导出件放到只接受未加密件的入口,或者把较早版本的封装放进较新的版本,都可能在解析阶段中断。核对办法是把文件的扩展名与来源,和你所用版本帮助里写明的可识别格式逐字比对。
第二类是字符集。源码文本以 GBK 保存时,如果文件实际是 UTF-8 编码,逐字节读取会把非 ASCII 部分读成乱码,其中个别字节序列会让解析过程走到预期之外的分支。核对办法是用十六进制查看器看文件开头有没有 UTF-8 的 BOM 标记 EF BB BF。有 BOM 而软件按 GBK 读取,就是一个明确的怀疑点。
第三类是写入受阻。文件正在被其它进程读取,或者 T0002 目录没有写权限,会让写入中途停下。这一类的特征是退出发生在导入动作的末尾而不是开头。核对办法是看安全软件与同步盘的运行状态,以及目录的权限设置。
五、源码层面的中断触发点
如果闪退出现在编辑器内粘贴或保存的那一步,位置就要转到源码本身。可以核对的触发点有这几处。
- 单行过长。解析时的行缓冲区长度有限,超长行会让解析走出预期路径。核对办法是把最长的那一行单独取出来,数一下字符数。
- 参数表与正文不匹配。参数表里声明的参数个数,与正文里实际使用的个数对不上。
- 公式类型与内容不匹配。把需要输出价格量级的写法放进条件选股的公式体里,类型检查会在这一层停住。
- 使用了当前版本未收录的函数。函数名不在你所安装版本的函数列表里,解析到该标识符时无法继续。
- 自引用或循环引用。公式体里引用了自身,或两个公式互相引用。
这几类里,前两类可以直接用字符数与参数个数核对,后三类要靠函数列表与公式间的引用关系核对。核对顺序建议从能用数字说清的开始。
六、按顺序走一遍排查清单
| 步骤 | 动作 | 结果指向 |
|---|---|---|
| 1 | 关闭软件,整个备份 T0002 |
把现场固定下来 |
| 2 | 新建一个只含一行的最小公式,例如 A:MA(CLOSE,20);,走同一个导入入口 |
分离「通道问题」与「内容问题」 |
| 3 | 若最小公式也闪退,转到文件层核对扩展名、编码与写入权限 | 问题在导入通道或文件 |
| 4 | 若最小公式正常,把原源码分批加回,每次只加一段 | 定位到具体的行 |
| 5 | 换一个导入入口再试一次(管理器内导入 ↔ 双击文件 ↔ 编辑器粘贴) | 区分入口相关与内容相关 |
| 6 | 打开 Windows 事件查看器 → Windows 日志 → 应用程序,找行情软件进程的退出记录 | 拿到退出时的错误码 |
| 7 | 需要时从备份或 gs_bak 还原公式库 |
恢复到可用状态 |
第 2 步是整个清单里作用最大的一步。一个只含一行的公式能通过导入,说明导入通道本身是通的,接下来的工作只是在源码里找那个触发点;它同样闪退,说明不必再去读源码,直接转向文件与环境。
七、清单走完之后还剩的情况
七步走完仍没有结论时,说明这次通达信导入公式闪退不属于上面任何一层,剩下两类情况需要单独判断。
一类是版本不匹配。券商定制版与官方版的函数表、导入入口、可识别格式都可能不同,同一份公式文件在两边表现不一致。判断办法是核对两个版本的版本号,以及各自帮助菜单里写明的可识别文件格式。
另一类是环境干扰。安装目录被安全软件或同步工具持续扫描,写入被拦截后又立刻释放,可能会让进程在读写交替的瞬间退出。判断办法是看安全软件的拦截记录,以及目录是否位于同步盘路径下。
走到这一步,把三样东西备齐再继续会省下几轮来回:软件版本号(帮助 → 关于 里的截图)、退出前一步的操作路径、Windows 事件查看器里的那条退出记录。三样凑齐,问题基本能落到一个可以复现的位置上。
文中目录名、文件名与菜单路径以通达信金融终端个人版为参照;不同版本与券商定制版可能存在差异,请以你所用版本的「帮助 → 关于」与本地实际目录为准。站内 公式报错与卡顿排查 一栏讲编译提示与显示异常的对照,公式安装与导入 一栏讲导出文件的格式与导入步骤,公式编写与语法函数 一栏讲源码里函数与参数的写法,可对照查看。
