[Bug]: 崩服
Describe the bug
这两次崩服都有关LeviOptimize和LeviTPSystem,不清楚是LeviOptimize本身造成的崩溃还是LeviOptimize和LeviTPSystem有冲突?
To Reproduce
暂时不知道怎么复现的,醒来就发现崩服了两次
Expected behavior
不崩服
Screenshots
No response
Platform
win10
BDS Version
1.21.50
LeviLamina Version
1.0.1
Version
0.4.0
Additional context
1
deep seek的回复: 从提供的崩溃日志来看,崩溃发生在 LeviOptimize.dll 的哈希表查找操作中,可能与玩家对象(Player*)的无效访问有关。以下是关键分析:
崩溃原因推测 悬垂指针或空指针访问 堆栈显示崩溃发生在 phmap::priv::raw_hash_set(一个哈希表容器)的 find 函数中,用于通过玩家名称(std::string)查找 Player*。
可能触发了以下问题: 玩家对象已被销毁(如玩家退出游戏),但哈希表中仍保留其指针(悬垂指针)。 并发访问冲突(如多线程操作哈希表未加锁)。 哈希表键值异常(如字符串损坏或空字符串)。 崩溃触发路径 调用链如下:
TpaRequest::_deny (拒绝传送请求) → sendText (向玩家发送消息) → LevelQueryPlayer2::detour (查询玩家对象) → phmap 哈希表查找崩溃 可能是玩家在提交表单(如拒绝传送请求)后,服务器尝试通过名称查找玩家对象,但此时玩家已离线或对象被释放。
关键代码位置 LeviOptimize.dll phmap.h:1776 的哈希表查找逻辑(可能涉及 Player* 生命周期管理问题)。 PlayerLookupOpt.cpp:71 LevelQueryPlayer2::detour 中调用哈希表查询的代码。 TpaRequest.cc:105 拒绝传送请求时调用了 sendText,可能传递了无效的玩家对象。 修复建议 验证玩家对象有效性 在 LevelQueryPlayer2::detour 中增加指针有效性检查:
if (player && player->isValid()) { // 操作 Player* } 使用弱引用或智能指针 将 Player* 替换为 std::weak_ptr<Player> 或引用计数机制,避免悬垂指针。
同步玩家对象生命周期 确保玩家退出时从哈希表中移除对应条目(监听玩家退出事件并清理数据)。
检查第三方模组兼容性 LeviOptimize.dll 和 LeviTPSystem.dll 可能存在兼容性问题,建议更新到最新版本或联系开发者提供日志。
调试信息增强 在崩溃位置打印更多上下文信息(如玩家名称、哈希表状态),帮助定位具体触发条件。
总结 崩溃极可能是由于 已销毁的 Player* 被访问 导致。建议优先检查玩家对象生命周期管理逻辑,确保哈希表数据与玩家在线状态同步。如果是第三方模组问题,需开发者进一步修复。
这个查询玩家的优化在高版本已删除,检查一下更新到最新版后是否仍能复现
这个查询玩家的优化在高版本已删除,检查一下更新到最新版后是否仍能复现
我BDS还在1.21.50,所以暂时没法升级最新版,但是我已经把那个配置文件开关关了,有时还会崩服
这个查询玩家的优化在高版本已删除,检查一下更新到最新版后是否仍能复现
BDS 1.21.60 LL 1.1.1 LO 0.5.1
这是配置文件:
升级后依然崩服,看样子是 optSeenPercent 造成的崩服
LeviOptimize v0.5.1 BDS 1.21.60 LL 1.1.1 依然崩服,