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'。
您可以將逗號 (,) 附加至 [監看式] 視窗中的值,以檢視並選取可用的格式規範清單。
格式規範
下表說明可在 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 個項目的陣列。 |