分享方式:


Visual Studio 偵錯工具中 C++ 的格式規範

您可以使用格式規範,變更在 [監看式]、[自動變數] 和 [區域變數] 視窗中顯示值的格式。

您也可以在 [即時運算] 視窗、[命令] 視窗、追蹤點,甚至來源視窗中使用格式規範。 如果暫停在這些視窗中的某個運算式上,結果會顯示在 [資料提示方塊] 中。 DataTip 顯示會反映格式規範。

注意

當 Visual Studio 原生偵錯工具變更為新的偵錯引擎時,系統會新增一些新的格式規範並移除一些舊的規範。 當您使用 C++/CLI 執行 Interop (混合原生和 Managed) 偵錯時仍會使用較舊的偵錯工具。

設定格式規範

我們將使用下列範例程式碼:

int main() {
    int my_var1 = 0x0065;
    int my_var2 = 0x0066;
    int my_var3 = 0x0067;
}

在偵錯時,將 my_var1 變數新增至 [監看式] 視窗:[偵錯]>[Windows]>[監看式]>[監看式 1]。 接下來,以滑鼠右鍵按一下變數,然後選取 [十六進位顯示]。 [監看式] 視窗現在顯示值 0x0065。 若要查看此值 (以字元而非整數表示),請先以滑鼠右鍵按一下並取消選取 [十六進位顯示]。 然後在變數名稱後面的名稱資料行中新增字元格式規範 , c。 [值] 資料行現在顯示 101 'e'

Screenshot of the Visual Studio Watch window with one selected line that shows my_var1.c with a value of 101 'e' and a type of int.

您可以將逗號 (,) 附加至 [監看式] 視窗中的值,以檢視並選取可用的格式規範清單。

WatchFormatSpecDropdown

格式規範

下表說明可在 Visual Studio 中使用的格式規範。 只有新的偵錯工具支援粗體的規範,而使用 C++/CLI 的 Interop 偵錯則不支援。

規範 格式 原始的監看值 顯示的值
十進位整數 0x00000066 102
o 不帶正負號的八進位整數 0x00000066 000000000146
x

小時
十六進位整數 102 0xcccccccc
X

H
十六進位整數 102 0xcccccccc
xb

hb
十六進位整數 (沒有前置的 0x) 102 cccccccc
Xb

Hb
十六進位整數 (沒有前置的 0x) 102 CCCCCCCC
b 不帶正負號的二進位整數 25 0b00000000000000000000000000011001
bb 不帶正負號的二進位整數 (不含前置的 0b) 25 00000000000000000000000000011001
e 科學記號標記法 25000000 2.500000e+07
g 科學記號或浮點數中較短者 25000000 2.5e+07
c 單一字元 0x0065 101 'e'
s const char* 字串 (有引號) <location> "hello world" "hello world"
sb const char* 字串 (無引號) <location> "hello world" hello world
s8 UTF-8 字串 <location> "This is a UTF-8 coffee cup ☕" "This is a UTF-8 coffee cup ☕"
s8b Utf-8 字串 (無引號) <location> "hello world" hello world
su Unicode (UTF-16 編碼) 字串 (有引號) <location> L"hello world" L"hello world"

u"hello world"
sub Unicode (UTF-16 編碼) 字串 (無引號) <location> L"hello world" hello world
bstr BSTR 二進位字串 (有引號) <location> L"hello world" L"hello world"
env 環境區塊 (雙重 null 結尾的字串) <location> L"=::=::\\" L"=::=::\\\0=C:=C:\\windows\\system32\0ALLUSERSPROFILE=...
s32 UTF-32 字串 (無引號) <location> U"hello world" u"hello world"
s32b Utf-32 字串 (沒有引號) <location> U"hello world" hello world
en 列舉 Saturday(6) 星期六
hv 指標類型:指出檢查中的指標值是陣列堆積配置的結果,例如 new int[3] <location>{<first member>} <location>{<first member>, <second member>, ...}
na 隱藏物件指標的記憶體位址。 <location>, {member=value...} {成員=值...}
nd 只顯示基底類別資訊,忽略衍生類別 (Shape*) square 包含基底類別和衍生類別資訊 只顯示基底類別資訊
小時 HRESULT 或 Win32 錯誤碼。 當偵錯工具進行自動解碼時,HRESULT 不再需要此規範。 S_OK S_OK
wc Window 類別旗標 0x0010 WC_DEFAULTCHAR
wm Windows 訊息編號 16 WM_CLOSE
nr 隱藏「未經處理的檢視」項目
nvo 僅顯示數值的「原始檢視」項目
! 未經處理格式,忽略任何資料類型檢視自訂 <自訂的表示法> 4
控制代碼 顯示有關 win32 控制代碼的資訊 0x000000000000009c 顯示有關控制代碼的實用資訊,例如執行緒識別碼等等

注意

hv 格式規範出現時,偵錯工具會嘗試判斷緩衝區的長度並顯示適當的項目數目。 因為偵錯工具不一定能一直找到陣列確切的緩衝區大小,所以您應該盡可能使用大小規範 (pBuffer,[bufferSize]) 。 當緩衝區大小不是隨時可用時,hv 格式規範很有用。

