2

我有一个 Delphi 应用程序,它从文件中读取数据并将其存储在数组中。文件中的每一行都包含一个地址、lineTypeIndicator 和数据。这是算法(包含我认为很关键的代码):

AssignFile(inputFile, inFileName);
Reset(inputFile);
  while not EOF(inputFile) do
  begin
    Readln(inputFile,fileLineBuffer);        
     if  Copy(fileLineBuffer, 8, 2) = '01' then  //Never managed to catch the error here
    begin
      break;
    end;

    //extract the address from the line and use it to determine max and min address.
  end;

//Now that you have min and max address, use it to set the length of an char array
SetLength(memoryArray,(lastAddress - firstAddress) * 2);

Reset(inputFile);
  while not EOF(inputFile) do
  begin
    Readln(inputFile,fileLineBuffer);

     if  Copy(fileLineBuffer, 8, 2) = '01' then    //I caught all the errors here
    begin
      break;
    end;

    //extract the address and data from the fileLineBuffer and place it in the corresponding place in an array
  end;

每次用户单击表单上的相应按钮时,都会执行此代码。它在执行的前几次运行,但经过几次运行后,我得到了这个:

MyProgram.exe 出现错误消息:'在 0x00406111 处的访问冲突:写入地址 0x00090d1c(这会有所不同)。进程停止。使用 step 或 run 继续。

对我来说,这闻起来像是某种堆溢出。我试过更换

if  Copy(fileLineBuffer, 8, 2) = '01' then              

lineTypeBuffer :=   Copy(fileLineBuffer, 8, 2);
if  lineTypeBuffer = '01' then                   

或者

if  (fileLineBuffer[8] = '0') and (fileLineBuffer[9] = '1') then 

但它没有帮助。关于我应该如何解决这个问题的任何建议?

PS 尝试在 Win7 32 位和 Win7 64 位上运行它 - 没有区别 PPS 很抱歉这个长问题。

4

1 回答 1

2

唯一的解释

Copy(fileLineBuffer, 8, 2) = '01'

导致访问冲突的原因是您损坏了堆。

程序中的其他内容是越界写入并破坏堆。此类问题可能难以诊断,因为故障通常在代码的一部分中,但错误发生在其他地方。某些代码损坏了堆,然后由于早期的堆损坏,后续的堆操作失败。

我对我的诊断很有信心,因为已知 Delphi 字符串变量有效,Copy已知有效,并且已知字符串相等测试有效。换句话说,发生错误的代码行中没有错误。因此错误在别处。

一些可能有帮助的调试工具:

  • FastMM 处于完全调试模式。
  • 范围检查(从项目的编译器选项启用)。
于 2013-09-20T11:22:38.793 回答