由于崩溃,我正在调试一个非常旧的应用程序(Visual C ++ 6)。我已经将崩溃隔离到了一个while循环。这个应用程序从数据库中读取一串字符串,并将它们输出到一个文件中进行处理。
虽然从数据库中检索到的所有字符串并将它们包装在分隔符/结束字符中,但此循环似乎正在循环。但是,while循环会随机崩溃。
我有一组包含大约2000个字符串的特定数据,并且在处理过程中的某个时刻,循环将崩溃(或者在调试模式下给出调试断言错误)。奇怪的是,这个循环每次都不会停在同一个位置(我首先想到的是坏字符串),这也不常见。这个应用程序已经处理了数十万行多年,但它在某个随机的特定数据集上扼杀了。
我最初添加了一些日志记录代码(我已经删除了,看起来崩溃发生在WHILE行的实际执行/评估上。
我应该寻找什么特别的东西吗?我想也许这是一个索引超出范围的错误,但我认为如果是这种情况,它会在相同的数据集的相同位置一致地发生。有没有人看到这个代码我应该仔细检查,或者可以提供任何关于如何更好地解决这个问题的建议?
//Definitions
CStringList m_stlMessageList;
CStringList m_stlMessageIDList;
//Populating list
rec.Open(CRecordset::forwardOnly, strSQL);
while (!rec.IsEOF())
{
rec.GetFieldValue("string_id", strMessageID);
strMessageID.TrimRight();
rec.GetFieldValue("string_text", strMessage);
strMessage.TrimRight();
rec.GetFieldValue("string_destination", strDestination);
strDestination.TrimRight();
rec.GetFieldValue("string_ip", strIP);
strIP.TrimRight();
//Add to the Lists...
m_stlMessageIDList.AddTail(strMessageID);
m_stlMessageList.AddTail(strMessage);
rec.MoveNext();
}
//Code thats crashing.
CString strSegment, strTemp, strTmp;
BOOL bFirst = TRUE;
POSITION POS = m_stlMessageList.GetHeadPosition();
while (POS)
{
strSegment = m_stlMessageList.GetNext(POS);
strTemp = strSegment.Left(4);
strSegment.Format(strSegment + "%c", 13);
if (POS)
{
strTmp = m_stlMessageList.GetPrev(POS);
m_stlMessageList.SetAt(POS, strSegment);
strTmp = m_stlMessageList.GetNext(POS);
}
else
{
m_stlMessageList.RemoveTail();
m_stlMessageList.AddTail(strSegment);
}
}