「GetThreadContext」以外の別のプロセス(WindowsのC++)でスレッドのEBPを取得する方法があるのだろうかと思っていました。私はこの方法には時間がかかりすぎると思います(私はそれをたくさん使います)、もし私がEBPだけで、CONTEXTのすべての値を得ることができないなら、それはより速くなります。
"ReadProcessMemory"を使用し、残りの呼び出しスタックでEBPを取得することを考えていましたが、スタックがどこにあるのか、どこから取得する必要がないのでしょうか。
誰かがもっと良い方法を知っているなら、私はそれについて聞いてうれしいです。
ありがとう:)別のプロセスでスレッドのEBPを取得する
答えて
スレッドが実行されている場合、別のスレッドのEBPの実行値は、もちろんEBPレジスタにあります。実行されていない場合は、カーネルのスケジューラによって救われます。 GetThreadContextは、カーネル内の内容を取得しています。それ以外はもっと速くなりません。
私がこれを書いたときに理解していたよりもパフォーマンスの状況が悪いです。スレッドが実行されている場合、カーネルはAPCメカニズムを使用して最新の値を取得します。これは高速ではありませんが、他の代替APIはありません。
いいえ、間違っています。 NtGetContextThreadは、APCを現在のスレッドでない場合、常にターゲットスレッドにキューイングします。その後、APCが完了するのを待ちます。それほど速くはありません。 – wj32
実際には、他のより高速な代替手段があれば、これについてはもっと悪いと感じるでしょう。 1つはありますか? – bmargulies
いいえ、スレッドが実行されている場合、そのレジスタはレジスタ内にありますが、あまり役に立ちません。実行されていない場合、レジスタはそのKTHREADオブジェクトに保存されます。スレッドのレジスタが実際に読み取れるように保存されていることを確認する最善の方法は、APCをキューに入れてそのスレッドのプロセッサで割り込みを発生させることです。 – wj32
EBPがレジスタであるため、GetThreadContextは唯一の方法です。プロセッサはコンテキストスイッチを実行したときにそれを保存します。スレッドのレジスタを読み取る唯一の方法はGetThreadContextです。
もちろん、EBPに必要な値が保証されているわけではありません。フレームポインタ省略でコンパイルされた関数では、現在の呼び出しフレームのフレームポインタにEBPが確実に設定されません。
スタックトレース(EBPを開始する最も一般的な理由)を探しているだけの場合は、StackWalk64をお勧めしますか?
- 1. 別のプロセスを取得する 'QueryPerformanceCounter()
- 2. パブのプロセスIDを取得すると、そのスレッド/プロセスが終了します
- 3. PHPで一意のワーカー/スレッド/プロセス/リクエストIDを取得
- 4. 別のスレッドでサービスからオートコンプリートテキストの提案を取得する
- 5. Bashの別のプロセスにパイプされるプロセスのPIDを取得するには?
- 6. jQuery:別のスレッドでデータを取得する
- 7. PowerShellプロセスのプロセスIDを取得する
- 8. Linuxのプロセスとスレッドの区別
- 9. Windowsの別のプロセスのコマンドライン引数を取得する
- 10. Qtで別のプロセスやスレッドを実行する
- 11. 別のスレッド上のループで別のプロセスを実行する方法
- 12. 別のプロセスのウィンドウ状態を取得する
- 13. 別のプロセスの値を取得する 'CLRメモリパフォーマンスカウンター
- 14. SLURMの個々のプロセス/スレッドの統計情報を取得する方法は?
- 15. 別のスレッド、同じプロセスでTcpListenerに接続する
- 16. Java 1.4でスレッドの一意の識別子を取得
- 17. UIは別のスレッドでもプロセスをフリーズしますか?
- 18. プロセスを開いて出力を取得し、別のプロセスを開き、出力を取得します。
- 19. 別のスレッドでプロセスを実行するとSystem.IOが発生する__ Error.WinIOError
- 20. C++で別のプロセス変数値(またはメモリアドレス)を取得する
- 21. スレッドを取得する
- 22. 長時間実行中のエクスプレスAPIプロセスを別のスレッドで実行するNodeJs
- 23. 他のスレッドのバックトレースを取得する
- 24. プロセスは別のスレッドを使用し始めますか?
- 25. 子プロセスのsegfaultバックトレースを取得する
- 26. Python - インスタンスのプロセスIDを取得する
- 27. プロセスのアイコンを取得するmfc C++
- 28. 子プロセスのフォームを取得する
- 29. Groovyでプロセス出力を取得する
- 30. HttpContext null、codepathが別のスレッドを取る
あなたは何を書いていますか、プロファイラですか?あなたの問題を説明すると、誰かがあなたにより速い方法を与えることができます。 –
はい、プロファイラ:) – Idov