問題タブ [vmt]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
delphi - Delphi VMT の構造に関する情報はどこにありますか?
System.pas ファイルには、ハードコードされた VMT オフセットに関するかなりの量の情報が含まれていますが、実際には VMT 自体の構造についてはあまり語っていないようです。私が本当に知りたいのは、実行時の VMT のサイズ、つまり、特定のクラスに存在する仮想メソッドの数を調べる方法はありますか?
delphi - Delphi で VMT またはヒープの破損を検出するための適切なツールは何ですか?
私は、大規模なアプリケーションに Delphi 2007 を使用しているチームのメンバーです。他に説明のつかない奇妙なバグが時々あるため、ヒープの破損が疑われます。コンパイラの Rangechecking オプションは配列専用だと思います。アプリケーションによって割り当てられていないメモリ アドレスに書き込みがあった場合に、例外またはログを記録するツールが必要です。
よろしく
EDIT : エラーのタイプは次のとおりです。
エラー: モジュール 'BoatLogisticsAMCAattracsServer.exe' のアドレス 00404E78 でアクセス違反が発生しました。アドレス FFFFFFDD の読み出し
EDIT2:すべての提案をありがとう。残念ながら、解決策はそれよりも深いと思います。ソースを所有しているため、パッチを適用したバージョンの Bold for Delphi を使用しています。おそらく、Bold フレームワークで導入されたいくつかのエラーがあります。はい、JCL によって処理され、メッセージをトレースするコールスタックを含むログがあります。したがって、例外のあるコールスタックは次のようにロックできます。
内部例外部分は、例外が再発生した瞬間のコールスタックです。
EDIT3:現在の理論は、仮想メモリテーブル(VMT)が何らかの形で壊れているというものです。これが発生した場合、その兆候はありません。メソッドが呼び出されたときにのみ例外が発生します (アドレス FFFFFFDD でALWAYS、10 進数で -35) が、それでは遅すぎます。エラーの本当の原因がわからない。このようなバグをキャッチする方法のヒントは本当にありがたいです!!! SafeMM で試してみましたが、3 GB フラグを使用してもメモリ消費量が多すぎることが問題です。だから今、私はSOコミュニティに報奨金を与えようとしています:)
EDIT4: 1つのヒントは、ログによると、この前に別の例外がしばしば(または常に)あるということです。たとえば、データベースの楽観的ロックなどです。強制的に例外を発生させようとしましたが、テスト環境では問題なく動作します。
EDIT5:話は続きます... 過去 30 日間のログを検索しました。結果:
- 「アドレス FFFFFFDB の読み出し」 0
- 「アドレス FFFFFFDC の読み出し」 24
- 「アドレス FFFFFFDD の読み取り」 270
- 「アドレス FFFFFFDE の読み出し」 22
- 「アドレス FFFFFFDF の読み出し」 7
- 「アドレス FFFFFFE0 の読み出し」 20
- 「アドレス FFFFFFE1 の読み出し」 0
したがって、現在の理論では、列挙型 (ボールド体にたくさんあります) がポインターを上書きします。上記の異なるアドレスで 5 件ヒットしました。列挙型が 5 つの値を保持し、2 番目の値が最も使用されていることを意味する可能性があります。例外が発生した場合、データベースのロールバックが発生し、Boldobjects が破棄される必要があります。おそらく、すべてが破棄されるわけではなく、列挙型がまだアドレスの場所に書き込むことができる可能性があります。これが本当なら、5 つの値を持つ列挙型の正規表現でコードを検索することは可能でしょうか?
EDIT6:要約すると、問題の解決策はまだありません。コールスタックで少し誤解を招く可能性があることは承知しています。はい、タイマーがありますが、タイマーのない他のコールスタックがあります。そのために残念。しかし、2つの共通点があります。
- アドレス FFFFFFxx の読み取りによる例外。
- コールスタックのトップは System.TObject.InheritsFrom (sys\system.pas:9237) です。
これは、 VilleKが問題を最もよく説明していることを確信させてくれます。また、問題は Bold フレームワークのどこかにあると確信しています。しかし、大きな問題は、このような問題をどのように解決できるかということです。VilleKのような Assert を提案するだけでは十分ではありません。損傷は既に発生しており、その時点でコールスタックはなくなっているからです。したがって、エラーの原因についての私の見解を説明するには、次のようにします。
- どこかでポインターに不適切な値 1 が割り当てられていますが、0、2、3 などになることもあります。
- オブジェクトがそのポインターに割り当てられます。
- オブジェクトの基底クラスにメソッド呼び出しがあります。これにより、メソッド TObject.InheritsForm が呼び出され、アドレス FFFFFFDD に例外が発生します。
これら 3 つのイベントはコード内で一緒に使用できますが、後で使用することもできます。これは最後のメソッド呼び出しにも当てはまると思います。
EDIT7:私たちは Bold Jan Norden の作者と緊密に協力しており、彼は最近、Bold フレームワークの OCL エバリュエーターにバグを発見しました。これが修正されたとき、これらの種類の例外は大幅に減少しましたが、それでも時々発生します。しかし、これがほぼ解決されたことは大きな安堵です。
windows - Delphi XE2 まで更新する TObject 仮想メソッドのシグネチャ
当分の間、Delphi XE は私のボックスでのみ利用できます。Delphi 2010/XE2 が破壊的な変更を導入したかどうかはわかりません。
次の定義を更新するのを手伝ってください:
前もって感謝します。
必要な情報は、ユニットsystem.pasから取得できます。Delphi XEバージョンとしてチェックしている間、VMTがCPUに依存していることも発見しました(私のせいです、それは明らかです/詳細については{$IF defined(CPUX64)}
ディレクティブを検索してください)。
32 ビット Windows プラットフォームに興味があります。
delphi - 渡された引数がクラスであるかどうかを確認する方法は?
私は関数を持っています(Delphi 7、32ビットで書かれています):
これはVMTアドレスを返し(VMTだと思いますが、よくわかりません)、パラメーターがオブジェクトであるかどうかをチェックします(try...except
これは、非常に貧弱なソリューションです)。
2つの質問があります:
1)これは本当にVMTアドレスですか、それとも間違っていますか?
2)パラメータがオブジェクトであることを確認するためのより良い解決策はありますか?
pascal - Free Pascal 上の仮想メソッド テーブル
私がやろうとしているのは、インスタンスなしでクラスのフィールドのリストを取得することです...例:
VMT から fieldTable を取得できません。
この方法では、フィールドのリストを取得していません
どんな助けでも大歓迎です、事前に感謝します
c++ - VTable エントリを変更しても機能がリダイレクトされませんか?
私は 3 つのクラス (猫、HouseCat:Cat、Lion:Cat) を持っています。私がやろうとしているのは、HouseCat の VTable を変更して、HouseCat がキャット フードの代わりに肉を食べられるようにすることです。
私が使用するクラス:
作成した VTable 構造体でこれらのクラスの VTable エントリを編集しようとしています。
VTable[0] = eat() であることを確認したので、Vtable を次のように変更してみることにしました。
出力しました。
HomeCat[0] が 0x311285->0x31106E から変更されたことがわかります
問題は、関数の出力がまったく変化しないことです。
- -ベース - -
ミート2
ニャー!2
- -ライオン - -
ミート2
ロア!2
- -家 - -
キャットフード2
ニャー!2
- -終わり - -
私はVisual Studio 2013を使用しています。リリース/デバッグでも違いはありませんでした。
私は自分のコードで何か間違ったことをしましたか、それとも私が見逃しているコンパイラのものですか?
c++ - C++ 仮想関数テーブル インデックスの取得
仮想メソッドテーブルで仮想関数のインデックスを取得することは可能ですか?
foo
仮想メソッド テーブルの最初 (0) の項目であることはわかっています
しかし、私はfoo
0を持って得ることができますか?
delphi - VMT のエントリ (仮想メソッド) の数を取得するにはどうすればよいですか?
正のオフセットでは、VMT はすべてのユーザー定義の仮想メソッドへのポインターを格納します。
VMT をフックするコードを書く必要があります。これを行う方法は、祖先クラスの仮想メソッドへのポインターを取得することです。
言いましょう: TCustomForm.ShowModal
. 次に、 の VMT でオフセットを調べますTCustomForm
。このオフセットを使用して、VMT に移動しTMyForm
、必要な関数を指すようにその VMT を変更します。
アプローチを一般化したいと思います。そのためには、VMT が保持するエントリの総数を知りたいので、最後まで検索しません。
VMT (のユーザー定義可能部分) のサイズを取得するにはどうすればよいですか?