troushoo

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

  1. --/--/--(--) --:--:--|
  2. スポンサー広告

releaseビルド時にも!clrstackで詳細な情報を確認する方法

ビルドをreleaseビルドで行うと、通常!clrstack実行時に関数の引数やローカル変数の値が確認できません。最適化が行われているためです。
そこで、今回はreleaseビルドでも、再コンパイルすることなく!clrstack実行時に関数の引数やローカル変数の値が確認できるようになる方法を記述します。

Releaseビルド時にも!clrstackで関数の引数やローカル変数の値を表示する方法
Releaseビルド時にも!clrstackで関数の引数やローカル変数の値を表示させる方法は以下です。
・<アセンブリ名>.iniをアセンブリがあるフォルダに作成
 例(test.exeの場合):test.exeがあるフォルダにtest.iniを作成
・iniファイルの内容は以下
 [.NET Framework Debugging Control]
 GenerateTrackingInfo=1
 AllowOptimize=0
・アセンブリを再起動
以下サンプルアプリを用いて具体例を見ていきます。

今回利用するアプリ
WriteLine()でローカル変数を表示するだけの単純なアプリを用います。

using System;
 
namespace TestApp
{
    class Program
    {
        static void func3(int i3)
        {
            Console.WriteLine(i3);
        }
 
        static void func2(int i2)
        {
            int i3 = ++i2;
            func3(i3);
        }
 
        static void func1(int i1)
        {
            int i2 = ++i1;
            func2(i2);
        }
 
        static void Main(string[] args)
        {
            func1(1);
        }
    }
}
func3()の先頭で!clrstack -aを実行し、今回の手法を取ったものとそうでないものの違いを見てみます。

手順
まずはiniファイルを作成しない場合の!clrstack -aの結果を確認します。
1. 上記のプロジェクトを作成し、Releaseビルドでビルドします。
Releaseビルドでビルドするには、ソリューションのプロパティを開き、構成プロパティの構成をReleaseにします。

2. WinDbgで上記アプリを起動の後、func3()にブレークポイントを張り、ブレークしたところで!clrstack -aを実行します。
*詳細なデバッグログは後述します。
3. 関数の引数やローカル変数の値が確認できないこと(赤色の部分)を確認します。
0:000> !clrstack -a
OS Thread Id: 0x914 (0)
Child SP IP       Call Site
003febec 004100d0 TestApp.Program.func3(Int32)*** WARNING: Unable to verify checksum for TestApp.exe
*** ERROR: Module load completed but symbols could not be loaded for TestApp.exe

    PARAMETERS:
        i3 (<CLR reg>) = 0x00000003
    LOCALS:
        <no data>

003febf0 004100b7 TestApp.Program.func2(Int32)
    PARAMETERS:
        i2 = <no data>
    LOCALS:
        <no data>

003febf4 00410097 TestApp.Program.func1(Int32)
    PARAMETERS:
        i1 = <no data>
    LOCALS:
        <no data>

003febf8 0041007b TestApp.Program.Main(System.String[])
    PARAMETERS:
       args = <no data>

003fee24 71ed21bb [GCFrame: 003fee24]

次にiniファイルを作成し今回の手順を確認します。
4. TestApp.exeと同じフォルダにTestApp.iniを作成します。iniファイルには以下の内容を記述します。
[.NET Framework Debugging Control]
GenerateTrackingInfo=1
AllowOptimize=0

5. WinDbgで再度上記アプリを起動の後、func3()にブレークポイントを張り、ブレークしたところで!clrstack -aを実行します。
6. 関数の引数やローカル変数の値が確認できることを(赤色の部分)確認します。
0:000> !clrstack -a
OS Thread Id: 0xab8 (0)
Child SP IP       Call Site
0035f2a4 001d0150 TestApp.Program.func3(Int32)*** WARNING: Unable to verify checksum for TestApp.exe
*** ERROR: Module load completed but symbols could not be loaded for TestApp.exe

    PARAMETERS:
        i3 (<CLR reg>) = 0x00000003
    LOCALS:
        <no data>

0035f2a8 001d0135 TestApp.Program.func2(Int32)
    PARAMETERS:
       i2 (0x0035f2b0) = 0x00000003
    LOCALS:
        0x0035f2ac = 0x00000003

0035f2bc 001d00e5 TestApp.Program.func1(Int32)
    PARAMETERS:
        i1 (0x0035f2c4) = 0x00000002
    LOCALS:
        0x0035f2c0 = 0x00000002

0035f2d0 001d0090 TestApp.Program.Main(System.String[])
    PARAMETERS:
        args (0x0035f2d0) = 0x0268adb8

0035f504 71ed21bb [GCFrame: 0035f504]

補足
・上記手順2のデバッグログ、コメントです。
0:000> .symfix c:\sym //シンボルを設定
0:000> .reload
Reloading current modules
.....
0:000> sxe ld:clrjit.dll //func3にブレークポイントを張るために必要。詳細は以前のブログを参照ください。
0:000> g
(2d8.914): Unknown exception - code 04242420 (first chance)
ModLoad: 70bb0000 70c10000   C:\Windows\Microsoft.NET\Framework\v4.0.30319\clrjit.dll
eax=00000000 ebx=00000000 ecx=00000000 edx=00000000 esi=7efdd000 edi=003fe1e0
eip=7751fc42 esp=003fe0b4 ebp=003fe108 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!ZwMapViewOfSection+0x12:
7751fc42 83c404          add     esp,4
0:000> .loadby sos clr
0:000> !bpmd TestApp.exe TestApp.Program.func3
Found 1 methods in module 00122ea4...
MethodDesc = 001237f8
Adding pending breakpoints...
0:000> g
(2d8.914): CLR notification exception - code e0444143 (first chance)
JITTED TestApp!TestApp.Program.func3(Int32) //func3でブレークされる
Setting breakpoint: bp 004100D0 [TestApp.Program.func3(Int32)]
Breakpoint 0 hit
eax=001237f8 ebx=00000000 ecx=00000003 edx=003fecd0 esi=004586f0 edi=003fec20
eip=004100d0 esp=003febec ebp=003fec04 iopl=0         nv up ei pl nz na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000206
004100d0 55              push    ebp

リンク
・イメージのデバッグの簡略化
http://msdn.microsoft.com/ja-jp/library/9dd8z24x.aspx


  1. 2012/06/19(火) 14:39:49|
  2. SOS・Psscor2/Psscor4
  3. | トラックバック:0
  4. | コメント:0
<<MDA (Managed Debugging Assistants)を利用したデバッグ | ホーム | .NETアプリのダンプ取得方法からWinDbgを使った調査開始まで>>

コメント

コメントの投稿


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

トラックバック

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

スポンサーリンク

最新記事

月別アーカイブ

カテゴリ

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

全記事表示リンク

全ての記事を表示する

検索フォーム

RSSリンクの表示

リンク

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

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。