2009-05-06 16 views
4

これまでは、ASP.NET MVCのデバッグに常にASP.NET MVCフレームワークソースを使用してきました。私のラップトップでは、私はデバッグしてSystem.Web.Mvcを右クリックして "Load Symbols From"> "Microsoft Symbol Servers"を選択している間、VSの "Modules"ウィンドウを立ち上げてみました。マイクロソフトのパブリックシンボルサーバーとは何ですか?

System.Web.Mvcアセンブリのシンボルファイルが読み込まれたため、VSが実際に何かをロードしているように見えました。また、呼び出しスタック内のSystem.Web.Mvcに属するすべての行がグレーから黒になりました。しかし、System.Web.Mvcに属するコードにステップインしようとすると、「ソースコードが利用できません」というエラーメッセージが表示されます。

私はシンボルをロードしましたが、まだソースコードはありませんでした。私はまだそれを古い方法でデバッグすることができるので大きな問題ではありません。しかし、私は、Microsoft Symbol Serverがそれに役立つのかと疑問に思いますか?

+0

陽気です。以下も参照してください。http://social.msdn.microsoft.com/Forums/en/vsdebug/thread/c5084825-06f2-4859-b9f0-61325bfeacba –

答えて

4

これらは、ネイティブDLLに対してスタックトレースを適切に動作させます。シンボルを使用しないと、スタックトレースは、最も近いWindows DLLまでしか行きません。シンボルを使用すると、WinodwsのDLLを継承します。関数名は表示できますが、ソースコードは表示されません(明らかに)。ネイティブのWindowsプログラムをデバッグ

、あなたは多くの場合、このようにスタックトレースを取得:

mydll.dll 
    mydll.dll 
    some_windows_dll.dll 
    some_windows_dll.dll 
    some_other_windows_dll.dll 
    some_other_windows_dll.dll 
    myexe.exe 
    myexe.exe 

WindowsのDLLのシンボルがなければ、あなたはスタックがこれだけ遠くなることがわかります:

mydll.dll 
    mydll.dll 
    some_windows_dll.dll 

と表示されていても、最初から最後まで見ることはできません。

+0

アンマネージドコードには意味がありますが、マネージコードではスタックを見ることができますシンボルファイルを使わなくても外部コード用です。だから私はまだシンボルをロードしてもソースコードにアクセスできない場合、System.Web.Mvcのシンボルファイルをホストする理由は不思議です。 –

+0

マネージコードについてはわかりません。多分、関数のパラメータ値を見ることができますか? – RichieHindle

1

シンボルサーバがマネージドDLLにとって有用でないことがわかりました。管理されたスタックトレースがまだ残っています。私は管理されたシンボルの主な価値は行番号情報だと思いますが、それで何をするつもりですか?

しかし、ネイティブコードをデバッグするためのシンボルがなくても、私は暮らすことができませんでした。そしてsource serverは確かに非常に便利です。

+0

ソースサーバーへのリンクありがとう!残念ながら、それはすべてのアセンブリをカバーしているわけではありませんが、カバーしているアセンブリには便利です。 –

2

私の経験では、シンボルサーバはのために役に立ちます。は、必要な詳細を提供するため、管理されたデバッグとアンマネージドの両方のデバッグが可能です。なぜこれがネイティブコードにとって重要なのかについては既に説明しているので、私はマネージコードに固執します。

私はWinDbg + Sosを使用して管理コードのデバッグをかなり行いますので、定期的にネイティブの部分を調べる必要があります。 OSに管理されたアプリケーションは、管理されていないアプリケーションと変わらないことを覚えておいてください。最終的には、管理対象アプリケーションがWin32 dllを呼び出すことになります。それらを調べるには、適切な記号が必要です。

など。特定の管理対象コールの詳細を調べる必要がある場合は、実際にネイティブコードを調べる必要があります。たとえば、管理されたスタックにMonitor.Enterが表示されている場合があります。コールがちょうど発行された場合、またはスレッドが実際に待機している(*)場合は、それを自分自身で調べることから実際には分かりません。ネイティブコールスタックをダンプすることで、WaitForMultipleObjectsの呼び出しが発行されたかどうかを知ることができます。

(*)ここには!threadsコマンドの状態フラグが役立ちますが、詳細を知りたい場合は、ネイティブスタックのダンプも非常に便利です。

関連する問題