Visual Studio 偵錯工具中的運算式
當您在 [ 快速監看式 ] 對話方塊、[ 監看式 ] 視窗或 [ 即時運算 ] 視窗中輸入運算式時,都能使用 Visual Studio 偵錯工具所包含的運算式評估工具。 在 [ 中斷點 ] 視窗和偵錯工具中的其他許多地方,也都可以使用運算式評估工具。
下列各節描述 Visual Studio 所支援語言的運算式評估限制。
不支援 F# 表達式
無法辨識 F# 表達式。 如果您正在偵錯 F# 程式碼,您要先將運算式轉譯成 C# 語法,才能在偵錯工具視窗或對話方塊方塊中輸入運算式。 當您將運算式從 F# 轉譯為 C# 時,務必記得 C# 使用 ==
運算子來測試是否相等,而 F# 使用單一 =
。
C++ 運算式
如需 C++ 中,在運算式中使用內容運算子的相關資訊,請參閱 Context Operator (C++)。
C++ 不支援的運算式
建構函式、解構函式和轉換
您無法明確或隱含地呼叫 物件的建構函式或解構函式。 例如,下列運算式會明確呼叫建構函式,並產生錯誤訊息:
my_date( 2, 3, 1985 )
如果轉換的目的地是類別,則無法呼叫轉換函式。 這類轉換牽涉到物件的建構。 例如,如果 myFraction
是 CFraction
的執行個體,它負責定義轉換函式運算子 FixedPoint
,那麼下列運算式將會產生錯誤:
(FixedPoint)myFraction
您無法呼叫新的或刪除運算子。 例如,不支援下列表示式:
new Date(2,3,1985)
前置處理器巨集
調試程式中不支援預處理器宏。 例如,如果常數VALUE
宣告為:#define VALUE 3
,則無法在 [監看式] 視窗中使用VALUE
。 為了避免這項限制,您應該盡可能將 #define
取代為列舉和函式。
使用命名空間宣告
您無法使用 using namespace
宣告。 若要存取目前命名空間之外的類型名稱或變數,您必須使用完整限定名稱。
匿名命名空間
不支援匿名命名空間。 如果您有下列程式代碼,則無法新增 test
至監看式視窗:
namespace mars
{
namespace
{
int test = 0;
}
}
int main()
{
// Adding a watch on test doesn't work.
mars::test++;
return 0;
}
使用偵錯工具內建函式維持狀態
偵錯工具內建函式可讓您呼叫運算式中的某些 C/C++ 函式,而不需要變更應用程式的狀態。
偵錯工具內建函式:
保證是安全的:執行調試程式內部函式不會損毀正在偵錯的進程。
允許在所有表達式中,即使在不允許副作用和函式評估的情況下也一樣。
在無法進行一般函式呼叫的案例中運作,例如對小型傾印進行偵錯。
偵錯工具內建函式還可以讓運算式評估更方便。 例如,在中斷點條件中撰寫
strncmp(str, "asd")
比撰寫str[0] == 'a' && str[1] == 's' && str[2] == 'd'
更容易。 )
面積 | 內建函式 |
---|---|
字串長度 | strlen、wcslen、strnlen、wcsnlen |
字串比較 | strcmp、wcscmp、stricmp、wcsicmp、_stricmp、_strcmpi、_wcsicmp、_wcscmpi、strncmp、wcsncmp、strnicmp、wcsnicmp、_strnicmp、_wcsnicmp |
字串搜尋 | strchr、wcschr、memchr、wmemchr、strstr、wcsstr |
Win32 | CoDecodeProxy、DecodePointer、GetLastError、TlsGetValue |
Windows 8 | RoInspectCapturedStackBackTrace、WindowsCompareStringOrdinal、WindowsGetStringLen、WindowsGetStringRawBuffer 這些函式要求要進行偵錯的處理序必須在 Windows 8 上執行。 對從 Windows 8 裝置產生的傾印檔案進行偵錯也要求 Visual Studio 電腦必須執行 Windows 8。 不過,如果您是對 Windows 8 裝置進行遠端偵錯,則 Visual Studio 電腦可以執行 Windows 7。 只有來源層級的執行引擎 (EE) 才能使用 WindowsGetStringLen 和 WindowsGetStringRawBuffer 。 |
其他 | __log2 - 傳回所指定整數的對數底數 2,並捨入至最接近的較小整數。 __findNonNull - 搜尋指標陣列,並傳回第一個非 Null 元素的索引。 - 參數:(1) 陣列中第一個元素的指標 (void*)、(2) 陣列大小 (unsigned int)。 - 傳回值:(1) 陣列中第一個非 Null 元素的以 0 起始的索引,或者,如果找不到,則為 -1。 DecodeHString - 可格式化 HSTRING 值的協助程式函數。 從堆疊中彈出 HSTRING 值,並推送 EE 可用來告知字串所在位置之 StringInfo 結構的位元組。 這隻會由 EE 內部使用;用戶無法直接呼叫。 DecodeWinRTRestrictedException - 解碼 WinRT 受限例外狀況,以取得受限描述。 - 參數:(1) 代表受限參考字串的 Null 終止字串字元。 - 傳回值:Null 終止字串的字元,包含要顯示的實際錯誤訊息。 DynamicCast - 實作 dynamic_cast。 - 參數:(1) 要強制型轉的物件指標。 - 資料項目:CDynamicCastData 物件應該以資料項目形式與對應的 ExecuteIntrinsic() 指令相關聯。 數據項會編碼我們要從和 轉換到的類型,以及我們是否正在評估natvis表達式(診斷以中斷無限遞歸所需的)。 - 傳回值:(1) 物件的指標、轉換成正確的類型,如果轉換的物件不是正確類型的實例,則為 NULL。 DynamicMemberLookup - 動態取得類別成員值的協助程式函數 GetEnvBlockLength - 取得環境區塊長度 (字元) 的協助程式函數。 用於 $env。 Stdext_HashMap_Int_OperatorBracket_idx - 適用於 stdext::hash_map 的 Operator[]。 假設預設雜湊函數具有 'int' 索引鍵。 傳回值。 內部運算子[] 僅支援從哈希表擷取現有的專案 - 它不支援將新專案插入數據表中,因為這可能牽涉到不必要的複雜度,例如記憶體配置。 不過,operator[] 可能可以用來修改與表格中已存在索引鍵相關聯的值。 - 堆疊參數:(1) stdext::hash_map 物件的位址、(2) 表格中的索引鍵 (int)、(3) HashMapPdb 結構,指定函數實作執行查閱所需成員的欄位位移。 這是必要的,因為遠端上無法使用對符號的直接存取。 - 傳回值:(1) 如果索引鍵位於表格中,則是對應至索引鍵之值的位址。 否則為 NULL。 Std_UnorderedMap_Int_OperatorBracket_idx - std::unordered_map 的運作方式與 stdext::hash_map 相同,但雜湊函數不同。 ConcurrencyArray_OperatorBracket_idx // Concurrency::array<>::operator[index<>] 和 operator(index<>) ConcurrencyArray_OperatorBracket_int // Concurrency::array<>::operator(int, int, ...) ConcurrencyArray_OperatorBracket_tidx // Concurrency::array<>::operator[tiled_index<>] 和 operator(tiled_index<>) ConcurrencyArrayView_OperatorBracket_idx // Concurrency::array_view<>::operator[index<>] 和 operator(index<>) ConcurrencyArrayView_OperatorBracket_int // Concurrency::array_view<>::operator(int, int, ...) ConcurrencyArrayView_OperatorBracket_tidx // Concurrency::array_view<>::operator[tiled_index<>] 和 operator(tiled_index<>) TreeTraverse_Init - 初始化新的樹狀周遊。 支援以擴展名為基礎的可視化檢視,不適用於 .natvis 檔案。 TreeTraverse_Next - 從暫止樹狀周遊來擷取節點。 支援以擴展名為基礎的可視化檢視,不適用於 .natvis 檔案。 TreeTraverse_Skip - 跳過暫止樹狀周遊中的節點。 支援以擴展名為基礎的可視化檢視,不適用於 .natvis 檔案。 |
C++/CLI - 不支援的運算式
不支援牽涉到指標或使用者定義轉換的轉換。
不支援對象比較和指派。
不支援多載運算子和多載函式。
不支援 Boxing 和 unboxing。
Sizeof
不支援運算子。
c# - 不支援的運算式
動態物件
您可以在偵錯工具運算式中使用靜態設定類型為動態的變數。 在 [監看式] 視窗中評估可實作 IDynamicMetaObjectProvider 的物件時,會新增 [動態檢視] 節點。 [動態檢視] 節點會顯示對象成員,但不允許編輯成員的值。
不支援動態物件的下列功能:
複合運算子
+=
、-=
、%=
、/=
和*=
多種轉型,包括數值轉型和類型引數轉型
具兩個以上引數的方法呼叫
具有兩個以上引數的 getter 屬性
具有引數的 setter 屬性
指派給索引子
布林運算子
&&
和||
匿名方法
不支援建立新的匿名方法。
Visual Basic - 不支援的運算式
動態物件
您可以在偵錯工具運算式中使用靜態設定類型為動態的變數。 在 [監看式] 視窗中評估實作 IDynamicMetaObjectProvider 的物件時,會加入 [動態檢視] 節點。 [動態檢視] 節點會顯示對象成員,但不允許編輯成員的值。
不支援動態物件的下列功能:
複合運算子
+=
、-=
、%=
、/=
和*=
多種轉型,包括數值轉型和類型引數轉型
具兩個以上引數的方法呼叫
具有兩個以上引數的 getter 屬性
具有引數的 setter 屬性
指派給索引子
布林運算子
&&
和||
區域常數
不支援本機常數。
匯入別名
不支援匯入別名。
變數宣告
您無法在除錯程式視窗中宣告明確的新變數。 不過,您可以在 [即時運算] 視窗中指派新的隱含變數。 這些隱含變數的範圍會限定於偵錯會話,而且無法在調試程式外部存取。 例如,陳述式 o = 5
將會隱含地建立新變數 o
,並將值 5 指派給該變數。 除非偵錯工具能夠推斷類型,否則這類隱含變數屬於 Object 類型。
不支援的關鍵字
AddressOf
End
Error
Exit
Goto
On Error
Resume
Return
Select/Case
Stop
SyncLock
Throw
Try/Catch/Finally
With
命名空間或模組層級關鍵字,例如
End Sub
或Module
。