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'

アクセス違反が発生するのは、ヒープが破損していることです。

プログラム内の他の何かが範囲外で書き込みを行っており、ヒープを破損しています。このような問題は、通常はコードの一部に障害があり、エラーは別の場所で発生するため、診断が難しい場合があります。一部のコードによってヒープが破損し、以前のヒープの破損が原因で後続のヒープ操作が失敗します。

CopyDelphi の文字列変数は機能することが知られており、機能することが知られており、文字列の等価性テストが機能することが知られているため、私は自分の診断に自信を持っています。つまり、エラーが発生したコード行に問題はありません。したがって、エラーは別の場所にあります。

役立つデバッグ ツール:

  • フル デバッグ モードの FastMM。
  • 範囲チェック (プロジェクトのコンパイラ オプションから有効化)。
于 2013-09-20T11:22:38.793 に答える