如何查找赋值的变量?

时间:2014-04-01 19:02:06

标签: c# .net visual-studio debugging variables

我在旧的C#应用​​程序上进行调试。有一个屏幕,我可以点击它来对服务器运行查询并获得结果列表。

问题在于我无法弄清楚如何计算结果。每个结果都有一个与其关联的浮点数,显示在屏幕上。为了便于讨论,假设第一个结果旁边的数字是123.45。

我猜想在某些时候必须将数字123.45分配给浮点变量,但是如果有数百万行代码,我还有很多需要做的事情!

因此,我想知道如果我确定在某个时刻将数字123.45分配给变量,是否有一些方便的方法来查找它发生的位置以及分配给它的变量?是否有调试工具可以执行此操作?

编辑:这里的评论者是正确的,指出我不确定该号码是否已分配给变量;我只是猜测它可能是。另外,我熟悉在断点上设置条件,但这在这里没有用,因为要设置断点,你必须知道赋值发生在哪一行。

我的问题是,是否有办法检测代码中未知位置分配的特定值到 unknown 变量。我想找到 where 分配发生的地方,以及分配给它的变量。

第二次编辑:让我们将其与使用SQL分析器进行比较。如果我知道值123.45被插入到表中或作为参数传递给存储过程,我可以使用SQL事件探查器并过滤包含字符串“123.45”的命令的命令文本。这可能会找到用于将123.45发送到SQL服务器的确切命令。如果我正在寻找分配给C#变量的值,我能做些类似的事情,但我不知道哪一个?

我认为答案可能是“不”,但我认为有人可能会对此有所了解。

3 个答案:

答案 0 :(得分:3)

如果您可以将其缩小到更新屏幕的不同UI调度程序,您可以添加检查该特定值的条件,如下所示:

  

enter image description here

     

enter image description here

     

enter image description here

     

enter image description here

答案 1 :(得分:0)

你可以尝试添加一个手表,如果你在2012年?我不确定在您的环境中是否可以将断点设置为要查找它的方法调用的开头。右键单击您的变量,然后单击添加监视并在底部跟随它。

答案 2 :(得分: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方法中获取此值。在堆栈跟踪中转到这一点将非常清楚地显示哪个变量保留了您正在寻找的值。