問題タブ [cdb]

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.

0 投票する
4 に答える
382 参照

windbg - Windbg/cdb - 遅い条件付きブレークポイントをインメモリ パッチ (32 ビット) に置き換えます

cdbを使用して、次の条件付きブレークポイントがあります

これは断続的な問題を調査するためのものであるため、かなりの時間アタッチされたままにしておく必要がありますが、条件付きブレークポイントにより、アプリケーションの全体的なパフォーマンスが許容範囲をはるかに超えて低下します。

  • 条件付きブレークポイントを最適化する方法を知っている人はいますか? チェックするだけeax=0です。条件付きブレークポイントが非常に遅くなる理由を説明するいくつかの 投稿 を読みましたが、それらは完全に理にかなっているので、これは行き止まりだと思います。
  • メモリ内イメージでやりたいことはほとんどできます。に無条件のブレークポイントをif eax = 0 { <whatever>}追加できるように、何かを挿入するようにいくつかの命令にパッチを当てることは可能でしょうか?<whatever>

編集

コメントから、行動計画は次のようにスクリプト化することです

.dvalloc <bytes>結果をpatchという変数に格納します。

patch+zこれで、無条件のブレークポイントを追加して、アプリケーションを停止することなく必要な情報をダンプできるはずです。

編集 2

次の POC はライブ デバッグ セッションで機能しますが、これはアプリケーションを停止せず、キー押下などを待機しないスクリプトに変換する必要があります。

実行されたコマンド

出力/コンテキストを含む実行されたコマンド

編集 3

実行中の 7 つの実行可能ファイルに手動でパッチを適用することは成功しましたが、によって返されたアドレスによって.dvallocは、アセンブルさJMPれた命令に別の命令が含まれています。取得したアドレスからジャンプ先のアドレスを差し引くのと同じくらい簡単だと思っていまし.dvallocたが、そうではないようです。

最初fはおそらく符号ビットですか?

編集 4

結局、計算は簡単ですが、十分に時間がかかりました。最初fは確かにサインです。

  • ジャンプするアドレスを取得します。私の場合004bfa06
  • 命令のメモリ位置の末尾を減算しjmp 004bfa06ます。私の場合、それは常に.dvalloc+0x16.dvalloc+0x11命令の開始です)

最後の試行 (7) に適用すると、


以下は、ブレークポイントを設定している関数プロローグです。での命令004bfa08 (MOV param_1,ESI)は、前のでの命令のために冗長である004bfa02 (MOV ESI,param_1)ため、役立つかもしれませんが、ここから先に進む方法についての知識が不足しています。