admin管理员组

文章数量:1516870

Redis 命令拼写错误:

接 集群(八)的笔记, 测试出现的问题

客户端 登录出现下列这个错误:

terminate called after throwing an instance of 'nlohmann::json_abi_v3_12_0::detail::parse_error'
  what():  [json.exception.parse_error.101] parse error at line 1, column 1: attempting to parse an empty input; check that your input string or stream contains the expected JSON
  • 程序用 nlohmann::json (这个 JSON 库)去 解析一个 JSON 字符串
  • 但是传进去的字符串是 空的 (根本没东西,连 {} 都没有)。
  • 所以它抛出了 parse_error 异常。

这个错误 有两种情况:

  • 要么 就是 json本身传输有问题—客户端和服务端

  • 要么 就是 redis 提前结束了

很可能是:
_redis.subscribe(id); 的时候,Redis库里出现了问题

  • 订阅之后 ,Redis客户端(比如 redis-plus-plus) 会新起一个线程监听订阅消息

  • 但是你的 Redis 客户端用法可能不对, 导致订阅线程把程序搞崩了

  • 于是服务器自己断开了 TCP 连接,客户端收到空包,再去 json::parse ,就炸了。----- 这是客户端收到那个错误的 主要原因!!!

总结一句话:问题不是你后面的登录逻辑写错了,是 _redis.subscribe(id) 之后 Redis那边出锅了。

解决办法:

经过测试, 确实是 订阅出问题了

把 redis 命令 拼写错了-----> 导致 没有订阅成功 , 在 oberver_channel_message() 独立线程 发送得到了 错误, reply 接收的 是这个错误, reply 在if 那里 使得 整个程序退出了, 应该是 访问了非法内存

根本原因是 reply 的结构不符合预期 ,导致访问了非法内存

线程中出现段错误 会导致整个 进程 终止,因为所有线程共享同一地址空间,段错误触发的 SIGSEGV 信号会影响整个进程。

本文标签: 错误要么编程