为什么断点不会破坏代码执行?

时间:2012-03-22 15:50:48

标签: c#

我遇到了问题。

我注意到我的程序中的一个属性(比如说MyProp)正由主线程连续调用。尽管在其get访问器范围中插入了断点,但代码在此时不会被破坏! (为什么?)

所以我无法检查调用堆栈以找出我的代码的哪个部分正在调用该属性。我尝试按如下方式手动查看堆栈跟踪:

public static MyType MyProp {
    get {
        string threadName = Thread.CurrentThread.Name;
        string MTID = Thread.CurrentThread.ManagedThreadId;

        Debug.WriteLine("» MyProp");
        Debug.Indent();
        Debug.WriteLine("Current Thread : MTID = " + MTID + ", Name = " + threadName);

        StackTrace stack = new StackTrace();
        Debug.WriteLine("Frame Count : " + stack.FrameCount);

        for (int index = 0; index < stack.FrameCount; index++)
        {
            StackFrame frame = st.GetFrame(index);
            string methodName = frame.GetMethod().Name;

            Debug.WriteLine(string.Format("Frame [{0}]: Method = '{1}'", index + 1, methodName));
        }
        Debug.Unindent();

        // Rest of code..
    }
}

此外,我在整个解决方案中搜索了MyProp符号,然后在调用此属性的任何地方使用了System.Diagnostics.Debug.WriteLine方法,但它们都没有写在“输出”窗口中! (怎么可能这样呢?)

按下F11键,(即从最开始点开始我的编程),然后在加载所需的dll-s后,我在输出窗口中看到以下几行:

'MyProg.vshost.exe' (Managed): Loaded 'C:\Windows\assembly\GAC_MSIL\System....dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
:
'MyProg.vshost.exe' (Managed): Loaded 'D:\...\My Prog\bin\Debug\MyProg.exe', Symbols loaded.
'MyProg.vshost.exe' (Managed): Loaded 'D:\...\My Prog\bin\Debug\part1.dll', Symbols loaded.
:
'MyProg.vshost.exe' (Managed): Loaded 'D:\...\My Prog\bin\Debug\partn.dll', Symbols loaded.
» MyProp
    Current Thread : MTID = '9', Name = '' // <- Main thread
    Frame Count : 6
    Frame [1]: Method = 'get_MyProp' // <- How???
    Frame [2]: Method = 'Main'
    Frame [3]: Method = '_nExecuteAssembly'
    Frame [4]: Method = 'RunUsersAssembly'
    Frame [5]: Method = 'Run'
    Frame [6]: Method = 'ThreadStart'

令人讨厌的是,每当我向前迈出一步时(通过按F10或F11键),我再次看到» MyProp日志部分!!!

导致这种情况的原因是什么?如何处理这个问题? _Thanks

2 个答案:

答案 0 :(得分:2)

很难说出在没有更多代码的情况下可能会多次访问您的媒体资源。

目前,我建议添加

System.Diagnostics.Debugger.Break();
你的getter中的

,它会在执行时破坏调试器中的程序。然后查看堆栈跟踪。

答案 1 :(得分:1)

如何吸引所有来电者?

如果你有 ReSharper ,你可以通过将光标放在你的属性上并按 Ctrl + Shift + Alt + A 并选择 <来获得所有调用堆栈而无需调试em>来电 。 (见http://www.jetbrains.com/resharper/webhelp/Code_Analysis__Call_Tracking.html)。

以下是检查结果视图的示例:
enter image description here

或者只使用 Visual Studio内置功能:调用层次结构 。右键单击成员,然后选择查看调用层次结构。示例视图:

enter image description here

如何在属性中设置断点?

Update1:​​我可以在我的机器上调试属性(VS2010)。我的调试选项是:

enter image description here

enter image description here

相关问题