在1990年代,我在一家电信公司做嵌入式软件工程师。他们决定向一个新的方向发展,并将新设备的设计和编程外包出去。该设备对每个客户都有几个独特的配置选项。

IT部门设计了一个数据库程序来配置和维护信息。每一个单元都被封装在一个装着一个小的断流器的盒子里,电源和串行连接可接到该单元上,这样它就可以在装运前进行配置。

制造商提供了一个windows动态链接库(DLL),这样数据库程序就可以与设备通信,检索单元的序列号,并下载配置数据。

随着生产的开始,运输部门遇到了一个问题。他们用来配置这些单元的个人电脑在1到3种配置后随机碰撞,需要重启电脑。在这两周后,运输部经理一直急得掉头发,因为IT部门没能解决这个问题。所以他来找我的老板,而老板选我去帮忙。

首先,我来到航运部门,观察他们的流程,看看他们是否做错了什么。它们与设备连接没有问题,而第一个配置总是没问题的。只有在一个配置完成后,PC才会崩溃需要重新启动。

然后我去了IT部门,经理张开双臂迎接我(实际上并不是!)在终于说服他让我看一看也不会有什么错后,我被护送去见程序员。

程序员对我的帮忙表示欢迎,他给了我DLL源代码和他的程序的副本,告诉我他的程序是如何工作的。他使用的是一种高级的数据库编程语言,该语言可以自动处理许多较低层次的细节。

我以前从来没有在PC上做过任何设备级编程,但是我擅长C语言(DLL语言),以前也做过一些有限的数据库编程。于是我从DLL代码开始,特别认真的检查了它的数据库程序接口。大约半个小时后,我想我知道问题出在哪里。

DLL需要一个指向内存位置的指针,从而能存储单元序列号。然后,它将接收配置数据并将其传递给设备以进行存储。高级数据库程序将指针传递给DLL,但是因为它不知道序列号变量的长度,所以它没有预留任何空间。当DLL返回序列号时,它被写入堆栈上的一个位置,这些数据有时候会会被恢复,其他时间会崩溃。

我把我的怀疑反馈给程序员,他先为序列号预留了空间,然后把指针传递给DLL。问题解决了!我们发货了成千上万个这样的单位,运输部经理一直对我赞口不绝,甚至传到公司总裁耳中。

有时候,解决问题还真得门外汉上。亲爱的EDN读者们,你们有没有过类似解决问题的经历?欢迎分享。

(本文授权翻译自EDN美国版,Sometimes it takes an outsider,胡安编译)

20160630000123