![]() |
AccsesViolation in System.pas
Ich habe jetzt ein Problem:
Die System.pas aud D2007 crasht, das bedeutet, das ich immer eine AV erhalte. Die Zelennummer ist 12345.
Delphi-Quellcode:
Woher kommt das und wie ändere/behebe ich den Fehler?
procedure _LStrAsg(var dest; const source);
{$IFDEF PUREPASCAL} var S, D: Pointer; P: PStrRec; Temp: Longint; begin S := Pointer(source); if S <> nil then begin P := PStrRec(Integer(S) - sizeof(StrRec)); if P.refCnt < 0 then // make copy of string literal begin Temp := P.length; S := _NewAnsiString(Temp); Move(Pointer(source)^, S^, Temp); P := PStrRec(Integer(S) - sizeof(StrRec)); end; InterlockedIncrement(P.refCnt); end; D := Pointer(dest); Pointer(dest) := S; if D <> nil then begin P := PStrRec(Integer(D) - sizeof(StrRec)); if P.refCnt > 0 then if InterlockedDecrement(P.refCnt) = 0 then FreeMem(P); end; end; {$ELSE} asm { -> EAX pointer to dest str } { -> EDX pointer to source str } TEST EDX,EDX { have a source? } JE @@2 { no -> jump } MOV ECX,[EDX-skew].StrRec.refCnt INC ECX JG @@1 { literal string -> jump not taken } PUSH EAX PUSH EDX MOV EAX,[EDX-skew].StrRec.length CALL _NewAnsiString MOV EDX,EAX POP EAX PUSH EDX MOV ECX,[EAX-skew].StrRec.length CALL Move POP EDX POP EAX JMP @@2 @@1: LOCK INC [EDX-skew].StrRec.refCnt @@2: XCHG EDX,[EAX] TEST EDX,EDX //<-- da crasht es JE @@3 MOV ECX,[EDX-skew].StrRec.refCnt DEC ECX JL @@3 LOCK DEC [EDX-skew].StrRec.refCnt JNE @@3 LEA EAX,[EDX-skew].StrRec.refCnt CALL _FreeMem @@3: end; {$ENDIF} Nach einem Debugen kamen plötzlich massenhaft Fehler: Fehler Erzeugen [Pascal Fataler Fehler] system.pas(1748): F2051 Unit SysInit wurde mit einer unterschiedlichen Version von System.@RunError compiliert [Pascal Fataler Fehler] system.pas(1748): F2051 Unit SysInit wurde mit einer unterschiedlichen Version von System.@RunError compiliert [Pascal Fataler Fehler] system.pas(1748): F2051 Unit SysInit wurde mit einer unterschiedlichen Version von System.@RunError compiliert [Pascal Fataler Fehler] system.pas(1748): F2051 Unit SysInit wurde mit einer unterschiedlichen Version von System.@RunError compiliert [Pascal Fataler Fehler] system.pas(1748): F2051 Unit SysInit wurde mit einer unterschiedlichen Version von System.@RunError compiliert [Pascal Fataler Fehler] system.pas(1748): F2051 Unit SysInit wurde mit einer unterschiedlichen Version von System.@RunError compiliert [Pascal Fataler Fehler] system.pas(1748): F2051 Unit SysInit wurde mit einer unterschiedlichen Version von System.@RunError compiliert [Pascal Fataler Fehler] system.pas(1748): F2051 Unit SysInit wurde mit einer unterschiedlichen Version von System.@RunError compiliert [Pascal Fataler Fehler] system.pas(1748): F2051 Unit SysInit wurde mit einer unterschiedlichen Version von System.@RunError compiliert Kann es die Prozedur TryStrToFloat sein, die den Fehler verursacht? Mein Aufruf ist
Delphi-Quellcode:
values1 ist ein array of String und dValue1 ist Single.
TryStrToFloat(values1[l],dvalue1);
[edit] Es schein hier irgendwas nicht zu funktionieren...
Delphi-Quellcode:
[/edit]
for i := 0 to Length(values)-1 do
begin if not odd(i) then begin values1[j] := values[i]; j := j+1; end else begin values2[k] := values[i]; k := k+1; end; end; [edit=2] der Übeltäter scheint j := j+1 zu schein. j ist ein Integer, aber ich verstehe nicht weshalb das nicht funktioniert.[/edit] |
Re: AccsesViolation in System.pas
Aktivier mal die Rangechecks, ein Bug in der System.pas ist eher unwahrscheinlich. Ich vermute eher, dass du irgendwo einen ungültigen Parameter übergibst oder sowas.
EDIT: Achja, und setz mal nen Breakpoing auf das, was in deinem Post Zeile 5 ist, und verfolge mal den Wert von j mit dem Evaluator oder den überwachten Ausdrücken. Und bist du dir sicher, dass du j und k auf einen ordentlichen Wert initialisiert hast? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz