メモリの腐敗防止システム。移動の変化により、8087CWモード(png+stretchblt)
-
24-09-2019 - |
質問
私は不思議なるメモリ破壊の問題です。後に多くの時間をデバッグしようと思いたい。
例えば:いう単純な文字列担当:
sTest := 'SET LOCK_TIMEOUT ';
しかし、結果につながる場合もあること:
sTest = 'SET LOCK'#0'TIMEOUT '
その_が置き換え0バイトになります。
れによって同様の事態が発生しないよう、一度に再生するトリッキー、タイミング)されます。移動機能を使用した場合でも、FPUのスタック(fild,fistp)のための高速メモリにコピー(9 32バイトまでの移動):
...
@@SmallMove: {9..32 Byte Move}
fild qword ptr [eax+ecx] {Load Last 8}
fild qword ptr [eax] {Load First 8}
cmp ecx, 8
jle @@Small16
fild qword ptr [eax+8] {Load Second 8}
cmp ecx, 16
jle @@Small24
fild qword ptr [eax+16] {Load Third 8}
fistp qword ptr [edx+16] {Save Third 8}
...
使用FPUの閲覧と2メモリのデバッグのビュー(デルフィ->ビュー>デバッグ->CPU->メモリで見たく間違ったコミュニケーション一度---な再現した...
今朝の読んだもの8087CWモードであり、この変$27Fいメモリ破壊!通常は$133F:
の違い$133Fや$027Fは$027FセットまでのFPUのための少なくしよう緻密な計算のみに限定ダブルの代わりに長)と異なるインフィニティについて用いられた年齢によりFPUのものを使用しない為。
大丈夫でした なぜ がない 時!
変更しましたが、作業の AsmProfiler 簡単にチェックで全ての機能をチェックを入力と出):
if Get8087CW = $27F then //normally $1372?
if MainThreadID = GetCurrentThreadId then //only check mainthread
DebugBreak;
私は"絞り"いくつかのユニットとdllのビンゴ(スタック):
Windows.StretchBlt(3372289943,0,0,514,345,4211154027,0,0,514,345,13369376)
pngimage.TPNGObject.DrawPartialTrans(4211154027,(0, 0, 514, 345, (0, 0), (514, 345)))
pngimage.TPNGObject.Draw($7FF62450,(0, 0, 514, 345, (0, 0), (514, 345)))
Graphics.TCanvas.StretchDraw((0, 0, 514, 345, (0, 0), (514, 345)),$7FECF3D0)
ExtCtrls.TImage.Paint
Controls.TGraphicControl.WMPaint((15, 4211154027, 0, 0))
で起きていることをStretchBlt...
どうですか? それは断層の窓またはバグPNG(D2007)?または、システム。移動機能なフェールセーフ?
注意: ではな再現は:
Set8087CW($27F);
sSQL := 'SET LOCK_TIMEOUT ';
そうするとエキゾチックな...がdebugbreakにGet8087CW=$27F"まりも"が再現でその他の文字列:FPU第1部:
FPU第2部
FPU第3部:
FPUの最終:腐敗した!:
注2: (粉を山にして真ん中をFPUのスタックをクリアしていなければなされます。動くのか?
解決
私は、この特定の問題を見ていないが、FPUが悪い状態にある場合の移動は間違いなく台無しに得ることができます。シスコのVPNドライバを使用すると、関連するもののネットワークをやっていない場合でも、恐ろしく物事を台無しにすることができます。
のhttp://brianorr.blogspot .COM / 2006/11 /インテルのPentium-D-浮動小数点unit.html の[破損]
ます。https://web.archive .ORG /ウェブ/ 20160601043520 /のhttp://www.dankohn.com/archives/343する
ます。http: //blog.excastle.com/2007/08/28/delphi-bug-of-the-day-fpu-stack-leak/する(リッチーAnnand別コメント)
我々はFastMMを使用しているので、私たちのケースで我々は無効、(Int64のバージョンがFPUを使用しています)パスカル・バージョンでIntToStrを置き換える、Delphi 7のバージョンで移動し、FillCharからバギーVPNドライバとスワップを検出し、彼らはさらに多くの影響を受けやすいSystem.Moveよりますので、そのカスタムは、あまりにも大き移動ルーチンを固定します。
他のヒント
ですが、バグビデオドライバーなの保全に8087制御の単語の場合を行いStretchBlt動作します。
過去にも同様の行為が一定のプリンタドライバー.うに8087CW、間違ったコミュニケーション
注記デフォルト値の8087CWントのよう$1372;詳しい使い方についてのCW値は、 この記事:でも説明している状況マイケル-ジャスティンに記載がな8087CWたhosed.
--jeroen
ちょうどあなたの情報については、(いくつかの他の場合は、あまりにも同じ問題を抱えている):私たちはお客様のために、私たちのソフトウェアのアップグレードをした、と私たちのアプリケーションが起動した時に完全なタッチスクリーンがロック! Windowsが完全に凍結しました! pcは(電源オフ)を再起動する必要がありました。それは完全なフリーズの原因を把握するいくつかの時間がかかっています。
幸いにも我々はFastMove.LargeSSEMoveでAVの1(1のみ!)スタックトレースを持っていました。私はのFastMoveにおけるSSEの使用を無効にし、問題がなくなっています。
ところで:タッチスクリーンは、S3チップセットを搭載したVIAネヘミヤのCPUを持っている。
FPU、だけでなく、完全な凍結を使用するときにだけでなく、あなたがメモリの破損を得ることができます!
の方にとても興味があります:あるいは別の原因と問題点:
ポリオが船を切ASM版 Move
.
私は恒例の秋のバス遠足を実施しコーティングがバグは今日、幸いにも十分なっ再現可能な試験です。問題は、この作品のコード:
* ***** BEGIN LICENSE BLOCK *****
*
* The assembly function Move is licensed under the CodeGear license terms.
*
* The initial developer of the original code is Fastcode
*
* Portions created by the initial developer are Copyright (C) 2002-2004
* the initial developer. All Rights Reserved.
*
* Contributor(s): John O'Harrow
*
* ***** END LICENSE BLOCK ***** *)
// ... some less interesting parts omitted ...
@@LargeMove:
JNG @@LargeDone {Count < 0}
CMP EAX, EDX
JA @@LargeForwardMove
// the following overlap test is broken
// when size>uint(destaddr), EDX underflows to $FFxxxxxx, in which case
// we jump to @LargeForwardMove even if a backward loop would be appropriate
// this will effectively shred everything at EDX + size
SUB EDX, ECX // when this underflows ...
CMP EAX, EDX // ... we also get CF=1 here (EDX is usually < $FFxxxxxx)
LEA EDX, [EDX+ECX] // (does not affect flags)
JNA @@LargeForwardMove // ... CF=1 so let's jump into disaster!
SUB ECX, 8 {Backward Move}
PUSH ECX
FILD QWORD PTR [EAX+ECX] {Last 8}
FILD QWORD PTR [EAX] {First 8}
ADD ECX, EDX
AND ECX, -8 {8-Byte Align Writes}
SUB ECX, EDX