Visual Basic ランタイムのソース コードの公開 (Vladimir)

私たちのチームは Visual Basic ランタイム ライブラリのソースの公開に向けた作業を続けていましたが、ついにその公開が実現し、Microsoft.VisualBasic.dll を皆さんにご利用いただけるようになりました。これは、.NET Framework のソースの公開に向けたより全般的な作業の一部です (https://weblogs.asp.net/scottgu/archive/2007/10/03/releasing-the-source-code-for-the-net-framework-libraries.aspx (英語))。今回の公開で最も重要な点は、開発者が VB ランタイム コードを見て、デバッグできるようになったことです。

フレームワーク ソース (VB ランタイムを含む) を使用できるように VS デバッガを設定する方法についての詳しい説明もあります。https://blogs.msdn.com/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code.aspx (英語) をご参照ください。ここでは、発生する可能性のある問題とその回避方法についても説明しています。ほとんどの場合は問題なく処理できますが、問題が発生したときにはこの記事をご参照ください。

 

この機能の使い方について、いくつかの例をお見せします。

ランタイムソースを使わないデバッグ ( 通常の場合 )

 

遅延バインド呼び出しがある単純な VB アプリケーションを作成してから、デバッグ セッションを開始し、関数内で停止しました。通常、VS ではユーザーにこのような呼び出しの詳細を伝えず、呼び出し履歴に [External Code] ([外部コード]) とだけ表示します。

 

 

" マイコードのみ " の無効化

次に、デバッグ オプションで "マイ コードのみ" の設定を無効にして、自分のコードには含まれない呼び出しを見ることができるようにします。

 

 

デバッグ オプションで "マイ コードのみ" の設定を無効にすると、対象となる関数に到達する前に 2 つの呼び出しが実行されたことがわかります。コンパイラでは呼び出される関数がコンパイル時にわからないため、ランタイム ライブラリでの遅延バインド呼び出しのサポートに呼び出しを委任します。自分の関数の間にある呼び出し履歴に表示されるのは、VB ランタイム ライブラリのコードです。この時点では、呼び出し履歴のフレームが淡色表示になっており、これらのフレームに対応するソースが VS にないため、あまり役に立ちません。ダブルクリックすると次のメッセージが表示されます。

 

 

ソースの場所に関する情報の構成

Microsoft VisualBasic のソースが公開されたので、その入手場所を VS に設定できるようになりました。この設定には、VS のソース サーバーのサポートを使用します。
この操作を行う前に、Visual Studio 2008 QFE がインストールされていることを確認する必要があります。この修正プログラムによって、ソース ファイルを取得するデバッガ コンポーネントが更新されます。

1. Visual Studio 2008 で [Tools] (ツール)、[Options] (オプション)、[Debugging] (デバッグ) の順に選択します。
2. [General] (全般) タブで次の操作をします。
a. [Enable Just My Code (Managed Only)] ('マイ コードのみ' 設定を有効にする) をオフにします。
b. [Enable Source Server Support] (ソース サーバー サポートを有効にする) をオンにします。

 

 

ここで、ソースのある場所と、ソースをローカルにキャッシュする場所を VS に設定します。ローカル キャッシュからソースを取得する方が速いので、リモート サーバーからソースにアクセスするときには、キャッシュが重要になります。

[Symbols] (シンボル) タブで次の操作をします。
a.         新規アイコンをクリックし、「https://referencesource.microsoft.com/symbols」と入力します。
b. [Search the above locations only when symbols are loaded manually] (シンボルが手動で読み込まれるときのみ上記の場所を探す) をオンにします。
c.         シンボルをキャッシュするパスをテキスト ボックスに入力します。この場所は、自分のユーザー アカウントが書き込みアクセス許可を持っている場所にしてください (d:\symbols など)。
d. [OK] をクリックします。

 

最初のランタイム フレームを右クリックし、[シンボルの読み込み] を選択します。シンボルが読み込まれるまで待ちます。この処理には少し時間がかかる場合があります。また、最初にこの処理を行うときには、使用許諾契約書の内容に同意することを求められます。最初のランタイム フレームをダブルクリックしてみると、ランタイム コードが表示されます。
初回はリモート サーバーからソースを取得するので多少時間がかかりますが、いったんキャッシュしてしまえば、次回からは時間がかかりません。

 

 

VB ランタイム内へのブレークポイントの設定

ランタイム コードを F11 でステップ実行し、ブレークポイントを設定することもできます。興味のある方は、遅延バインド呼び出しヘルパーの最初にブレークポイントを設定し、プロジェクトを再起動してみてください。ブレークポイントをヒットしたら、F11 で遅延バインド コードをステップ実行し、それがどのように実装されているかを確認できます。

1 つ注意すべきことがあります。サーバー上のソースには元のソースと同じコードが含まれていますが、まったく同一ではありません。最後に置かれた著作権のバナーなど、多少の違いがあります。そのため、VS ではソースの不一致が報告されます。

 

ブレークポイントを右クリックし、[Location] (場所) メニューを表示して、[Allow source file to be different from the original location] (元のバージョンと異なるソース コードを許可する) チェック ボックスをオンにすることで、これを解決できます。この設定をグローバルに行うこともできますが、その場合はすべてのプロジェクトに影響が出る可能性があるので、お勧めしません。

また、実行がブレークポイントに到達する前にシンボルが確実に読み込まれるようにするには、シンボルの "手動のみ" 読み込みを無効にする必要があります。

これによって、すべてのシンボルがオンデマンドで読み込まれ、それには多くの .NET FX ライブラリも含まれます。そのため、デバッグ セッションを起動するときに多少時間がかかることがあります。

 

 

これによって、すべてのシンボルがオンデマンドで読み込まれ、それには多くの .NET FX ライブラリも含まれます。そのため、デバッグ セッションを起動するときに多少時間がかかることがあります。シンボルが読み込まれた後、ランタイム内のブレークポイントをヒットできるようになります。

 

 

MsgBox の内容

もう 1 つの興味深いシナリオは、VB ランタイム関数の F11 でのステップ実行です。私が一番使うのは MsgBox だと思うので、その内容を見てみましょう。
hello world プロジェクトで、MsgBox の呼び出しにブレークポイントを設定できます。

 

 

ブレークポイントにヒットしたら、F11 を行います。これで、MsgBox の中に入りました! ここでステップ実行して、どのように機能するのかを確認できます。

 

 

既知の問題、FAQ

1)      リモート シンボルへのアクセスに時間がかかります。そのため、VS でソースを取得するときに遅延が生じます。キャッシュが有効になっていても、その情報が最新のものであるかどうかを VS がチェックする場合があります。これを回避するには、[Tools] (ツール)、[Options] (オプション)、[Debugging] (デバッグ)、[Symbols] (シンボル) の順に選択し、[Search the above locations when symbols are loaded manually] (シンボルが手動で読み込まれるときのみ上記の場所を探す) チェック ボックスをオフにしてから、プロジェクトをデバッグします。この構成ですべてのソース (各種の .NET ライブラリを含む) を読み込むと、多少時間がかかる場合があります (50 MB を超えるソースを読み込むことがよくあります)。VS で読み込みが完了したら、再度 [Tools] (ツール)、[Options] (オプション)、[Debugging] (デバッグ)、[Symbols] (シンボル) の順に選択し、[Search the above locations when symbols are loaded manually] (シンボルが手動で読み込まれるときのみ上記の場所を探す) チェック ボックスをオンにして、[OK] をクリックします。これにより、不要なときにデバッガがサーバーに接続することを回避できます。

2)      一部の変数やメソッドが使用できない場合があります。原因は、リテール バージョン (最適化バージョン) を使用しているためです。リテール バージョンでの最適化によって、一部の情報が使用できなくなったり、"インライン化" されたりします。ソース情報は保持されますが、データにアクセスできなかったり、ブレークポイントを設定できなかったりすることがあります。ただし、大部分は正常に機能します。

3)      VB Express でもこの機能を使用できますか。
いいえ、使用できません。この機能を使用するには、Express バージョンには含まれていない、いくつかの Visual Studio コンポーネントが必要です。

 

- VisualBasic チーム、Vladimir

 

VB チーム

投稿 : 2008 年 1 月 19 日 8:01 AM

分類 : IDEOrcasVB2008デバッガVladimir

 

VB チームの Web ログ - https://blogs.msdn.com/vbteam/archive/2008/01/19/source-code-of-visual-basic-runtime-has-been-released-to-public.aspx (英語) より