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 )

如果轉換的目的地是類別,則無法呼叫轉換函式。 這類轉換牽涉到物件的建構。 例如,如果 myFractionCFraction的執行個體,它負責定義轉換函式運算子 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、wcslenstrnlen、wcsnlen
字串比較 strcmp、wcscmpstricmp、wcsicmp_stricmp、_strcmpi、_wcsicmp、_wcscmpistrncmp、wcsncmpstrnicmp、wcsnicmp_strnicmp、_wcsnicmp
字串搜尋 strchr、wcschrmemchr、wmemchrstrstr、wcsstr
Win32 CoDecodeProxyDecodePointerGetLastErrorTlsGetValue
Windows 8 RoInspectCapturedStackBackTraceWindowsCompareStringOrdinalWindowsGetStringLenWindowsGetStringRawBuffer

這些函式要求要進行偵錯的處理序必須在 Windows 8 上執行。 對從 Windows 8 裝置產生的傾印檔案進行偵錯也要求 Visual Studio 電腦必須執行 Windows 8。 不過,如果您是對 Windows 8 裝置進行遠端偵錯,則 Visual Studio 電腦可以執行 Windows 7。
只有來源層級的執行引擎 (EE) 才能使用 WindowsGetStringLenWindowsGetStringRawBuffer
其他 __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 SubModule