背景
C++ 在使用redis时使用的是hiredis库,在项目中碰到一个问题,某天钉钉提示服务catch error,于是就分析保存的dump
dump 路径
链接:https://pan.baidu.com/s/1CdhOVKwtP5fabTyab8UTDw
提取码:8ull
分析过程
.ecxr
加载符号文件,然后‘.ecxr’ ‘kv’
1 | 0:018> .ecxr |
因为有类似经验(看过hiredis解析代码),猜测应该就是有特殊字符(比如 % 等)导致
查看参数
通过 ‘local’ 查看CSockServer::OnLogon 对应代码的参数,发现 其中imei 字符串中包含了 ‘%’ ,然后再编写demo验证,问题必现。
解决方法
知道原因,解决方法就很多了,
- 可以用标准的redis方法void redisCommand(redisContext c, const char *format, …);
- 我使用的是替换法:
1
2
3
4inline void redis_cmd_escape(std::string &str)
{
replace_all(str, "%", "%%");
}