C语言中措施时序问题的排查进程
当前位置:以往代写 > C/C++ 教程 >C语言中措施时序问题的排查进程
2019-06-13

C语言中措施时序问题的排查进程

C语言中措施时序问题的排查进程

副标题#e#

对付由多个模块协同事情的软件来说,措施处理惩罚的时序长短常重要的。当动静处理惩罚的顺序呈现杂乱时,措施就会呈现异常。

本文基于作者的实际项目履历,对软件模块之间的时序问题举办了具体的阐明,为相关软件问题的阐明及办理提供了有益的参考。

一、问题描写

在某软件版本中,有两个模块(模块A与模块B)之间要举办通信。通信链路成立起来之后,模块A向模块B动员静,动静中携带了用户号码及序列号。在动静发送乐成之后,模块A凭据序列号将用户号码存放到一个全局变量中。

模块B在吸收到模块A发的动静之后,理会出用户号码,并举办相关的处理惩罚。在处理惩罚完成之后,模块B将用户号码及序列号原样返回给模块A。模块A先按照吸收到的序列号来查找原发送的用户号码,并与吸收到的模块B返回的用户号码举办较量。若用户号码沟通,则举办后续处理惩罚。

模块A与模块B之间的通信如图1所示。

C语言中法子时序问题的排查历程

图1 模块A与模块B之间的通信

在该软件版本举办自测的进程中,发明模块A发送的用户号码与模块B返回的用户号码不能匹配,故后续流程无法继承。

查察模块A的日志,打印的发送的用户号码和吸收的用户号码是一样的,序列号也是沟通的,但在用strncmp函数(用户号码变量为字符串范例)举办较量时就呈现了问题。

二、模块A的措施执行流程

由于用户号码的较量是在模块A中完成的,因此这里主要存眷模块A的措施执行流程。

模块A的措施执行流程如图2所示:

C语言中法子时序问题的排查历程

图2 模块A的措施执行流程

从图2可以看出,在模块A与模块B的动静交互进程中,时序显得很是的重要。假如动静的处理惩罚顺序没有界说好,就会呈现模块A措施异常终止的环境。


#p#副标题#e#

三、问题原因劈头阐明

为了确定发送的用户号码和吸收的用户号码是否真的纷歧样,我们在对两个号码举办较量的措施语句之前加了具体的日志,想要打印出发送的用户号码、序列号和吸收的用户号码、序列号。

日志加好之后,我们从头运行了措施,发明吸收的用户号码和序列号是正确的,而发送的用户号码和序列号打印出来的是空值。

怎么会这样呢?莫非在发送的时候没有将用户号码和序列号拷贝到全局变量中去?

我们又在拷贝发送用户号码和序列号的措施语句之后加了日志,想要打印出发送的用户号码和序列号的值。从头运行措施之后,发明发送的用户号码和序列号是正确的,看来拷贝照旧乐成了的。

通过以上的阐明,可以根基确定拷贝息争析都没有问题,看来大概是处理惩罚时序导致了用户号码不能匹配的问题。

四、问题定位

我们又将日志具体地查察了一遍,发明白一个奇怪的现象,那就是日志中打印出的吸收模块B返回动静的时间要比拷贝用户号码及序列号的时间早。

为什么呢?我们比较查察了一下代码,发此刻将动静发送到模块B之后,模块A休眠了一段时间之后再进动作静的拷贝。而模块B在极短的时间之内就返回了动静,此时模块A还处在休眠期,没有来得及将动静拷贝到全局变量中。

莫非就是模块A休眠时间惹的祸?为了验证我们的意料,我们直接将执行休眠的代码注释掉了来举办测试。措施从头运行之后,再查察日志,发明一切正常了,没有打印出模块A发送的用户号码与模块B返回的用户号码不能匹配的信息,并且模块A的后续流程也都执行到了。看来真是这个休眠时间肇事了。

确实是这样的,模块B返回动静的时间极短,这样当在与全局变量中的用户号码举办较量时,其实是一个字符串范例的用户号码在与一个空值举办较量,虽然会呈现问题。这也与发送的用户号码和序列号打印出来的是空值的事实相吻合。

既然真相已经懂得,我们就着手修改代码,将模块A中凭据序列号拷贝用户号码到一个全局变量的代码放到了发送动静到模块B的代码之前,保存模块A休眠的代码。从头对修改后的措施举办了测试,一切就OK了。

五、总结

在本次时序问题的进程排查中,主要依靠措施日志来定位问题。

通过本次问题排查,我们总结出的履历有以下几个:

(1) 详尽的日志有助于问题的定位。为了更清楚地相识问题呈现的位置,我们可以在措施的要害语句处添加上一些测试日志,供阐明所用。

(2) 在动静处理惩罚顺序很重要的措施中,必然要理清措施执行的前后干系,防备流程“越位”的环境产生。

(3) 在排盘查题的进程中,不要放过任何一个蛛丝马迹,要实时验证本身的想法,多对措施举办测试。

#p#分页标题#e#

是措施就会有bug,因此,我们不要对措施中呈现的问题铭心镂骨,要把握排盘查题的要领,这样才气够做到“以稳定应万变”。通过办理差异的问题,我们才气获得熬炼,我们的开拓本领才会获得提高。

From:csdn博客 周兆熊

    关键字:

在线提交作业