测试前请注意当前系统时间正确与否是否重要
因为调整系统时间之后很可能出现服务器不可用的情况
遇到这种情况一般可以想办法换个IP去同步
比如我这里PPP方式联网就是断开重连
如果系统时间和服务器时间偏差太大导致此Bug被触发
可以添加"-b"参数来强制使用step(步进)方式同步
触发Bug的命令:
代码: 全选
date -s @$((`date +%s` +100000)); ./ntpdate -p 1 cn.pool.ntp.org
ntpdate.c代码:
代码: 全选
if (always_step) {
dostep = 1;
} else if (never_step) {
dostep = 0;
} else {
absoffset = server->soffset;
if (absoffset < 0)
absoffset = -absoffset;
//由于前面的if,absoffset应该不可能是负数,但是我加上这段调试代码输出却发现absoffset是负数
//absoffset为负数后就导致了dostep变量的数值异常,结果该"step"(步进)时却进行"adjust"(微调)了
//absoffset的类型应该也没弄错,是int32,应该就是用%d输出吧?
//msyslog这个函数我也没弄明白,只是照着printf猜的用法
//但从ntpdate的外部行为推测,dostep变量确实发生了异常
msyslog(LOG_NOTICE, "absoffset: %d \n NTPDATE_THRESHOLD :%d",absoffset,NTPDATE_THRESHOLD);
dostep = (absoffset >= NTPDATE_THRESHOLD || absoffset < 0);
}
if (dostep) {
if (simple_query || debug || l_step_systime(&server->offset)){
msyslog(LOG_NOTICE, "step time server %s offset %s sec",
stoa(&server->srcadr),
lfptoa(&server->offset, 6));
}
} else {
#ifndef SYS_WINNT
if (simple_query || l_adj_systime(&server->offset)) {
msyslog(LOG_NOTICE, "adjust time server %s offset %s sec",
stoa(&server->srcadr),
lfptoa(&server->offset, 6));
}