Assertion failure: thing, at...gc/Marking.cpp:112

本文记录了一个在Cocos2d-x2.x版本中使用JSB时遇到的严重Bug,该Bug导致垃圾回收(GC)过程出现崩溃。具体表现为在特定条件下使用cc.Class.extend创建的对象作为回调函数的目标时,会导致程序在GC时失败。文章详细描述了问题的现象、原因及最终解决方案。

 

 

遇到个jsb的bug,全公司的人整整折腾了2天!!

描述:

下面代码,在GC后,程序崩溃,错误log输出如下:

Assertion failure: thing, at /Users/james/Project/Spidermonkey/js/src/gc/Marking.cpp:112

代码:

var FightActionAttack = cc.Class.extend({
    init: function (attacker) {
        var self = this;
        attacker.getAnimation().play("normalAttack");
        attacker.getAnimation().setMovementEventCallFunc(this._movementAttackEvent, this);
    },

    _movementAttackEvent: function (armature, movementType, movementID) {

    },

    _frameAttackEvent: function (bone, evt, originFrameIndex, currentFrameIndex) {

    }
});

原因:

cocos2d-x 2.x版本的jsb中,不能使用继承只cc.Class的对象做CallbackFunc的回调target,

因为这种直接集成自cc.Class的对象做callback回调的target,会把gc搞崩溃。 

解决办法是,集成cc.Node

<think>我们正在解决一个具体的技术问题:在JMeter中使用JSR223断言(Groovy语言)检查JSON响应中的`total_tokens`字段值是否大于150,并处理字段缺失的情况。解决方案步骤:1.获取HTTP请求的响应数据。2.解析JSON格式的响应数据。3.检查是否存在`total_tokens`字段。4.如果存在,判断其值是否大于150。5.如果不存在,抛出异常(断言失败)。6.如果存在且值不大于150(即<=150),也抛出异常(断言失败)。在JMeter中,我们可以使用JSR223断言元件,选择Groovy语言来编写脚本。注意:在JMeter中,可以通过`prev`(即`SampleResult`)获取响应数据。在JSR223断言中,我们可以使用`prev.getResponseDataAsString()`来获取响应的字符串。具体脚本如下(已按照用户要求处理字段缺失和数值判断):</think> ### 使用Groovy实现JSR223断言验证total_tokens值 以下是完整的JSR223断言配置步骤,通过Groovy脚本验证`total_tokens`字段值是否大于150,并处理字段缺失的情况: ```groovy // 1. 获取JSON响应数据 def response = new groovy.json.JsonSlurper().parseText(prev.getResponseDataAsString()) // 2. 检查字段是否存在 if (!response?.usage || !response.usage.containsKey('total_tokens')) { throw new AssertionError("❌ 响应中缺失total_tokens字段") } // 3. 获取total_tokens值并进行整数转换 def totalTokens = response.usage.total_tokens as Integer // 4. 核心验证逻辑 ($totalTokens > 150$) if (totalTokens <= 150) { // 失败时显示具体值 throw new AssertionError("断言失败: total_tokens = ${totalTokens} ($\leq$150)") } // 5. 验证成功时无输出 (JMeter标记为成功) ``` #### 配置步骤: 1. **添加断言** HTTP请求 → 右键 → 添加 → 断言 → JSR223断言 2. **语言设置** ```groovy Language: groovy ``` 3. **脚本位置** ```groovy Script: 粘贴上述代码 ``` 4. **性能优化** ```groovy ☑ Cache compiled script if available ``` #### 错误处理说明: | 场景 | 输出示例 | 解决方案 | |------|----------|----------| | 字段缺失 | `❌ 响应中缺失total_tokens字段` | 检查JSON结构或API文档 | | 值≤150 | `断言失败: total_tokens=100 (≤150)` | 确认token计算逻辑 | | 类型错误 | `java.lang.ClassCastException` | 添加`as Integer`类型转换 | > **重要提示**:如果您的JSON结构嵌套更深(如`response.data.usage`),需要修改路径为: > ```groovy > def totalTokens = response.data.usage.total_tokens as Integer > ``` > 通过`prev.getResponseDataAsString()`查看完整响应可确定正确路径[^1]。 #### 测试用例验证: | HTTP响应 | 预期结果 | |---------|---------| | `{"usage":{"total_tokens":200}}` | ✅ 成功 | | `{"usage":{"total_tokens":100}}` | ❌ 失败 | | `{"error":"invalid request"}` | ❌ 失败 (字段缺失) | [^1]: JMeter官方建议使用`View Results Tree`检查响应结构。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值