2012-05-06 8 views
5

私はしばらくの間、ダンプファイルをデバッグするためにWinDbgを使用してきました。
x86ネイティブプログラムで動作する素晴らしい "トリック"があります。CONTEXT_ALLフラグ(0x1003f)のスタックをスキャンできます。x64スタックでネイティブ例外を見つけるにはどうしたらいいですか?

x64のではCONTEXT_ALLフラグが明らかに0x1003f ...

が今の問題は、時にはあなたは、マネージコード、.excなどの例外を(見つけるの定期的な方法でネイティブ混在させると、ということである含まれていません。最後のイベント)。

0x1003fはx64で表されますか?そのような定数はありますか?

EDIT:あなたは不思議に思った場合

ところで、理論的にはそれが理由の定義の10003fされている必要があります。...

#define CONTEXT_I386 0x00010000 
#define CONTEXT_AMD64 0x00100000 

#define CONTEXT_CONTROL    0x00000001L // SS:SP, CS:IP, FLAGS, BP 
#define CONTEXT_INTEGER    0x00000002L // AX, BX, CX, DX, SI, DI 
#define CONTEXT_SEGMENTS   0x00000004L // DS, ES, FS, GS 
#define CONTEXT_FLOATING_POINT  0x00000008L // 387 state 
#define CONTEXT_DEBUG_REGISTERS  0x00000010L // DB 0-3,6,7 
#define CONTEXT_EXTENDED_REGISTERS 0x00000020L // cpu specific extensions 
#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS) 
#define CONTEXT_ALL (CONTEXT_FULL | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | CONTEXT_EXTENDED_REGISTERS) 

#define CONTEXT_I386_FULL CONTEXT_I386 | CONTEXT_FULL 
#define CONTEXT_I386_ALL CONTEXT_I386 | CONTEXT_ALL 
#define CONTEXT_AMD64_FULL CONTEXT_AMD64 | CONTEXT_FULL 
#define CONTEXT_AMD64_ALL CONTEXT_AMD64 | CONTEXT_ALL 

しかし、それはありません

答えて

2

私は通常、コンテキストレコードを見つけるために自分のキーにセグメントレジスタ値を使用します(ESとDSは同じ値を持ち、CONTEXT構造内で互いに隣り合っています)。フラッグトリックもきちんとしている。

私の場合はマジック値が0x10001fされるだろうように見えます、スタックからコンテキストレコード構造を掘り、その後テストアプリケーションで例外を強制:

0:000> dt ntdll!_context 000df1d0 
... 
    +0x030 ContextFlags  : 0x10001f 
... 
    +0x03a SegDs   : 0x2b 
    +0x03c SegEs   : 0x2b 
... 

もContextFlags値がでないことに注意構造体の開始点であるので、その値を見つけたら、@@ C++(#FIELD_OFFSET(ntdll!_CONTEXT、ContextFlags))を減算してコンテキスト構造の基底を取得する必要があります。

また、この値は明白ではない場合もありますが、この値はサンプルサイズが1であることに由来します。あなたの環境では正しくないかもしれませんし、もちろん変更されることもあります(このような実装固有のものです)。

+0

と思われますが、構造体の先頭にどのようなオフセットが戻っていますか?私はまだこれからスタックを得ることができませんでした。 –

+0

あなたが探している値は、おそらく_CONTEXT構造体のContextFlagsフィールドを表しています。スタック上のマジック値を見つけると、スタックポインタのアドレスは構造体のContextFlagsフィールドのアドレスを指します。したがって、構造体の基底を取得するには、ContextFlagsフィールドのオフセットを減算する必要があります。 – snoone

関連する問題