2016-04-13 6 views
2

私は!objsizeコマンドを使ってオブジェクトの真の値を取得します。たとえば、以下のコマンドを実行すると、アドレス00000003a275f218のオブジェクトのサイズが18進数で10進数で24に変換されることがわかります。!objsizeの矛盾(16進数)

0:000> !ObjSize 00000003a275f218 
sizeof(00000003a275f218) = 24 (0x18) bytes 

これまでのところとても良いです。オブジェクトに対して同じコマンドを実行していますが、そのサイズは16進数と10進数の間に不一致があります。 enter image description here

したがって、16進数のサイズは0xafbde200です。私のcalcを使って10進数に変換すると、になりますが、コマンドの出力は小数点以下のサイズが-1346510336になります。サイズの違いがある理由を誰かが理解できるように助けることができますか?

答えて

3

それはSOSのバグです。あなたはsource codeを見れば、あなたはこの方法であなたはそれがある、書式指定子として%d使用して見ることができるようにそれは出力

ExtOut("sizeof(%p) = %d (0x%x) bytes (%S)\n", SOS_PTR(obj), size, size, methodTable.GetName()); 

として、次の形式を使用しています

DECLARE_API(ObjSize) 

として宣言されています符号付き10進整数の場合代わりに符号なし10進整数の場合は%uでなければなりません。負の量のメモリを使用するオブジェクトを持つことはできません。

Gitの使い方を知っていれば、パッチを提供するかもしれません。

0:000> ? 0xafbde200 
Evaluate expression: 2948456960 = 00000000`afbde200 
+0

優秀、時間をかけてソースを確認していただきありがとうございます! –

2

違いは記号です。これは、最初のビット(最初の16進バイトが "A"であるため1です)を負の符号として解釈しているようです。これらの2つの数字は、それ以外は同じです。 HexにCALC.EXE(プログラマ・モード)、スイッチ上の

貼り付け-1346510336:

FFFFFFFFAFBDE200

貼り付け2948456960、六角のスイッチは:

AFBDE200

+0

ので、このオブジェクトの本当の大きさです:

あなたは符号なしの値を参照するのWinDbgで?を使用することができます。私は値を16進数または10進数で信頼すべきですか? – BKS

+2

私は正の値を取る、私は本当に否定を意味するobjsize関数の理由を参照してください –

+0

あなたはオブジェクトまたは2948456960のサイズとして+1346510336を取ることを意味ですか? – BKS