问题现象
发包机 结果csv文件,不同progid指向同一视频路径问题
原因分析
节目id和节目路径映射关系
设计上,使用uuid作为节目id,然后与节目路径生成一一映射,保存在std::map<std::string,std::string>中,所以理论上不会出现多对一。
uuid数据
UUID是一个16字节的二进制数据,通过uuid_unparse()将UUID装换成可读的字符串(36字节)。例如,“00a14a12-a6c2-4484-93f4-c6bcd58efa70”。注意:UUID的二进制原始数据 和 转换后的可读字符串。
流程分析
发包机
发包机对progid的处理可以概括为
步骤1:建立progid-视频路径的映射表
步骤2:接收收包机的progid,从映射表中找到progid对应视频路径
步骤1:映射表创建的实现
std::map<std::string, std::string> progid_filename;
char ac_str[64] = {0};
char uuid[16] = {0};
uuid_generate((unsigned char*)uuid);
// 问题就出现在这一句
// 将uuid的二进制数据作为映射表的progid
progid_filename.insert(std::pair<std::string, std::string>(uuid, file_name));
将UUID的二进制数据装成std::string,会出现数据异常,UUID中的二进制数据被当作字符串处理,由于二进制数的随机性,就可能会导致string(uuid)数据的随机性。如下图所示:
解决办法
std::map<std::string, std::string> progid_filename;
char ac_str[64] = {0};
char uuid[16] = {0};
uuid_generate((unsigned char*)uuid);
// 将uuid的unparse后的字符串作用映射表的progid
uuid_unparse((const unsigned char*)uuid, ac_str);
progid_filename.insert(std::pair<std::string, std::string>(ac_str, file_name));
感悟
虽然问题解决了,但是在定位这个问题的过程中,花费了大概5小时的时间。这是自己内心不可接受的地方,复盘了一下自己定位问题的过程,虽然最开始就是先从源头开始查找问题原因,检查步骤1中创建的映射表是否正确,虽说思路是对的,但是在具体执行过程中出现了一些偏差,导致得到了步骤1的结果是正确的错误结论,使得将自己的查找重心放到其他地方,而南辕北辙,浪费了时间。在和小辉辉(我同事)分享这个事情的经过时,他说到:你就是懒呗。看似无心的一句话,却引起了我的反思,的确,就是因为懒,懒得再写几行调试代码,没有将创建完的映射表,直接打印看看。如果这样的话,可能5分钟就能定位到问题了,效率提高60倍,难道不香么!
定位bug是一个综合性的梳理过程,凭借着自己的知识、技能、经验,验证每一个步骤的正确性,如果某一个步骤的结论误认为正确,会导致后面步骤的验证全是白费,一定要遵从客观规律。而这个过程,我似乎也能读到人性,读到人生,我是觉得,人的一生一直伴随着和自己的内心深处的惰性做抗争,人生的每一个阶段就是一个步骤,如果因为懒惰或者妄想,不能验证好每一个步骤,可能就需要花费60倍甚至更大的代价来弥补,然而,时光一去不复返。
技术是一面人性的照妖镜,在它面前,你就是你,来不得半点虚假。