做為陣列的指標大小規範

如果您希望將物件指標視為陣列,可以使用整數或運算式來指定陣列項目的數量。

規範 格式 原始的監看值 顯示的值
n 十進位或 十六進位 整數 pBuffer,[32]

pBuffer,[0x20]
顯示 pBuffer 為 32 個項目的陣列。
[exp] 判斷值為整數的有效 C++ 運算式。 pBuffer,[bufferSize] PBuffer 顯示為 bufferSize 項目的陣列。
expand(n) 判斷值為整數的有效 C++ 運算式 pBuffer,expand(2) 顯示 pBuffer的第三個項目

使用 C++/CLI 的 Interop 偵錯格式規範

規範 格式 原始的監看值 顯示的值
o 不帶正負號的八進位整數 0xF065 0170145
x

X
十六進位整數 61541 0x0000f065
c 單一字元 <location> 101 'e'
s const char* (有引號) <location> "hello world"
su const wchar_t*

const char16_t* (有引號)
<location> L"hello world"
sub const wchar_t*

const char16_t*
<location> hello world
s8 const char* (有引號) <location> "hello world"
小時 HRESULT 或 Win32 錯誤碼。
當偵錯工具進行自動解碼時,HRESULT 不再需要此規範。
S_OK S_OK
wc Window 類別旗標 0x00000040, WC_DEFAULTCHAR
wm Windows 訊息編號 0x0010 WM_CLOSE
! 未經處理格式,忽略任何資料類型檢視自訂 <自訂的表示法> 4

原生和 C++/CLI 程式碼的 d、e、f、g、h、i、l、m、ma、mb、md、mq、mu、mw 及 u 規範需要舊版偵錯工具,這在 Visual Studio 2022 或更新版本中不提供支援。

偵錯原生和 C++/CLI 程式碼僅支援 粗體 的規範。 這些規範需要使用 [受控相容性模式] 指定的舊版偵錯工具。

規範 格式 原始的監看值 顯示的值


i
帶正負號的十進位整數 0xF000F065 -268373915
u 不帶正負號的十進位整數 0x0065 101
o 不帶正負號的八進位整數 0xF065 0170145
x

X
十六進位整數 61541 0x0000f065
l

小時
長整數或短整數前置詞,用於:d、i、u、o、x、X 00406042 0x0c22
f 帶正負號的浮點數 (3./2.), f 1.500000
e 帶正負號的科學記號表示法 (3.0/2.0) 1.500000e+000
g 帶正負號的浮點數或帶正負號的科學記號標記法,
兩者中較短者
(3.0/2.0) 1.5
c 單一字元 <location> 101 'e'
s const char* (有引號) <location> "hello world"
su const wchar_t*

const char16_t* (有引號)
<location> L"hello world"
sub const wchar_t*

const char16_t*
<location> hello world
s8 const char* (有引號) <location> "hello world"
小時 HRESULT 或 Win32 錯誤碼。
當偵錯工具進行自動解碼時,HRESULT 不再需要此規範。
S_OK S_OK
wc Window 類別旗標 0x00000040, WC_DEFAULTCHAR
wm Windows 訊息編號 0x0010 WM_CLOSE
! 未經處理格式,忽略任何資料類型檢視自訂 <自訂的表示法> 4

使用 C++/CLI 的 Interop 偵錯中記憶體位置的格式規範

下表說明用於記憶體位置的格式化符號。 您可將記憶體位置規範用於評估結果為位置的任何數值或運算式。

偵錯原生和 C++/CLI 程式碼僅支援 粗體 的規範。 這需要使用 [受控相容性模式] 指定的舊版偵錯工具。

符號 格式 原始的監看值 顯示的值
ma 64 個 ASCII 字元 0x0012ffac 0x0012ffac .4...0...".0W&.......1W&.0.:W..1...."..1.JO&.1.2.."..1...0y....1
m 十六進位表示的 16 個位元組,後面跟著 16 個 ASCII 字元 0x0012ffac 0x0012ffac B3 34 CB 00 84 30 94 80 FF 22 8A 30 57 26 00 00 .4...0...".0W&..
mb 十六進位表示的 16 個位元組,後面跟著 16 個 ASCII 字元 0x0012ffac 0x0012ffac B3 34 CB 00 84 30 94 80 FF 22 8A 30 57 26 00 00 .4...0...".0W&..
mw 8 個字組 0x0012ffac 0x0012ffac 34B3 00CB 3084 8094 22FF 308A 2657 0000
md 4 個 Doubleword 0x0012ffac 0x0012ffac 00CB34B3 80943084 308A22FF 00002657
mq 2 個 Quadword 0x0012ffac 0x0012ffac 7ffdf00000000000 5f441a790012fdd4
mu 2 個位元組的字元 (Unicode) 0x0012ffac 0x0012ffac 8478 77f4 ffff ffff 0000 0000 0000 0000

在使用 C++/CLI 的 Interop 偵錯中作為陣列之指標的大小規範

如果您希望將物件指標視為陣列,可以使用整數來指定陣列項目的數量。

規範 格式 運算式 顯示的值
n 十進位整數 pBuffer[32] 顯示 pBuffer 為 32 個項目的陣列。