C语言中程序时序问题的排查过程2015-01-20对于由多个模块协同工作的软件来说,程序处理的时序是非常重要的。当消息处理的顺序出现混乱时,程序就会出现异常。本文基于作者的实际项目经验,对软件模块之间的时序问题进行了详细的分析,为相关软件问题的分析及解决提供了有益的参考。一、问题描述在某软件版本中,有两个模块(模块A与模块B)之间要进行通信。通信链路建立起来之后,模块A向模块B发消息,消息中携带了用户号码及序列号。在消息发送成功之后,模块A按照序列号将用户号码存放到一个全局变量中。模块B在接收到模块A发的消息之后,解析出用户号码,并进行相关的处理。在处理完成之后,模块B将用户号码及序列号原样返回给模块A。模块A先根据接收到的序列号来查找原发送的用户号码,并与接收到的模块B返回的用户号码进行比较。若用户号码相同,则进行后续处理。模块A与模块B之间的通信如图1所示。

图1 模块A与模块B之间的通信
在该软件版本进行自测的过程中,发现模块A发送的用户号码与模块B返回的用户号码不能匹配,故后续流程无法继续。查看模块A的日志,打印的发送的用户号码和接收的用户号码是一样的,序列号也是相同的,但在用strncmp函数(用户号码变量为字符串类型)进行比较时就出现了问题。二、模块A的程序执行流程由于用户号码的比较是在模块A中完成的,因此这里主要关注模块A的程序执行流程。模块A的程序执行流程如图2所示:

图2 模块A的程序执行流程
从图2可以看出,在模块A与模块B的消息交互过程中,时序显得非常的重要。如果消息的处理顺序没有定义好,就会出现模块A程序异常终止的情况。