2020年6月15日月曜日

[Visual Studio] .natvis/.natstepfilter をプロジェクトに追加してウォッチ・ステップインしやすくする

つい先日同僚からの情報で初めて知ったのですが、.natvis はプロジェクトに追加することでプロジェクト固有の Visualizer を設定できるようです。

.natvis って?という方は、過去に記事を書いているのでそちらを参照してください。

今まで Visual Studio 共有な形でインストールしていたので、プロジェクトごとに調整できるのは嬉しいですね!
また、.natvis は .pdb にも埋め込まれるようなので、起動した実行ファイルにアタッチしてデバッグ開始した場合でも、.pdb から .natvis を読み込んで適用されるようです。
(.pdb への埋め込みは設定で解除できます。詳細は最初のリンクへ)

iutest.natvis の例
.natvis がどのようなものか簡単に iutest が用意している .natvis で見てみたいと思います。(iutest は自作の C++ テスティングフレームワークです)

.natvis ファイルは以下。
  
<?xml version="1.0" encoding="utf-8"?>
<autovisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
  <type name="iutest::Test">
    <displaystring>{{ name={test_info_-&gt;m_testname}}}</displaystring>
    <expand>
      <item name="TestName">test_info_-&gt;m_testname</item>
      <item name="TestCaseName">test_info_-&gt;m_testcase-&gt;m_test_case-&gt;m_testcase_name</item>
      <item name="Results">test_info_-&gt;m_test_result</item>
    </expand>
  </type>
</autovisualizer>

これを読み込んでテストでブレークすると以下のように表示されます。


未加工ビューを開くと .natvis 適用していない素の状態を確認できます。


このように iutest では、this から不要なものを取り除いて見やすくした値が確認できるようにしています。

CMake に .natvis を追加する
普通に .natvis を追加すれば ok 。
iutest では、MSVC の場合には add_executable に .natvis を追加しています。

function(iutest_add_executable name)
if (MSVC)
  add_executable(${name} ${ARGN} ${IUTEST_ROOT_DIR}/tools/VisualStudio/Visualizers/iutest.natvis)
else()
  add_executable(${name} ${ARGN})
endif()
endfunction()
.natstepfilter はどうなのか?
Visual Studio の Visualizer にはステップフィルターもあります。
(Visualizer なのかな?って気がしてるが Visualizers ディレクトリに配置するのでそう呼んでる)
ステップフィルターについてはこちらも参考にしてください。

結論から書くと「まだできません」。要望が上がってはいます。

↑のブログでも書きましたが、GetInstance とかプロジェクト固有でステップインしたくないものって結構あると思うんですよね。
.natvis はグローバルにインストールされていても無害なことが多いと思いますが、ステップフィルターは条件をしっかり書かないと、他のプロジェクトのデバッグを阻害することになりかねないですからね。。
今後対応されることを期待します

それでももう少し楽にできないか
現時点では、公式ドキュメントにかかれているとおりに、Visualizers フォルダにコピーして使うことになります。

チームメンバーに .natstepfilter を 「%USERPROFILE%\My Documents\<Visual Studio のバージョン>\Visualizers」 フォルダーにコピーして使ってというのも手間なんで、カスタムビルドルールで勝手にインストールされるようにしてみました。

.natstepfilter ファイルをプロジェクトに追加したら、ファイルのプロパティを開いて、項目を「カスタムビルドツール」にしビルドから除外を「いいえ」にします。
カスタムビルドツールの設定は、コマンドラインに「xcopy /I /Y "%(FullPath)" "$(VisualStudioDir)\Visualizers\"」を設定、出力ファイルを「$(VisualStudioDir)\Visualizers\%(Filename)%(Extension)」に設定します。

この状態でビルドをすると、.natstepfilter ファイルが Visualizers フォルダにコピーされ、デバッグ実行時にはコピーされた .natstepfilter がロードされます。
おまけ

std::string を s8 (UTF-8)表示する .natvis






0 件のコメント:

コメントを投稿