况;而测试中遇到此类死机问题,则要耐心的定位到具体是执行哪句代码时出现 的,再进行分析。因为问题很隐蔽,直接分析海一样的代码是很难发现的。 4、变量类型定义错误 【案例141】 【正 文】 在FRI板上建几条 FRPVC,其DLCI类型分别为:10B2 bytes、 10b3 bytes、16bi3 bytes、17bit/4 bytes、23bit/4 bytes。相应的DLCI值为:16 234、991、126975、1234567,然后保存,重起MUX,观察PVC的恢复情况,结 果DLCI值为16、234和991的PVC正确恢复,而DLCI=126975的PⅤC恢复的数据 错误为61439,而DLCI=1234567的PVC完全没有恢复 对于17/4类型,DLCI=126975的PVC在恢复时变成61439,根据这条线 索,查找原因,发现126975-61439=65535,转化二进制就是100000000000 也就是说在数据恢复或保存时把原数据的第一个1给忽略了。此时第一个想法是: 在程序处理中,把无符号长整型变量当作短整型变量处理了,为了证实这个判断 针对17b4 bytes类型又重新设计测试用例:(1)先建PVC,DLC1=65535,然 后保存,重起MUX,观察PⅤC的恢复情况,发现PVC能够正确恢复 (2)再建PⅤC,DLCI=65536,然后保存,重起MUX,观察PVC的恢复情况, 此时PⅤC不能正确恢复。 至此基本可以断定原因就是出在这里。带着这个目的查看原代码,发现在以下代 码中有问题: int Get FrDIci( DWORD* dwDIci, char* str, DWoRd dwDIciType, DWORD dwPort Type, DWORD dwSlotID, DWORD dwPortID) dWoRd tempdlci harszarg[80]: charszline[80 ID LOWPVCEP dWoRd dw[5J2
况;而测试中遇到此类死机问题,则要耐心的定位到具体是执行哪句代码时出现 的,再进行分析。因为问题很隐蔽,直接分析海一样的代码是很难发现的。 4、变量类型定义错误 【案例1.4.1】 【正 文】 在FRI板上建几条FRPVC,其DLCI类型分别为:10Bit/2bytes、 10bit/3bytes、16bit/3bytes、17bit/4bytes、23bit/4bytes。相应的DLCI值为:16、 234、991、126975、1234567,然后保存,重起MUX,观察PVC的恢复情况,结 果DLCI值为16、234和991的PVC正确恢复,而DLCI=126975的PVC恢复的数据 错误为61439,而DLCI=1234567的PVC完全没有恢复。 对于17/4类型,DLCI=126975的PVC在恢复时变成61439,根据这条线 索,查找原因,发现126975-61439=65535,转化二进制就是10000000000000000, 也就是说在数据恢复或保存时把原数据的第一个1给忽略了。此时第一个想法是: 在程序处理中,把无符号长整型变量当作短整型变量处理了,为了证实这个判断, 针对17bit/4bytes类型又重新设计测试用例:(1) 先建PVC,DLCI=65535,然 后保存,重起MUX,观察PVC的恢复情况,发现PVC能够正确恢复; (2)再建PVC,DLCI=65536,然后保存,重起MUX,观察PVC的恢复情况, 此时PVC不能正确恢复。 至此基本可以断定原因就是出在这里。带着这个目的查看原代码,发现在以下代 码中有问题: int _GetFrDlci( DWORD* dwDlci, char* str, DWORD dwDlciType, DWORD dwPortType, DWORD dwSlotID, DWORD dwPortID) { DWORD tempDlci; charszArg[80]; 1 charszLine[80]; ID LowPVCEP; DWORD dwDlciVal[5][2] =
{16,1007},{16,1007},{102464511} 2048,129023},{131072,4194303}}; typedef struct tag FrPpplntIWF WORD wHdIcPort WORD wHdlcDIci WORD wPeerHdlcDIci WORD wPeerOld AtmPort s SFrPpplntI WFData DWORD Save FrNetIntI WFData(DWORD pdw Write Point bYte bSlotId. bPeerSlotID dWord dwccid. dwPeerCCID WORD wHdIcPort, wAtmPort, wIci, wPeerIci, w PeerHdIcPort WORD W Count DWORD SaveFrNetExtI WFData( DWORD pdw WritePoint bYte bSlotID dWord dwCciD. dwPeerCCID WORD wHdIcPort. wAtmPort wIci WORD WCount
{ {16,1007}, {16,1007}, {1024,64511}, {2048,129023}, {131072,4194303} } ; ... } typedef struct tagFrPppIntIWF { ... WORD wHdlcPort; WORD wHdlcDlci; WORD wPeerHdlcDlci; WORD wPeerOldAtmPort; ... } SFrPppIntIWFData; DWORD SaveFrNetIntIWFData ( DWORD *pdwWritePoint ) { BYTE bSlotID, bPeerSlotID; DWORD dwCCID, dwPeerCCID; WORD wHdlcPort, wAtmPort, wIci, wPeerIci, wPeerHdlcPort ; WORD wCount; ... } DWORD SaveFrNetExtIWFData ( DWORD *pdwWritePoint ) { BYTE bSlotID; DWORD dwCCID, dwPeerCCID; WORD wHdlcPort, wAtmPort, wIci ; WORD wCount;
unSev Data FrNetExtI WFLwCount] bSlotID =bSlotID; unSevData. FrNet ExtIWFLwCount] wHdIcPort =wHdIcPort unSevData. FrNetExtI WFlwCount] wHdIcDlci gFrPVCEP[ I[ gFrPVCCIbSlotiD]dw CCID].dwLoPVCEP ] dwDLCI unSev Data FrNet ExtI WFlwCount]. wOldAtmPort wAtmPort unSevData. FrNetExtIwFlwCount wAtmDIci gFrPVcEPI bSlotiD gFrPVCC[bSlotIDdwCCID] dwHiPVCEP ] dw DLCI unSevData. FrNetExtI Count . dwMapMode gFrPVCC[bSlotIDIIdwCCID].dwMap Mode; DWORD RestoreFrNet ExtIWFData( WORD wSlotID, BYTE pRead Point WORD wCount. w TotaINetIWF BYTE bSlotID, bHdIcDIciType, bAtmDIciType WORD wOld AtmPort, wAtmDIci, wHdlcPort, wHdlcDIci DWoRd dw Mode, dwCiR, dwBe dWord dwCCID. dwResult. dwAtmPort wTotalNet]WF=g MuxData SevDataSize w FrNet ExtIWFNum DWORD Restore FrHdlcIntI WFData( WORD wSlotID, BYTE"pRead Point WORD wCount w TotalHdIcI WF dword dw CCID. dwPeerCCID dwAtmPort. dwPeer Atm Port DWoRd dwResult
... unSevData.FrNetExtIWF[wCount].bSlotID = bSlotID; unSevData.FrNetExtIWF[wCount].wHdlcPort = wHdlcPort; unSevData.FrNetExtIWF[wCount].wHdlcDlci = gFrPVCEP[bSlotID ][ gFrPVCC[bSlotID][dwCCID].dwLoPVCEP ].dwDLCI; unSevData.FrNetExtIWF[wCount].wOldAtmPort = wAtmPort; unSevData.FrNetExtIWF[wCount].wAtmDlci = gFrPVCEP[ bSlotID ][ gFrPVCC[bSlotID][dwCCID].dwHiPVCEP ].dwDLCI; unSevData.FrNetExtIWF[wCount].dwMapMode = gFrPVCC[bSlotID][dwCCID].dwMapMode; ... } DWORD RestoreFrNetExtIWFData ( WORD wSlotID, BYTE *pReadPoint ) { WORD wCount, wTotalNetIWF; BYTE bSlotID, bHdlcDlciType, bAtmDlciType; WORD wOldAtmPort, wAtmDlci, wHdlcPort, wHdlcDlci; DWORD dwMapMode, dwCIR, dwBe; DWORD dwCCID, dwResult, dwAtmPort; wTotalNetIWF = g_MuxData.SevDataSize.wFrNetExtIWFNum; ... } DWORD RestoreFrHdlcIntIWFData ( WORD wSlotID, BYTE *pReadPoint ) { WORD wCount, wTotalHdlcIWF; DWORD dwCCID, dwPeerCCID, dwAtmPort, dwPeerAtmPort; DWORD dwResult;
bYte bSlotID. bPeerSlotID WORD wHdIcPort, wOld AtmPort, wCIR; WORD wPeerHdIcPort. wPeerOld Atm Port 其中涉及DLCI值的变量都为WORD(即无符号短整型)类型,在程序 的处理时,出现WORD和WORD(无符号长整型)类型在一句中同时存在的情 况,至此可以判断问题出在这里。由于DLCI值在不同类型时的取值范围不同, 前三种类型的取值范围为16~991,第四种取值范围为2048~126975,第五种取值 范围为131072~4194303,所以当采用前三种DLCI类型时,采用WORD类型最大 值为65535,已经完全够用了;而对于第四种类型时,其取值在超过65535时,获 取DLCI值的函数 GetfrDIci()采用 DWORD类型,而负责保存和恢复的两个函 数 Save frnetextIwfdata()和 Restore frNetextwfdata(),都把DLCI的值当 作WORD类型进行处理,因此导致DLCI取值越界,于是程序把原本为长整型的 DLCI强制转换成整型,从而导致DLCI值在恢复时,比原数据小65536。而在程 序运行过程中,这些数据保存在DRAM中,程序运行直接从DRAM中获取数据 程序不会出错;当FRI板复位或插拔后,需要从 FLASH中读取数据,此时恢复函 数的错误就表现出来。 另一个问题是为什么23/4类型的DLCI数据不能恢复?这是由于对于23/4 类型的PⅤC,其DLCI的取值范围为:131072~4194303,而程序强制转换并恢复 的数据最大只能是65535,所以这条PVC不能恢复 至此,DLCI数据恢复出错的原因完全找到,解决的方法是将DLCI的类 型改为 DWORD类型。从这个案例可以看出,在程序开发中一个很低级的错误, 将在实际工作中造成很严重的后果。 【案例142】 【正 文】 在FRI板上建几条 FRPVC,其DLC类型分别为:10Bt2 bytes
BYTE bSlotID, bPeerSlotID; WORD wHdlcPort, wOldAtmPort, wCIR; WORD wPeerHdlcPort, wPeerOldAtmPort; ... } 其中涉及DLCI值的变量都为WORD(即无符号短整型)类型,在程序 的处理时,出现WORD和DWORD(无符号长整型)类型在一句中同时存在的情 况,至此可以判断问题出在这里。由于DLCI值在不同类型时的取值范围不同, 前三种类型的取值范围为16~991,第四种取值范围为2048~126975,第五种取值 范围为131072~4194303,所以当采用前三种DLCI类型时,采用WORD类型最大 值为65535,已经完全够用了;而对于第四种类型时,其取值在超过65535时,获 取DLCI值的函数_GetFrDlci()采用DWORD类型,而负责保存和恢复的两个函 数SaveFrNetExtIWFData()和RestoreFrNetExtIWFData(),都把DLCI的值当 作WORD类型进行处理,因此导致DLCI取值越界,于是程序把原本为长整型的 DLCI强制转换成整型,从而导致DLCI值在恢复时,比原数据小65536。而在程 序运行过程中,这些数据保存在DRAM中,程序运行直接从DRAM中获取数据, 程序不会出错;当FRI板复位或插拔后,需要从FLASH中读取数据,此时恢复函 数的错误就表现出来。 另一个问题是为什么23/4类型的DLCI数据不能恢复?这是由于对于23/4 类型的PVC,其DLCI的取值范围为:131072~4194303,而程序强制转换并恢复 的数据最大只能是65535,所以这条PVC不能恢复。 至此,DLCI数据恢复出错的原因完全找到,解决的方法是将DLCI的类 型改为DWORD类型。从这个案例可以看出,在程序开发中一个很低级的错误, 将在实际工作中造成很严重的后果。 【案例1.4.2】 【正 文】 在FRI板上建几条FRPVC,其DLCI类型分别为:10Bit/2bytes
10bi3 bytes、16bt/3 bytes、17bit/4 bytes、23bit4 bytes。相应的DLCI值为:16 234、991、126975、1234567,然后保存,重起MUX,观察PVC的恢复情况,结 果DLCI值为16、234和991的PVC正确恢复,而DLCI=126975的PVC恢复的数据 错误为61439,而DLCI=1234567的PVC完全没有恢复。 对于17/4类型,DCI=126975的PVC在恢复时变成61439,根据这条线 索,查找原因,发现126975-61439=65535,转化二进制就是1000000000000 也就是说在数据恢复或保存时把原数据的第一个1给忽略了。此时第一个想法是 在程序处理中,把无符号长整型变量当作短整型变量处理了,为了证实这个判断, 针对17bt/4 bytes类型又重新设计测试用例:(1)先建PVC,DLC=65535,然 后保存,重起MUX,观察PVC的恢复情况,发现PVC能够正确恢复 (2)再建PⅤC,DLCI=65536,然后保存,重起MUX,观察PVC的恢复情况, 此时PⅤC不能正确恢复。 至此基本可以断定原因就是出在这里。带着这个目的查看原代码,发现在以下代 码中有问题 int Get FrDIci( DWORD* dwDIci, char* str, DWoRd dwDIciType, DWORD dwPort Type, DWORD dw SlotID, DWORD dw PortID) DWoRd tempDIcr charszarg[80] charszLine[ 80] ID LOWPVCEP dWoRD dwDlcival[52] {{16,1007},{16,1007},{1024,64511} 2048,129023},{131072,4194303}}; typedef struct tag FrPppIntI WORD wHdlcPort
10bit/3bytes、16bit/3bytes、17bit/4bytes、23bit/4bytes。相应的DLCI值为:16、 234、991、126975、1234567,然后保存,重起MUX,观察PVC的恢复情况,结 果DLCI值为16、234和991的PVC正确恢复,而DLCI=126975的PVC恢复的数据 错误为61439,而DLCI=1234567的PVC完全没有恢复。 对于17/4类型,DLCI=126975的PVC在恢复时变成61439,根据这条线 索,查找原因,发现126975-61439=65535,转化二进制就是10000000000000000, 也就是说在数据恢复或保存时把原数据的第一个1给忽略了。此时第一个想法是: 在程序处理中,把无符号长整型变量当作短整型变量处理了,为了证实这个判断, 针对17bit/4bytes类型又重新设计测试用例:(1) 先建PVC,DLCI=65535,然 后保存,重起MUX,观察PVC的恢复情况,发现PVC能够正确恢复; (2)再建PVC,DLCI=65536,然后保存,重起MUX,观察PVC的恢复情况, 此时PVC不能正确恢复。 至此基本可以断定原因就是出在这里。带着这个目的查看原代码,发现在以下代 码中有问题: int _GetFrDlci( DWORD* dwDlci, char* str, DWORD dwDlciType, DWORD dwPortType, DWORD dwSlotID, DWORD dwPortID) { DWORD tempDlci; charszArg[80]; charszLine[80]; ID LowPVCEP; DWORD dwDlciVal[5][2] = { {16,1007}, {16,1007}, {1024,64511}, {2048,129023}, {131072,4194303} } ; ... } typedef struct tagFrPppIntIWF { ... WORD wHdlcPort;