ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

LoadRunner VUG报错type not supported on Win32的排查与修复

LoadRunner VUG报错type not supported on Win32的排查与修复 做性能测试这些年LoadRunner 几乎成了我电脑里的常驻工具。前几天团队里一个小伙子在 VUGVirtual User Generator里打开之前录制好的脚本突然弹了个报错The aTweb type is not supported on Win32然后 VUG 就卡住不动了。他截图发群里我一看就乐了这问题老熟人了属于那种“看着吓人、弄懂原理后特别简单”的报错。我先说结论这类 type is not supported on Win32 报错90% 不是 VUG 坏了也不是脚本彻底废了而是 VUG 在启动脚本时发现脚本声明里要求的“类型”在当前环境里找不到、认不出或加载不了。换句话说就像你拿着一张写着“需要某个特殊工具”的图纸去一个没有这个工具的车间开工机器自然撂挑子不干。这篇不打算只给一个“重装大法”就交差。我会从报错本身拆起把 VUG 识别脚本类型的机制讲明白再按排查顺序给你一套能真正落地的修复方案最后附上我在实际项目里踩过的坑和处理习惯。这篇适合所有被 LR 各种“不支持”报错折腾过的人也适合刚入行性能测试、对 LR 还处于“能录能跑就行”阶段的同学。1. 报错全貌先搞懂它在说什么1.1 拆解报错信息里的三个关键词先把报错字符串拆开看The aTweb type is not supported on Win32。第一个关键词是 aTweb。在这个语境里它指的是 VUG 脚本的“协议类型标识”。LoadRunner 的 VUG 在新建脚本时会让你选协议比如 Web - HTTP/HTML、Web Services、Java、.NET、Socket、FTP 等等。你选了哪个协议VUG 就会在脚本工程文件里写下一个对应的 type 字段告诉你这个脚本属于什么类型。但 aTweb 这个写法有点怪。从字符构成看像是某个早期版本的内部协议名、某个录制模板的自定义标识或者干脆是从其他平台导入脚本时类型字段在转换过程中产生了错乱。我见过很多类似的情况最后发现真实报错里的字符串可能是被截断、被编码转换搞乱后的结果。第二个关键词是 type。在 VUG 的体系里type 不只是一个显示用的名字它直接决定了 VUG 要用哪一套协议引擎去加载和回放脚本。类型标识对不上VUG 就不认账。第三个关键词是 Win32。这里的 Win32 指的是 32 位 Windows 应用环境。很多人的电脑是 64 位系统但 LoadRunner 的 VUG 本身可能是一个 32 位进程或者你安装的就是 32 位版本的 LoadRunner所以在报错信息里它还是会以 Win32 自称。把这三个词连起来报错的意思是你给我的这个脚本声明它需要一种叫做 aTweb 的类型可是我这个跑在 Win32 环境下的 VUG 不支持、不识别这种类型所以我没法打开它。1.2 这类报错最常出现在哪些场景根据我的经验type not supported 不是某个孤立个案它通常出现在下面几类场景里。搞清楚场景比直接背解决方案更重要因为不同场景对应的修复方向差别很大。第一类从同事或别的电脑拷过来的脚本。别人的 LR 版本、协议插件跟你不同步脚本的 type 字段在他那边合法到你这边就成了“非法字符”。第二类升级或降级 LoadRunner。比如团队从 LR 11 升到 LR 12老的 .usr 文件里写的 type 值新版可能改用别的命名了或者反过来新版创建的脚本拿到老版去打开老版不认识新版才有的协议类型。第三类装了汉化包或第三方插件后出现的“次生灾害”。汉化包改动了注册表、菜单项和部分模块加载信息如果汉化包的版本和你安装的 LR 主程序不是严格对应很容易导致协议插件注册错乱VUG 加载类型时找不到对应的 DLL就报 not supported。第四类脚本文件自身损坏。脚本在网络上用不正确的传输方式拷贝或者被某些文本编辑器用带 BOM 的格式改写再或者脚本录制中途 VUG 被强制杀掉都可能导致 .usr 文件里的 type 字段写入不完整。第五类从 JMeter、Postman 等其他工具迁移脚本到 LoadRunner 时手工改文件后缀、套模板导致的类型声明混乱。这个场景这几年随着 JMeter 流行反而越来越多。2. 为什么“type not supported”从根上拆原因2.1 VUG 的“type”字段到底是怎么工作的很多人在 LR 里录制回放用得很顺但从来没想过 VUG 每次打开一个脚本时后台到底干了什么。我用一个比较直观的类比讲。你可以把 VUG 当成一台多功能车床type 字段就是图纸上标注的“零件类型”。这台车床自己不带所有夹具它得根据图纸标注的类型去工具柜里找对应的夹具装上然后才能开工。如果图纸上写的零件类型很生僻工具柜里没有车床就只能停下来告诉你这个类型不支持。具体到 LoadRunner 内部VUG 打开一个脚本目录时首先读取的是 .usr 文件或者用记事本打开脚本根目录下的 .usr 文件你会看到类似 [General] 段里面有 TypeWeb 或 TypeURL 这样的键值。VUG 拿到这个 Type 值之后会去注册表、安装目录下的协议插件目录里查找对应的驱动库文件通常是各种 .dll、.dat、.cfg 之类的组件。找到了加载脚本正常打开找不到或者类型名对不上直接弹窗拒绝。这中间只要任何一环出了问题你看到的都是同一个报错但根因可能完全不同。2.2 版本与位数错配最常见的“隐形杀手”这是我实际排查中发现概率最高的一类原因但它往往最容易被人忽略因为表面上看不出任何异常。很多人只注意到 LoadRunner 的主版本号比如 11、12、2021但没注意同一个版本里还有 32 位和 64 位的区别。VUG、Controller、Analysis 这些组件分别在哪个位数环境下运行是有讲究的。如果你装的是 32 位 LoadRunner那么 VUG 本身就是个 32 位进程它只能加载 32 位版本的协议动态库。一旦脚本的 type 字段对应的协议组件只有 64 位版本这种情况在升级老项目、混合安装环境里特别容易发生VUG 就会报 not supported。还有一个非常隐蔽的点操作系统是 64 位 Windows不代表你随便装的 LoadRunner 就是 64 位程序。在 64 位系统上装 32 位进程系统照样能跑但 LoadRunner 里有些工具尤其是一些老的协议录制器会在内部以 32 位兼容方式运行报错信息里仍然可能写 Win32。判断方法很简单。在 VUG 里打开“帮助”菜单看关于信息里的版本号或者到任务管理器里看进程名称后面有没有“*32”标记。有 *32 说明是 32 位进程。先确认这一层后面修的时候才不至于瞎折腾。2.3 运行时组件和汉化包: 表面上无关, 实际上能捅大娄子LoadRunner 装完之后不是孤立跑起来的。它依赖一堆微软的 VC 运行库、.NET Framework 组件。我为什么专门提这个因为你打开脚本时VUG 要加载协议扩展 DLL而这些 DLL 本身是依赖运行库的。有一回我的 LoadRunner 突然打不开 Web 类脚本报错信息长得跟 type not supported 一样。排查到后面发现是系统里 VC 2005 运行库被某个软件卸载残留搞坏了协议 DLL 一加载就失败VUG 就甩锅给 type 不支持。把运行库修复之后脚本正常打开跟 LR 本身一点关系都没有。再就是汉化包。这里我得说点大实话LoadRunner 的汉化包安装这件事翻车概率远比你想象的高。汉化包不光是替换界面语言它还会改写注册表、替换部分资源 DLL。如果汉化的语言包跟主程序版本不对应补丁覆盖之后协议注册表项很可能错乱。常见后果就是打开英文原版脚本时报 type not supported或者干脆 VUG 闪退。如果是在中文环境里遇到这种报错我的建议是先把汉化这个变量从排查链里摘掉。具体怎么摘后面实操部分会细说。2.4 脚本文件本身的“暗伤”最后一类原因是脚本文件自己出了问题。这里说的“问题”不是指代码写得不对而是工程文件在传输、编辑、保存过程中产生了格式性损坏。比如在 Windows 和 Unix 系统之间来回拷贝脚本换行符从 CRLF 变成 LF.usr 文件解析时字段断裂。比如用 Notepad、VS Code 之类的工具打开 .usr 文件时保存成了 UTF-8 带 BOM 格式BOM 三个字节悄悄插到了文件头VUG 做键值解析时第一个键就被污染type 字段自然读不对。还有一个不容易注意到的点LoadRunner 的脚本在录制过程中如果电脑蓝屏、VUG 被强杀工程文件是有可能写一半的。type 字段后面跟的值可能被截断看起来像 aTweb 这种不伦不类的名字。这时候你去怪 LR 版本、怪汉化包其实是冤枉它们了。3. 排障与修复实操从最轻到最重按顺序来3.1 动手前先做三件小事每次遇到报错我给自己定的规矩是先备份、再定位、后下手。特别是对这种“类型不支持”的报错乱动环境只能让问题更复杂。第一件小事把出问题的脚本整个目录复制一份放到旁边哪怕等会儿要改文件也是在副本上改原件留着当参照物。第二件小事确认当前 LR 的版本。打开 VUG在帮助菜单里看关于信息记下主版本号和补丁号。有条件的话顺便问一下这个脚本是从哪个版本、哪台机器上创建的。第三件小事看脚本根目录下的 .usr 文件前二十行内容。很多问题到这一步就已经心理有数了。注意用文本编辑器打开就行但打开后不要立刻保存尤其不要用带 BOM 编码保存。这里我再补充一个小技巧查看文件编码如果文件头有肉眼不可见的 BOM 字符用 Notepad 或 VS Code 右下角的编码指示器可以看出来。3.2 修复方案一修正 .usr 文件里的 type 字段如果你在 .usr 文件里看到类似 TypeaTweb 这样的怪值先别慌着改。第一步是确认你手头这个版本的 VUG 到底支持哪些协议类型。怎么确认呢最简单的方法在 VUG 的新建脚本向导里看一下协议选择列表。列表里显示的名字和你当前环境能识别的类型是对应的。比如列表里有 Web - HTTP/HTML那对应的 type 通常就是 Web 或 http有 Web Services对应的 type 可能是 WebServices注意大小写和是否有空格。然后回到 .usr 文件的 [General] 段把 Type 后面的值改成上方列表里对应协议的标准写法。比如[General] TypeWeb保存后重新用 VUG 打开脚本看报错是否消失。这里要提醒一句改完 type 只是让脚本能被 VUG “打开”不等于脚本能直接回放。如果 type 改错了比如一个本来是 Web Services 的脚本被你改成了 WebVUG 会用 HTTP/HTML 的引擎去解析 SOAP 请求后续报错会更多。所以改之前想清楚这个脚本原本应该是什么协议如果是别人给的脚本最好问清楚。3.3 修复方案二用“新建脚本 导入代码”绕开损坏的类型描述有时候 .usr 文件损坏得比较彻底type 字段怎么改都对不上或者文件结构已经乱到 VUG 根本不认。这时候我一般不用“硬修”而是用“重建”的思路让 VUG 重新生成一个干净的类型声明再把原来的代码内容搬进去。操作路径是这样的。第一步在 VUG 里新建一个脚本协议选择为原脚本对应的协议比如 Web - HTTP/HTML。第二步不要录制直接建一个空脚本。第三步把报错脚本目录下实际包含测试逻辑的 .c 文件找出来。第四步把 .c 文件里的 Action 函数体复制到新脚本对应的 Action 里或者用 VUG 的 Insert Script 功能把旧脚本文件插入新脚本。但这里有个前提旧脚本里的代码必须还是正常可读的。如果连 .c 文件内容都已经乱码、缺失了那重建也救不回来只能找到原始的录制源或回归用例重新录制。还有一类路径如果你的 LR 版本支持“打开已有脚本”时选择“网络路径映射方式”可以尝试用这种方式打开。我实测下来部分因网络驱动器、映射盘符导致的脚本读出异常换这种方式能绕过去。3.4 修复方案三修复运行时组件给协议 DLL“松松土”如果脚本文件本身看着没问题type 字段也是标准值但 VUG 还是报 not supported那就要考虑是协议 DLL 加载环节出了问题。这时候的核心思路是修复依赖环境而不是重新录制脚本。我先讲怎么判断是不是这块的问题。你可以在脚本目录下的 .c 文件里随便看几行代码如果代码就是普通的 HTTP 请求函数比如 web_url、web_submit_data说明脚本本体没毛病。这时候把注意力转移到运行环境上。第一步检查 VC 运行库是否齐全。LoadRunner 对 VC 2005VC80、VC 2008VC90这类老运行库尤其依赖。到控制面板的“程序和功能”里看看有没有 Microsoft Visual C 2005/2008 Redistributable。如果列表里找不到或者之前卸载过到微软官方下载对应版本重新安装。第二步注册 LoadRunner 相关 DLL。找到 LR 安装目录下的 bin 目录打开管理员命令行执行类似 regsvr32 的注册命令。但注意不要一股脑把 bin 里所有 DLL 都注册一遍那样很容易把注册表搞乱。我一般只注册 mdrv.dll、aa.dll 这类和驱动引擎、协议运行时直接相关的组件。第三步清理插件缓存。LR 有时会在用户目录下缓存脚本加载索引路径通常在 C:\Users\用户名\AppData\Local\Temp 或 LR 的安装目录下的 tmp 文件夹。把缓存文件清掉重启 VUG让系统重新识别协议类型。这一步虽然听上去玄学但我确实靠它解决过几次诡异报错。3.5 修复方案四卸载汉化包先把语言变量摘出去如果你的 LR 装了汉化包我强烈建议你把汉化包先卸载用英文原版验证一下问题是否依然存在。这一步不能省因为汉化包对类型注册表项的污染很多时候是不可见的你光看界面看不出异常。卸载汉化包的操作不是直接在“程序和功能”里卸载 LoadRunner你得先找到汉化包的卸载入口有些汉化包是挂在 LoadRunner 安装程序下面的一个补丁项。如果找不到就备份好脚本后干脆把整个 LR 卸载重装英文原版。这里我说个真实经历有个同事的 VUG 总是间歇性报 type not supported他试了所有常规方案都不行。我远程过去一查发现他装了一个非官方渠道的“完美汉化版”装的时候还覆盖替换了核心 DLL。后来我把整个 LR 清理干净装了纯英文原版再把脚本导入报错直接消失。从那以后我对非官方汉化包就一个态度能用原版就别用汉化真要看不懂英文就查词表别拿核心 DLL 开玩笑。3.6 修复方案五彻底卸载重装给环境一个“重新做人”的机会如果前面所有修复步骤都试过报错还是原封不动地立在那那大概率是 LoadRunner 安装目录或注册表项已经存在不可逆的损坏。这时候才轮到重装但重装也要讲究方法不是无脑卸载再装那么简单。第一步在“程序和功能”里正常卸载 LoadRunner。第二步手动删除安装目录默认路径比如 C:\Program Files (x86)\HPE\LoadRunner卸载后目录里往往还有残留尤其是一些日志、补丁备份文件。第三步清理注册表。在开始菜单搜索 regedit打开注册表编辑器定位到 HKEY_CURRENT_USER\Software 和 HKEY_LOCAL_MACHINE\SOFTWARE 下的 HP 或 HPE 相关项。删除之前先备份注册表项万一删错了还能恢复。第四步清理用户级配置。到 C:\Users\用户名\AppData\Local 和 C:\Users\用户名\AppData\Roaming 下查找 HPE、HP、Mercury、LoadRunner 等关键字目录能清就清。第五步重启电脑再重新安装 LoadRunner。装完先不要急着恢复脚本先新建一个最简单的 Web 协议脚本确认 VUG 能正常创建和打开再把你之前备份的业务脚本导回来。这一步做得越干净重装后的环境越稳定。我以前图省事跳过注册表和 AppData 清理直接重装结果装完同一个报错又冒出来白白浪费两个小时后来再也不敢偷这个懒。4. 高频问题速查与避坑清单4.1 我整理的高频场景对照表为了避免大家来回翻上下文我把常见现象、可能原因、处理方向整理成一张速查表。这表不是理论推演是我在多年项目里反复验证过的遇到对应场景可以直接对照着查。现象可能原因优先处理方向打开同事拷来的脚本报 type not supported双方 LR 版本或协议插件不一致先查 .usr 文件 type 值再让对方导出时用压缩包形式发升级 LR 后老脚本打不开新旧版本 type 命名规则变化对照新版本的新建脚本协议列表修正 type 字段装了汉化包后出现报错汉化包覆盖了协议注册项卸载汉化包用英文原版验证64 位系统上跑 LR 仍报 Win32VUG 进程是 32 位加载库位宽不匹配确认安装的是 32 位还是 64 位 LR必要时切换到匹配位宽版本脚本在 Windows 与 Unix 间拷过换行符或编码被改变用文本编辑器另存为 LF/CRLF 正确版本去掉 BOMVUG 录制中强杀导致打不开.usr 文件写入不完整重建脚本复用 .c 文件内容删除插件后出现该报错协议组件不完整用 LR 安装程序执行修复或重装缺失组件4.2 脚本拷贝与传输的避坑指南脚本在团队里流转时的传输方式也是这类报错的高发源头。很多人图方便把脚本目录打了个压缩包就发到微信群或者用 QQ、钉钉在线发送这些方式本身没问题问题出在接收方解压和放置的位置上。我强烈建议LoadRunner 脚本不要直接放在桌面、C 盘根目录或者某些被安全软件实时监控的目录里运行。最佳实践是放在一个干净的项目目录下比如 D:\LRScripts\项目名\业务场景名路径里不要含中文和空格。老版本的 LR 在含中文路径的目录下打开脚本经常出一些莫名其妙的编码问题type 字段解析被影响是很常见的表现。另外传输脚本时尽量用 zip 格式压缩并且让接收方在本地完整解压后再用 VUG 打开。不要直接双击压缩包里的 .usr 文件试图关联打开这在很多环境里会触发临时路径识别失败进而报 not supported。4.3 遇到问题别急着重装的三个判断准则我把这条单独拎出来是因为我在群里见过太多同学一遇到 LR 报错第一反应就是“卸载重装”。重装不是万能的而且重装一次代价很大要装插件、配环境、导脚本半天时间就没了。第一个准则先看报错里的对象是“文件”还是“环境”。如果报错信息里有具体的文件名、type 名先查脚本目录本身八成是文件级问题如果报错信息只有笼统的平台名比如 Win32再往下查环境。第二个准则先试最小化重现。新建一个最简单的脚本看能不能正常创建和打开。如果最简单的脚本都能跑说明 VUG 核心是好的问题大概率出在那个脚本上这时候重装 LR 是帮不上忙的。第三个准则先看最近变化。安装新软件、卸载运行库、打补丁、换汉化包、拷入新脚本这些都属于“最近变化”。报错之前发生了什么往往就是答案的一半。我见过有个同学报错前刚装了一个视频剪辑软件顺带把系统全局的 VC 运行库版本给改了结果 LR 就躺枪了。5. 日常脚本与环境管理把这类报错挡在门外5.1 给团队定一套“协议版本基线”说句不太中听的话LoadRunner 的脚本兼容性并没有大家想的那么强。LR 12 能打开 LR 11 的很多脚本但 LR 11 打开 LR 12 的脚本尤其是用到新协议特性的基本会翻车。所以团队里一定要有一个明确的版本基线。这个基线包含三样东西LoadRunner 主版本、补丁包版本、安装位数32 位还是 64 位。团队里所有人都按照这个基线装环境脚本流转起来才不会互相“看不懂”。之前我带的项目组吃过一次亏我和另一个测试用的 LR 版本差了一个补丁号他导出的 Web Services 脚本在我这边怎么都打不开后来全部统一成同一个版本加补丁就好很多。如果你作为负责人可以把版本基线做成一个简单文档写上“本组统一使用 LR 2021 R2 中文官方原版32 位补丁包 XXXXX安装路径默认”新进组的成员照着配能省掉大量环境类问题。5.2 善用虚拟机和快照给你的 LR 环境上保险这几年我自己有个习惯LoadRunner 一般不装在主力开发机上跑业务而是放在一个专门的虚拟机里装完系统、装完 LR、配好常用协议立刻拍一个快照。后面不管遇到什么疑难杂症不用在泥潭里挣扎太久直接回滚快照五分钟恢复到一个干净可用的环境。快照的代价是磁盘占用和高配置的主机需求但对经常做性能测试的人来说这个投入非常值得。有一次我在虚拟机里试一个来历不明的汉化包装完 VUG 直接打不开试了几种修复都不见效最后直接恢复快照干干净净。如果你不愿意用虚拟机也可以退而求其次把装好 LR 后的纯净环境做一个系统还原点。Windows 系统还原虽然不是万能的但对付运行库、DLL 注册类问题还是有效的。5.3 写脚本时顺手做好“四件套”归档为了减少脚本在多人协作中的损坏概率我现在每完成一个脚本都会把以下四样东西一起归档完整的脚本目录、录制时的业务操作说明、用到的测试数据清单、运行环境信息LR 版本、补丁号、操作系统版本和位数。这样做有什么好处一方面别人拿到脚本时能快速判断“这个脚本是在什么环境下产生的”如果不兼容看环境信息就能提前预估风险。另一方面脚本万一损坏了无法修复至少还能根据业务操作说明重新录制不至于一切从头再来。这部分信息不花多少时间但在关键时刻能救你一命。5.4 哪些情况该考虑 JMeter 而不是 LoadRunner既然热词里带到了 JMeter我也多说两句工具选型的参考。如果你还在为 LoadRunner 各种环境兼容性头秃可以想想是不是工具本就不适合你的场景。LoadRunner 是商业工具功能强、协议全、报告体系完善但它的“重”也是出了名的依赖 Windows 环境、许可证贵、脚本迁移麻烦。如果你们的被测系统是标准 HTTP/HTTPS 协议团队又希望脚本能跨平台、低成本维护JMeter 往往更轻更顺手。特别是压测接口量级大、并发模型复杂的时候JMeter 在分布式压测上的开源生态优势很明显。但如果被测系统涉及复杂协议栈、需要大量真实用户脚本回放和丰富的结果分析LR 的价值还在。我的建议很实际不要神化 LR也不要一竿子打死。小项目用 JMeter大项目、复杂协议、需要商业化支持的场合用 LR。选型从需求出发工具只是手段。回到报错本身。处理 type not supported on Win32 这类问题我的个人经验是先备份再排查能改脚本不重装能重装不无脑重装。很多看起来能把人吓出一身冷汗的报错最后就是 .usr 文件里一行的差别。以后你再看 VUG 弹这种“不支持”提示第一反应应该是打开脚本目录瞧瞧文本文件而不是掏出安装包。毕竟测试环境的环境干净程度直接决定你在脚本排障上要花多少冤枉时间。
返回列表