1. 问题复现
界面显示:消息与查看好友按钮无法正常显示
日志信息
2. 判断错误位置
2.1 核心数据类排查
核心数据类存储数据,考怀疑其在存储于提取数据的时候出现错误
修改Protobuf中repeat部分数据的读取
2.2 数据为正确接收或解析
2.2.1 网络请求和响应判断
检验服务器是否正确返回了数据
好友列表中数据的获取没有问题
错误点:客户端发送获取会话列表请求后,没有正确序列化数据,从而导致错误
2.2.1.1 服务器没有正确序列化响应分析
检查服务器在获取最近消息请求处理逻辑
结论:getRecent函数没有运行,根本没有解析请求,向上继续寻找没有解析请求的原因
向上检查路由配置是否错误
结论:路由地址配置没有错误,向上溯源
检查服务端构建响应
结论:响应ID获取问题解决
2.2.2 检查客户端的响应处理
响应ID正常,但是点击最近消息与好友列表的时候,显示的内容是一样的,开始排查显示显示问题
添加日志,判断服务器是否正确解析请求和构建响应
2.4 数据显示逻辑问题
切换问题回顾,在切换逻辑中出现空白以及会话信息和好友信息无法恢复,检查主窗口中的窗口切换逻辑是否有错误
结论:该处代码书写存在逻辑错误,也就是在切换好友列表后,函数错误的将当前活动窗口设置成会话列表,并加载会话列表的数据
切换逻辑修复后
3. 总结
3.1 主要问题
- 会话列表显示空白:从服务器获取会话列表的时候,客户端初始显示空白内容个
- 请求与响应requestId不匹配问题:当获取最近消息的时候,客户端无法正确的处理服务器的响应,最终导致requesId为空的问题
- 页面切换逻辑问题:程序运行后,会话列表切换到好友列表的时候,会话列表界面没有更新数据,仍然是好友列表的数据
3.2 问题分析
初步对问题分析,综合前后端交互逻辑,以及日志打印的错误信息初步判断其位置,然后逐步细化,向上检查,最终实现解决错误。
- 会话显示空白:客户端从服务器中获取会话数据的时候,没有正常的显示数据,可能在客户端请求或者服务端响应方面出现问题
- 请求ID不匹配:初始错误在日志中显示,请求ID为空,也就是没有获取正确的ID值,需要上溯到其函数判断为什么没有获取
3.3 排查流程分析
DataCenter类中析构函数和构造函数排查
数据核心类中在构造函数中错误删除了还没有初始化的成员指针,这也就直接导致了初始化不成功,数据获取失败。
结果:修正内存问题后,但是问题没有修复,依旧保持原样
服务端requestId设置问题排查
服务器在构建响应的时候,没有将请求中的requestId赋值给响应对象,导致了客户端接收响应的时候requesdId为空。
pbRsp.setRequestId(pbRsp.requestId()); // 错误:应从请求对象获取requestId
pbRsp.setRequestId(pbReq.requestId()); // 正确:从请求对象获取并设置requestId
修正后客户端就可以正确的接收处理响应中的requestId
界面逻辑错误
切换好友列表后,当前页面设置错误,也就是在好友列表中调用了获取最近会话列表,导致界面显示错误
# 错误代码
void MainWidget::switchTabToFriend()
{
//记录当前切换到哪一个标签页
activeTab = FRIEND_LIST;
//转换图标状态
sessionTabBtn->setIcon(QIcon(":/resource/image/session_inactive.png"));
friendTabBtn->setIcon(QIcon(":/resource/image/friend_active.png"));
applyTabBtn->setIcon(QIcon(":/resource/image/apply_inactive.png"));
//主窗口加载会话列表
this-> //记录当前切换到哪一个标签页
activeTab = SESSION_LIST;
//主窗口加载会话列表
this->loadSessionList();
}
# 修改后
void MainWidget::switchTabToFriend()
{
LOG() << "Switching to Friend List tab";
// 记录当前切换到好友列表标签页
activeTab = FRIEND_LIST;
// 转换图标状态
sessionTabBtn->setIcon(QIcon(":/resource/image/session_inactive.png"));
friendTabBtn->setIcon(QIcon(":/resource/image/friend_active.png"));
applyTabBtn->setIcon(QIcon(":/resource/image/apply_inactive.png"));
// 主窗口加载好友列表
this->loadFriendList();
}
日志辅助测试
排查错误中,在关键步骤中添加日志输出,例如在请求发送、响应接收以及数据加载中,主要用于实时跟踪程序运行的状态以及数据的流向。
3.4 反思
首先,关注内存管理,仔细检查构造和析构函数,确保对象的初始化与资源释放,防止未定义以及内存泄漏现象
其次,实现客户端和服务端前后端交互的时候,确保每个请求ID一致,保证其序列化和反序列化逻辑正确
日志在项目错误排查中会起到很大作用,项目开发中的日志应该规范并详细,这样在出现错误的时候,才可以快速的排查出错误
最后,开发出具体的功能后,要 对开发的功能进行完整的测试,确保其逻辑正确,同时还有方式异常情况的发生