簡體   English   中英

如何從 Debugger.GetExpression 獲取 DisplayString 字段?

[英]How can I get the DisplayString field from Debugger.GetExpression?

背景

我正在用 C# 編寫一個 Visual Studio 擴展,它在調試另一個應用程序時在立即窗口中執行代碼。 該表達式返回的值可以是 int、字符串文字、類等。我正在調試的應用程序是用 C++ 編寫的。

編碼

要執行即時窗口命令,我使用以下代碼行:

var expression = dte.Debugger.GetExpression("funcname()");

並檢索我使用的結果:

string val = expression.Value;

和:

var children = expression.DataMembers;

這是我正在調試的應用程序中的 myFunc():

std::vector<int> myFunc()
{
    return { 1, 2, 3, 4, 5 };
}

問題

當我在立即窗口中手動運行表達式時,返回的對象將被轉儲,就像我在監視窗口中看到的一樣請參閱此處)。 我設法找到了所有孩子的名字,但缺少值(請參閱此處)。

我想要的是實現 DisplayString ( { size=5 } ),但我還沒有發現任何有用的東西。

如何從 Debugger.GetExpression 獲取 DisplayString 字段?

編輯:我不必使用此 API。 如果您知道可以返回此刺痛的另一種方法,請提出建議。 一種想法可能是檢索立即窗口的完整輸出字符串(見右側),然后對其進行解析。

EDIT2:看這個視頻,更好地解釋了這個問題

你用vector變量來獲取/解析函數返回值,這是合理的,因為myFunc()的返回結果正好是一個vector類型,因此變量std::vector result可以正確解析和獲取vector對象。 “在立即窗口中手動運行表達式,返回的對象將被轉儲,就像我在觀察窗口中看到的那樣”是什么意思?

同時,EnvDTE.Expression.Value 是一個表示對象值的字符串。 它與顯示字符串 '{size=5 }' 無關,它只是一個屬性表達式。 您可以使用以下示例代碼打印它:

public static void Value(DTE dte)  
{  
    // Setup debug Output window.  
    Window w = (Window)dte.Windows.Item(EnvDTE.Constants.vsWindowKindOutput);  
    w.Visible = true;  
    OutputWindow ow = (OutputWindow)w.Object;  
    OutputWindowPane owp = ow.OutputWindowPanes.Add("Value property: ");  
    owp.Activate();  

    EnvDTE.Expression exp = dte.Debugger.GetExpression("tempC", true, 1);  
    owp.OutputString("\nThe name of the expression: " + exp.Name);  
    owp.OutputString("\nThe type of the expression: " + exp.Type);  
    owp.OutputString("\nThe value of the expression: " + exp.Value);  
}

因此,應該是設計使然,我們無法從此處的立即窗口中獲取 '{size=5}':在此處輸入圖片說明

關於“在可視化文件(.natvis)中定義的顯示字符串”,DisplayString應該是自定義的屬性,您能否提供您的可視化文件(.natvis),或者可以重現問題的示例項目?

我發現了什么問題:我是不是經過UseAutoExpandRules (默認為false)在GetExpression 現在我的代碼按預期工作!

感謝@Mia Wu-MSFT 將dte.Debugger.GetExpression("tempC", true, 1)放入她的代碼中並讓我發現了UseAutoExpandRules參數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM