troushoo

[sos]!U:アセンブラの表示

WinDbg等で使用できる.NET用のデバッガエクステンションsosで、アセンブラを表示する!Uについて記述します。

今回使用するアプリ
以下のサンプルアプリを起動し、Mainのアセンブラを表示してみます。

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("テスト");
    }
}

[!U]
!Uは引数にコードのアドレスを指定してアセンブラを表示させることができます。
(詳細なログは後述します。ここでは結果だけを表示します。)
0:000> !U eip
Normal JIT generated code
U.Program.Main(System.String[])
Begin 00510070, size 27
>>> 00510070 55              push    ebp
00510071 8bec            mov     ebp,esp
00510073 50              push    eax
00510074 894dfc          mov     dword ptr [ebp-4],ecx
00510077 833db031290000  cmp     dword ptr ds:[2931B0h],0
0051007e 7405            je      00510085
00510080 e8dc13225e      call    mscorwks!JIT_DbgIsJustMyCode (5e731461)
00510085 90              nop
00510086 8b0d30205803    mov     ecx,dword ptr ds:[3582030h] ("テスト")
*** WARNING: Unable to verify checksum for C:\Windows\assembly\NativeImages_v2.0.50727_32\mscorlib\a1a82db68b3badc7c27ea1f6579d22c5\mscorlib.ni.dll
0051008c e86b44b75d      call    mscorlib_ni+0x6d44fc (5e0844fc) (System.Console.WriteLine(System.String), mdToken: 060007c9)
00510091 90              nop
00510092 90              nop
00510093 8be5            mov     esp,ebp
00510095 5d              pop     ebp
00510096 c3              ret

補足
・uとの違い
!Uコマンドは.NETを意識した結果を出力してくれますが、uコマンドは.NETを意識した出力とはなりません。
たとえば、ufコマンドを使用したMainの出力は以下になります。
0:000> uf 00510070
00510070 55              push    ebp
00510071 8bec            mov     ebp,esp
00510073 50              push    eax
00510074 894dfc          mov     dword ptr [ebp-4],ecx
00510077 833db031290000  cmp     dword ptr ds:[2931B0h],0
0051007e 7405            je      00510085

00510080 e8dc13225e      call    mscorwks!JIT_DbgIsJustMyCode (5e731461)

00510085 90              nop
00510086 8b0d30205803    mov     ecx,dword ptr ds:[3582030h]
0051008c e86b44b75d      call    mscorlib_ni+0x6d44fc (5e0844fc)
00510091 90              nop
00510092 90              nop
00510093 8be5            mov     esp,ebp
00510095 5d              pop     ebp
00510096 c3              ret

0051008cをみてみると!Uでは関数名がわかりますが、ufではわかりません。
  !Uの出力
  0051008c e86b44b75d call mscorlib_ni+0x6d44fc (5e0844fc) (System.Console.WriteLine(System.String), mdToken: 060007c9)
  ufの出力
  0051008c e86b44b75d call mscorlib_ni+0x6d44fc (5e0844fc)

・.NET 4.0のsosの!U
以下のように、ソースコードでの行を表示してくれます。
0:000> !U eip
Normal JIT generated code
U.Program.Main(System.String[])
Begin 00250070, size 27
*** WARNING: Unable to verify checksum for U.exe

c:\users\seven\documents\visual studio 2010\Projects\U\U\Program.cs @ 11:
>>> 00250070 55              push    ebp
00250071 8bec            mov     ebp,esp
00250073 50              push    eax
00250074 894dfc          mov     dword ptr [ebp-4],ecx
00250077 833d44311d0000  cmp     dword ptr ds:[1D3144h],0
0025007e 7405            je      00250085
00250080 e8fa63bf71      call    clr!JIT_DbgIsJustMyCode (71e4647f)
00250085 90              nop

c:\users\seven\documents\visual studio 2010\Projects\U\U\Program.cs @ 12:
00250086 8b0d30205103    mov     ecx,dword ptr ds:[3512030h] ("テスト")
*** WARNING: Unable to verify checksum for C:\Windows\assembly\NativeImages_v4.0.30319_32\mscorlib\860de4c5977f6462ec91f6275b23ba71\mscorlib.ni.dll
0025008c e80b70866f      call    mscorlib_ni+0x25709c (6fab709c) (System.Console.WriteLine(System.String), mdToken: 06000954)
00250091 90              nop

