2014-04-01 32 views
3

我正在調試舊的C#應用​​程序。有一個屏幕,我可以點擊運行對服務器的查詢並獲得結果列表。如何找到值分配給哪個變量?

的問題是,我有麻煩搞清楚,結果是如何計算的。每個結果都有一個浮點數與其關聯,並顯示在屏幕上。假設爲了討論的緣故,第一個結果旁邊的數字是123.45。

我猜想,數123.45必須在某個時候被分配到一個浮點變量,但如果有幾百萬行的代碼,我有很多挖做的!

所以,我在想,如果我敢肯定,數123.45在一些點分配給一個變量,有沒有找到它發生在哪裏一些方便的途徑,什麼變量被分配到?有沒有一個這樣的調試工具?

編輯:這裏的評論者是正確的指出,我不知道該號碼被分配給一個變量;我只是猜測它可能是。另外,我熟悉在斷點上設置條件,但這在這裏沒有幫助,因爲要設置斷點,您必須知道分配發生在哪條線上。

我在這裏的問題是,是否有檢測被分配在未知地方在代碼中的未知變量特定值的方式。我想找到其中分配發生,並且其變量被分配到

第二個編輯:讓我們比較這對使用SQL事件探查器。如果我知道值123.45正被插入到表中或作爲參數傳遞給存儲過程,那麼我可以使用SQL分析器並過濾包含字符串「123.45」的命令的命令文本。這可能會找到用於將123.45發送到SQL服務器的確切命令。如果我正在尋找要分配給C#變量的值,我能做些類似的事情,但我不知道哪一個?

我認爲,答案很可能是「不」,但我以爲有人在這裏也許能提供一些線索這光。

+0

不*具有*被分配給'變量'。例如,可以是UI元素的一部分。 –

+0

我假設你熟悉你可以在斷點上設置的條件? – rene

+0

你有源嗎?如果是的話,你可以設置一個斷點並使用調用堆棧? –

回答

3

如果你能縮小它的不同的UI調度員是更新你的屏幕,你可以添加檢查特定值的條件,如:

enter image description here

enter image description here

enter image description here

enter image description here

+0

感謝您的回答,但我不知道我可以用這種方式縮小範圍。問題在於應用程序的編寫過程比它需要的複雜得多。 –

0

如果您在vs 2012中,您可以嘗試添加手錶嗎?我不確定在您的環境中是否可行,但爲您想要查找的方法調用的開始處設置斷點。右鍵單擊您的變量,然後單擊添加監視並在底部按照它。

+0

如果我知道要觀察哪個變量,觀察列表變量可能會有所幫助,但在這種情況下,我甚至不知道變量的名稱! –

0

考慮到這兩種方法,增加另一個答案是不同的概念。

找到它的一個可能的解決方案是添加一個小方法,執行檢查並以編程方式使用Debugger.Break()打破調試會話。

我怕我的WPF不是很好,所以我也很快模擬一個數據源,只需直接添加值Control.Items,通過少量event處理它,每次添加一個項目時調用(所以我模擬OnItemSourceChanged事件)。

你應該使用內建的數據綁定集合,但概念是相同的(如果你有一個「乾淨」的方法的工作示例,隨意編輯和添加它)。

考慮這個例子:

public partial class MainWindow : Window 
{ 
    public event EventHandler<EventArgs> UpdateUI; 

    public MainWindow() 
    { 
     InitializeComponent(); 
     UpdateUI += sniff; 

     PrintFromA(); 
     PrintFromB(); 
    } 

    private void sniff(object sender, EventArgs e) 
    { 
     if (lstSample.Items.Contains(45)) 
     { 
      Debugger.Break(); 
     } 
    } 

    private void updateUI(int i) 
    { 
     Dispatcher.Invoke(() => 
     { 
      lstSample.Items.Add(i); 
     }); 

     UpdateUI.Invoke(this, new EventArgs()); 
    } 


    private void PrintFromA() 
    { 
     for (int i = 0; i < 50; i += 2) 
     { 
      updateUI(i); 
     } 
    } 

    private void PrintFromB() 
    { 
     for (int i = 0; i < 50; i++) 
     { 
      updateUI(i); 
     } 
    } 
} 

我們還在檢查,如果值是45,所以PrintFromB應該是我們正在尋找(PrintFromA將繞過它)的方法。

當我們執行此操作時,我們可以看到當PrintFromB幾乎完全執行時,我們的代碼被暫停,剛剛添加了45個點。

望着堆棧跟蹤,我們看到:

enter image description here

現在,我們可以清楚地看到,我們從PrintFromB方法此值。在堆棧跟蹤中的這一點將非常清楚地顯示出哪些變量持有您正在查找的值。