<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          你很可能需要知道這個(gè)調(diào)試小技巧

          共 3327字,需瀏覽 7分鐘

           ·

          2020-07-03 23:28

          緣起

          最近在調(diào)試的時(shí)候,需要觀察第三方容器中每一個(gè)元素的值。默認(rèn)情況下,vs 并不知道如何顯示第三方容器的內(nèi)容,只能手動(dòng)觀察容器中的每一個(gè)值,超級(jí)不方便。我找到一個(gè)非常給力的好辦法,你還知道其它好辦法嗎?

          為了更直觀的感受這種便利,我特意截圖對(duì)比了三種常用的觀察變量的方法。

          直接觀察

          1、通過 vs 的懸浮提示觀察。

          小貼士:把鼠標(biāo)移動(dòng)到對(duì)應(yīng)的變量即可。

          87a0ccf1b32f4c4d3a49f6e654b8cb1b.webp

          可以發(fā)現(xiàn),現(xiàn)在 vs 并不知道如何解析 pts 的內(nèi)容,只能 “傻傻” 的顯示出 bvector 中的三個(gè)成員。

          2、通過 watch 窗口觀察。

          小貼士:可以使用快捷鍵 ctrl + alt + w, 1 來打開第一個(gè) watch 窗口。據(jù)我觀察,最多支持 4 個(gè) watch 窗口。

          38f2fe06405b1429f1401fda8d6ddd2e.webp

          可以發(fā)現(xiàn),我們可以在代碼中使用的 at(index)[index] 已經(jīng)失效了,只能使用蹩腳的 (pts._C_alloc)._C_begin + index 來觀察對(duì)應(yīng)的變量(反人類,有木有)。

          你也許好奇,我是怎么知道可以使用 (pts._C_alloc)._C_begin + index 來觀察的,簡(jiǎn)單!在懸浮提示中,右鍵,復(fù)制表達(dá)式(X),如下圖:

          062f90612318a78efc60c6084e1cf8cd.webp

          3、通過 quick watch 窗口觀察。

          小貼士:可以選中要觀察的變量,然后按快捷鍵 shift + f9 打開快速監(jiān)視窗口。

          2b42b2089843977e18e571c55bdeca16.webp

          同樣,沒什么用。

          難道只能這么低效嗎?vs2012 之前是的,但是事情從 vs2012 發(fā)生了變化。從 vs2012 開始,vs 支持通過 ?natvis 來觀察變量,超級(jí)方便。

          話不多說,開啟 natvis 后再使用上面的三種方法觀察同樣的變量。

          開啟 natvis 后觀察

          1、通過 vs 的懸浮提示觀察。

          ccdf029dcdbbad446836c671e7213340.webp

          2、通過 watch 窗口觀察。

          e15e5fa980db7b2ffd4bd58cf6f9f497.webp

          3、通過 quick watch 窗口觀察。

          e1859a8e68148f5a90163d93fd06b20f.webp

          有木有很方便?要是很多元素要觀察(比如,有 128 或者 1024 個(gè)),是不是可以節(jié)省很多時(shí)間?

          如何開啟

          可以自己編寫 .natvis文件并放到指定目錄下,重啟 vs 后即可加載。請(qǐng)?jiān)徫冶容^懶,直接從官方文檔上摘錄了一段,更多內(nèi)容可以參考文末給出的參考鏈接。

          搜索位置及順序轉(zhuǎn)載如下[1]

          If multiple valid entries are encountered for the same type, the first one in the following list will be used:

          • PDB
          • Project/solution
          • User directory: %USERPROFILE%\My Documents\Visual Studio 2015\Visualizers
          • Install directory: %VSINSTALLDIR%\Common7\Packages\Debugger\Visualizers

          我放到了 %USERPROFILE%\My Documents\Visual Studio 2013\Visualizers 下。

          ca5814f19c3b4bb1897f8418c69feef0.webp

          提示

          在高版本的 vs 中(vs2017/vs2019vs2015 沒親自確認(rèn)),可以自動(dòng)重新加載修改的 .natvis 文件內(nèi)容,但是 vs2012/vs2013 并不支持動(dòng)態(tài)加載。

          排錯(cuò)

          如果 natvis 加載有問題,可以通過設(shè)置注冊(cè)表開啟診斷信息[2]

          [HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0_Config\Debugger]
          "EnableNatvisDiagnostics"=dword:00000001

          windbg 中的 natvis

          windbg 中也可以使用 dx 命令來進(jìn)行一些高級(jí)查看(超級(jí)超級(jí)厲害的 dx 命令),具體參考 defrag tools 上的視頻。

          • Defrag Tools #138 - Debugging - 'dx' Command Part 1[3]
          • Defrag Tools #139 - Debugging - 'dx' Command Part 2[4]

          最后,附上文中用到的 .natvis 文件,大家可以做個(gè)參考。

          示例


          <AutoVisualizer?xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
          ??
          ??<Type?Name="Bentley::Bstdcxx::bvector<*>">??
          ??<DisplayString>{{size?=?{_C_alloc._C_end?-?_C_alloc._C_begin}}}DisplayString>??
          ??<Expand>??
          ????<Item?Name="[size]">_C_alloc._C_end?-?_C_alloc._C_beginItem>??
          ????<Item?Name="[capacity]">(_C_alloc._C_bufend?-?_C_alloc._C_begin)Item>??
          ????<ArrayItems>??
          ??????<Size>_C_alloc._C_end?-?_C_alloc._C_beginSize>??
          ??????<ValuePointer>_C_alloc._C_beginValuePointer>??
          ????ArrayItems>??
          ??Expand>??
          ??Type>
          AutoVisualizer>

          總結(jié)

          • 調(diào)試時(shí),鼠標(biāo)懸停到對(duì)應(yīng)的變量上可以通過懸浮提示觀察變量的值。

          • 使用 ctr + alt + w,1 可以快速打開 watch 1 窗口。

          • 鼠標(biāo)懸浮到變量上,按 shift + f9 可以打開快速觀察窗口。

          • .natvis 文件可以讓我們個(gè)性化的觀察變量,可以極大的提高我們的調(diào)試效率。

          • 在高版本的 vs 中,我們甚至可以動(dòng)態(tài)編輯 .natvis 文件的內(nèi)容,更加靈活的觀察變量。

          • windbg 中的 dx 命令,可謂神器,但是本文并未介紹,感興趣的小伙伴兒可以直接看視頻!

          參考資料

          • https://blogs.msdn.microsoft.com/vcblog/2015/09/28/debug-visualizers-in-visual-c-2015/
          • https://blogs.msdn.microsoft.com/vcblog/2014/06/12/project-support-for-natvis/
          • https://docs.microsoft.com/en-us/cpp/build/reference/natvis-add-natvis-to-pdb?view=vs-2017
          • https://docs.microsoft.com/en-us/visualstudio/debugger/create-custom-views-of-native-objects?view=vs-2017
          • https://social.msdn.microsoft.com/Forums/vstudio/en-US/6e4a67f8-1239-4b3c-af45-f5ea5ea41e80/enabling-natvis-diagnostic-mode
          • https://stackoverflow.com/questions/17811628/user-defined-natvis-files-in-visual-studio-2012

          References

          [1]

          搜索位置及順序轉(zhuǎn)載如下: https://blogs.msdn.microsoft.com/vcblog/2015/09/28/debug-visualizers-in-visual-c-2015/

          [2]

          開啟診斷信息: https://social.msdn.microsoft.com/Forums/vstudio/en-US/6e4a67f8-1239-4b3c-af45-f5ea5ea41e80/enabling-natvis-diagnostic-mode

          [3]

          Defrag Tools #138 - Debugging - 'dx' Command Part 1: https://channel9.msdn.com/Shows/Defrag-Tools/Defrag-Tools-138-Debugging-dx-Command-Part-1

          [4]

          Defrag Tools #139 - Debugging - 'dx' Command Part 2: https://channel9.msdn.com/Shows/Defrag-Tools/Defrag-Tools-139-Debugging-dx-Command-Part-2




          歡迎留言交流!

          需要你的f8d391edfd006812c4f2caf97e0c80c6.webp



          瀏覽 61
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  豆花视频成人版www满18 | 精品国产成人 | 福利看B网 | 99精产18在线观看 | 亚洲无码手机在线播放 |