2014-04-01 31 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方法此值。在堆栈跟踪中的这一点将非常清楚地显示出哪些变量持有您正在查找的值。