c:\users\seven\documents\visual studio 2010\Projects\U\U\Program.cs @ 13:
00250092 90              nop
00250093 8be5            mov     esp,ebp
00250095 5d              pop     ebp
00250096 c3              ret

・今回のデバッグログ
Microsoft (R) Windows Debugger Version 6.12.0002.633 X86
Copyright (c) Microsoft Corporation. All rights reserved.

CommandLine: "C:\Users\seven\Documents\Visual Studio 2010\Projects\U\U\bin\Debug\U.exe"
Symbol search path is: srv*
Executable search path is:
ModLoad: 01170000 01178000   U.exe  
(12d4.11dc): Break instruction exception - code 80000003 (first chance)
eax=00000000 ebx=00000000 ecx=ca4a0000 edx=0025e088 esi=fffffffe edi=00000000
eip=77800fab esp=001af644 ebp=001af670 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
ntdll!LdrpDoDebuggerBreak+0x2c:
77800fab cc              int     3
0:000> .symfix c:\sym
0:000> .reload
Reloading current modules
.....
0:000> sxe ld:mscorjit
0:000> g
ModLoad: 62d60000 62dbb000   C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorjit.dll
eax=00000000 ebx=00000000 ecx=00000000 edx=00000000 esi=7efdd000 edi=001ae50c
eip=7777fc42 esp=001ae3e0 ebp=001ae434 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
ntdll!NtMapViewOfSection+0x12:
7777fc42 83c404          add     esp,4
0:000> .loadby sos mscorwks
0:000> !bpmd U.exe U.Program.Main
Found 1 methods...
MethodDesc = 00293398
Adding pending breakpoints...
0:000> g
(12d4.11dc): CLR notification exception - code e0444143 (first chance)
JITTED U!U.Program.Main(System.String[])
Setting breakpoint: bp 00510070 [U.Program.Main(System.String[])]
Breakpoint 0 hit
eax=00293398 ebx=001aef9c ecx=0260ce14 edx=00000000 esi=006e89a0 edi=00000000
eip=00510070 esp=001aef74 ebp=001aef80 iopl=0         nv up ei pl nz ac po nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000212
00510070 55              push    ebp
0:000> !U eip
Normal JIT generated code
U.Program.Main(System.String[])
Begin 00510070, size 27
>>> 00510070 55              push    ebp
00510071 8bec            mov     ebp,esp
00510073 50              push    eax
00510074 894dfc          mov     dword ptr [ebp-4],ecx
00510077 833db031290000  cmp     dword ptr ds:[2931B0h],0
0051007e 7405            je      00510085
00510080 e8dc13225e      call    mscorwks!JIT_DbgIsJustMyCode (5e731461)
00510085 90              nop
00510086 8b0d30205803    mov     ecx,dword ptr ds:[3582030h] ("テスト")
*** WARNING: Unable to verify checksum for C:\Windows\assembly\NativeImages_v2.0.50727_32\mscorlib\a1a82db68b3badc7c27ea1f6579d22c5\mscorlib.ni.dll
0051008c e86b44b75d      call    mscorlib_ni+0x6d44fc (5e0844fc) (System.Console.WriteLine(System.String), mdToken: 060007c9)
00510091 90              nop
00510092 90              nop
00510093 8be5            mov     esp,ebp
00510095 5d              pop     ebp
00510096 c3              ret

リンク
・MSDNによる!dumpheap含むsos.dllの説明
http://msdn.microsoft.com/en-us/library/bb190764.aspx


  1. 2012/04/04(水) 15:22:47|
  2. SOS・Psscor2/Psscor4
  3. | トラックバック:0
  4. | コメント:0
<<CLRプロファイラ V4の紹介 | ホーム | [Psscor2/Psscor4]!ConvertTicksToDate>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://troushoo.blog.fc2.com/tb.php/46-1158390d
この記事にトラックバックする(FC2ブログユーザー)

スポンサーリンク

最新記事

月別アーカイブ

カテゴリ

ツール (92)
ネットワーク (76)
Visual Studio (56)
SOS・Psscor2/Psscor4 (25)
WinDbg (25)
Linux (24)
Azure (17)
Tips (20)
英語 (1)
About Me (1)
未分類 (0)

全記事表示リンク

全ての記事を表示する

検索フォーム

RSSリンクの表示

リンク

このブログをリンクに追加する