2011-10-28 5 views
3

現在、BSODに起因するクラッシュダンプを顧客から分析しています。私は機密保持の理由からクラッシュダンプを提供することはできませんが、私はちょっと行き詰まってしまいました。クラッシュダンプは、順次命令間でレジスタ値が変更されたことを意味します

DDK内のRtlSetBit関数でクラッシュが発生します。ここでは、コンテキストのレコードがあります:

rax=0000000000000000 rbx=fffff8800282da00 rcx=fffffa8007c10340 
rdx=0000000000000000 rsi=0000000000000001 rdi=fffffa8007c102e0 
rip=fffff8000168d0b4 rsp=fffff880057478e8 rbp=0000000000000000 
r8=0000000000000000 r9=0000000000000000 r10=fffff88001e5dca0 
r11=0000000000000000 r12=0000000000000000 r13=fffffa800812feb0 
r14=0000000000000001 r15=fffff88003490af0 
iopl=0   nv up ei pl zr na po nc 
cs=0010 ss=0018 ds=002b es=002b fs=0053 gs=002b    efl=00010246 
nt!RtlSetBit+0x4: 
fffff800`0168d0b4 0fab10   bts  dword ptr [rax],edx ds:002b:00000000`00000000=???????? 

ここでアセンブリがRtlSetBitのためです:

fffff800`0168d0b0 488b4108  mov  rax,qword ptr [rcx+8] 
fffff800`0168d0b4 0fab10   bts  dword ptr [rax],edx << Exception 
fffff800`0168d0b7 c3    ret 

何奇妙だが、あなたが見ることができるように、raxrcx+8の内容が含まれていない、ということである:

2: kd> dq rcx+8 
fffffa80`07c10348 fffffa80`07c10338 0000000b`00000014 

代わりに、raxにはnullが表示されます。

これはどのように可能ですか?何か不足していますか?

答えて

4

mov rax, qword ptr [rcx+8]が実行されたときの値はおそらく0でした。 btsを実行する前に、別のスレッドがメモリ内の値を変更しました。その後、btsでクラッシュし、メモリを見ると、元の0ではなく、更新された値が表示されます。

0

前の命令は、移動が実行されたとします。しかし、それがアセンブラの前にあるからといって、必ずしも前に実行されているわけではありません。 btsにまっすぐジャンプすると、そのような誤動作につながる可能性があります。

このジャンプの理由は、間違ったコード(手書き/最適化アセンブラを持っているかどうかわからない)、スタック/バッファ/配列のオーバーフロー、スタック上の戻りアドレスを変更してbtsを返すアドレスなど、あまり知られていないバグがあります。

+0

「mov」が実行される(または実行された)と想定するのは安全だと思います。私が提供したアセンブリは、RtlSetBit関数の全体です。私が見ることができるものは、どんな種類のオーバーフローを示すものではありません。 – ReferentiallySeethru

+0

@ReferentiallySeethru:これはRtlSetBitバグ関数とは関係ありません。 RtlSetBitとはまったく無関係な、プログラム全体の中のすべてのものによって飛び越えることができます。単なる飛び越しジャンプです。あなたがデバッガを持っておらず、それを再現できるなら、そのようなエラーは本当にデバッグするのが難しいです。スタックを見て、コールスタックが正当に見えるかどうか、つまりコールスタックの前の関数が実際にあなたのRtlSetBitを呼び出すことができるかどうかをチェックすることでヒントを得ることができます。しかし、これは "誤ったジャンプ"を反証することはできません。 – flolo

+0

はい、コールスタックは正気に見えますが、私は 'misjump'が原因だとは思わなかったのです。私は、現状ではほとんど起こりそうにないと言っていることを却下しているわけではありません。私たちがさらに進歩できなければ、これを念頭に置いておきます。 – ReferentiallySeethru

関連する問題