第八十五章 公证下来(1 / 2)
“也好。我把另一个BUG给留言一下。”
萧天看着张雪的模样,食指大动,眼神也是涣散,不过先把手上的事情解决一下。
毕竟意外的发现了另外一个BUG,萧天可不会错过这样的机会啊,不说其他什么,最起码悬赏再加钱肯定应该是毫无问题的。
天天:维护辅助库中发现了另外一个BUG,应该是一个积年老BUG,代码片段发送给你们了。
发完这句话,萧天才是用大拇指按了按自己的太阳穴,然后笑了笑看着张雪,“这么晚了……你说我们是不是……”
“嗯哼,你想做什么?”张雪微笑着。
“你说呢?”
做了以后,萧天心情极好,自然是继续的想着刚刚的代码,他现在在刚刚舒服的过程中好像有了一点思路,但是得实践才知道。
而通过反复对比正常执行过程和出错误的执行过程,萧天发现出错时,程序多了一条report!
要知道网元返回的信息包括命令返回、alert、report。alert出现就得记录并报错(除非本就预期有这么一条alert),而report一般可以无视,记录然后丢弃就是。
所以没人注意这一点。
而且萧天也知道,测试时网元负荷极低,而且先做过初始化。
因此每次执行应该都差不多,这里多个report,很可能就隐含着什么……
所以萧天也是开始仔细观察程序和网元的交互记录,发现那里的命令返回似乎有些不对。
命令返回有几百行,其中一列是时间,正常来说,时间应该是2019-10-31 18:21:22、2019-10-31 18:21:22、2019-10-31 18:21:23、2019-10-31 18:21:24……这样子一路排下来。
但那段数据,它的时间却是2019-10-31 18:21:22、2019-10-31 18:21:23、2019-10-31 18:21:21、2019-10-31 18:21:22、2019-10-31 18:21:23……
也就是在秒这个级别存在乱序,更具体点实际上是在毫秒级别存在乱序/跳跃,即时间格式为2019-10-31 18:21:22.456 2019-10-31 18:21:22.567这样,其中某些行组之间存在2、300毫秒的跳跃。
萧天按时间连续性把数据分割,发现它的输出是每几条到十几条为一组,组内顺序正常,组间乱序/跳跃;但把这些组挑选、拼接,可以得到两组数据,组内时间顺序良好、间隔均匀。
这说明,这些数据可能是两个命令的返回,不知怎么混到了一起。
就是因为这种混淆使得命令输出格式错乱,这才使得程序把命令返回识别成了report。
于是萧天又看了一下对方的测试笔记,果然,他们测线路备份切换之类功能,所以需要同时控制两个网元;命令在程序中是顺序下发的,间隔可能只有若干毫秒。
看到这里,萧天终于是心里有了底,开始观察程序所在目录,果然在里面找到个dat文件;用十六进制编辑器打开,里面果然是网上传来的原始报文信息,二进制格式。
报文格式是网元编号:信息。
再检查相关代码,很显然,这是因为网元编号被底层通讯模块丢弃了,只把文本信息返回给了上层;这就使得上层无法区分信息来自哪个网元。
平常这样做还没有问题;但遇到同时连接多个网元且需要同时检查多个网元返回、且返回信息还比较多时,数据就乱了。
这个东西太基础。
因为它和上层关系太过紧密,修改它影响太大;而且底层通讯模块的源码已经丢失……
于是,萧天又尝试用字符串分析的办法来恢复它,鉴于不同命令返回格式不同、数据各异,萧天也是用程序尝试识别每个字段的数据类型,然后再检测它是否为有序内容。
萧天把这类列叫“索引列”,索引列有三种,一种是1、2、3这样的数字编号,另一种是网元编号这样一整个都是某个固定数字/字符的,还有就是年月日时分秒这样的时间信息;它们可能同时全部出现,但也可能只出现其中一种,甚至全都没有。
当识别出索引列之后,萧天就把顺序不乱、时间不跳变的若干行视为一个整体;然后像分析单词的“编辑距离”一样,寻找一种使得数据整体上“编辑距离”调整最小的方案,把混淆的数据分隔开。 ↑返回顶部↑
萧天看着张雪的模样,食指大动,眼神也是涣散,不过先把手上的事情解决一下。
毕竟意外的发现了另外一个BUG,萧天可不会错过这样的机会啊,不说其他什么,最起码悬赏再加钱肯定应该是毫无问题的。
天天:维护辅助库中发现了另外一个BUG,应该是一个积年老BUG,代码片段发送给你们了。
发完这句话,萧天才是用大拇指按了按自己的太阳穴,然后笑了笑看着张雪,“这么晚了……你说我们是不是……”
“嗯哼,你想做什么?”张雪微笑着。
“你说呢?”
做了以后,萧天心情极好,自然是继续的想着刚刚的代码,他现在在刚刚舒服的过程中好像有了一点思路,但是得实践才知道。
而通过反复对比正常执行过程和出错误的执行过程,萧天发现出错时,程序多了一条report!
要知道网元返回的信息包括命令返回、alert、report。alert出现就得记录并报错(除非本就预期有这么一条alert),而report一般可以无视,记录然后丢弃就是。
所以没人注意这一点。
而且萧天也知道,测试时网元负荷极低,而且先做过初始化。
因此每次执行应该都差不多,这里多个report,很可能就隐含着什么……
所以萧天也是开始仔细观察程序和网元的交互记录,发现那里的命令返回似乎有些不对。
命令返回有几百行,其中一列是时间,正常来说,时间应该是2019-10-31 18:21:22、2019-10-31 18:21:22、2019-10-31 18:21:23、2019-10-31 18:21:24……这样子一路排下来。
但那段数据,它的时间却是2019-10-31 18:21:22、2019-10-31 18:21:23、2019-10-31 18:21:21、2019-10-31 18:21:22、2019-10-31 18:21:23……
也就是在秒这个级别存在乱序,更具体点实际上是在毫秒级别存在乱序/跳跃,即时间格式为2019-10-31 18:21:22.456 2019-10-31 18:21:22.567这样,其中某些行组之间存在2、300毫秒的跳跃。
萧天按时间连续性把数据分割,发现它的输出是每几条到十几条为一组,组内顺序正常,组间乱序/跳跃;但把这些组挑选、拼接,可以得到两组数据,组内时间顺序良好、间隔均匀。
这说明,这些数据可能是两个命令的返回,不知怎么混到了一起。
就是因为这种混淆使得命令输出格式错乱,这才使得程序把命令返回识别成了report。
于是萧天又看了一下对方的测试笔记,果然,他们测线路备份切换之类功能,所以需要同时控制两个网元;命令在程序中是顺序下发的,间隔可能只有若干毫秒。
看到这里,萧天终于是心里有了底,开始观察程序所在目录,果然在里面找到个dat文件;用十六进制编辑器打开,里面果然是网上传来的原始报文信息,二进制格式。
报文格式是网元编号:信息。
再检查相关代码,很显然,这是因为网元编号被底层通讯模块丢弃了,只把文本信息返回给了上层;这就使得上层无法区分信息来自哪个网元。
平常这样做还没有问题;但遇到同时连接多个网元且需要同时检查多个网元返回、且返回信息还比较多时,数据就乱了。
这个东西太基础。
因为它和上层关系太过紧密,修改它影响太大;而且底层通讯模块的源码已经丢失……
于是,萧天又尝试用字符串分析的办法来恢复它,鉴于不同命令返回格式不同、数据各异,萧天也是用程序尝试识别每个字段的数据类型,然后再检测它是否为有序内容。
萧天把这类列叫“索引列”,索引列有三种,一种是1、2、3这样的数字编号,另一种是网元编号这样一整个都是某个固定数字/字符的,还有就是年月日时分秒这样的时间信息;它们可能同时全部出现,但也可能只出现其中一种,甚至全都没有。
当识别出索引列之后,萧天就把顺序不乱、时间不跳变的若干行视为一个整体;然后像分析单词的“编辑距离”一样,寻找一种使得数据整体上“编辑距离”调整最小的方案,把混淆的数据分隔开。 ↑返回顶部↑