条件断点取决于呼叫者启用/禁用

时间:2017-09-21 18:23:58

标签: c# visual-studio debugging

我有一种方法可以从很多很多地方打来。

void foo()
{
    do_some_work();
}

调试会话的设置很痛苦。如果我正在调试这个:

void main()
{
    func1();   // which deep, deep down calls foo() over and over and over
    func2();   // which calls foo() over and over and over

    foo();     // This is the one that I actually want to debug
}

我想调试foo(),但仅限于最后一次调用。没有方便的全局,公共,静态变量,我可以根据我所知的条件设置断点。

void main()
{
    func1();   // which deep, deep down calls foo() over and over and over
    func2();   // which calls foo() over and over and over

    Enable_debugger();
    foo();     // This is the one that I actually want to debug
}

foo()中设置我的断点,并为除最后一个以外的每个实例跳过它。

我可以采取哪种方法?

为什么不在main()中设置调试点然后逐步调试?因为步入foo()是一个很多的步入。

修改 我确实发现了一个轻微的欺骗。我可以这样做:

  System.Threading.Thread.SetData(
          System.Threading.Thread.GetNamedDataSlot("BREAKPOINT"), "on");

然后将条件断点设置为:

 (string)System.Threading.Thread.GetData(
          System.Threading.Thread.GetNamedDataSlot("BREAKPOINT")) == "on"

2 个答案:

答案 0 :(得分:0)

我会添加一个全局变量,例如debugFoo,该false已发送到true并在foo() main()之前设置为public static void foo() { // <-- Conditional breakpoint here. Console.WriteLine(debugFoo); } public static bool debugFoo = false; public static void Main() { foo(); debugFoo = true; foo(); Console.ReadLine(); } }。

foo()

然后在debugFoo == true 内设置条件断点,条件为

debugFoo

因此,根据您何时打开和关闭foo(),您可以点击该断点。

修改

如果两个人彼此不可见,我考虑的第二种方法是修改public static void foo(bool doDebug = false) { // <-- Conditional breakpoint here Console.WriteLine(doDebug); } public static void Main() { Console.WriteLine("No debug"); foo(); Console.WriteLine("Debug"); foo(true); Console.ReadLine(); } 的参数,如果可能的话。

doDebug == true

设置条件断点:

foo()

这样您就不必修改对true的其他现有调用,而是将main()传递给您要调试的<http:listener-config name="api-httpListenerConfig" host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration"/> <apikit-soap:config name="/EmpProgApiImplService/EmpProgApiImplPort/api-config" wsdlUrl="empprogapiimpl.wsdl" serviceName="EmpProgApiImplService" portName="EmpProgApiImplPort" doc:name="APIkit SOAP: Configuration"/> <flow name="api-main"> <http:listener path="/EmpProgApiImplService/EmpProgApiImplPort" config-ref="api-httpListenerConfig" doc:name="/EmpProgApiImplService/EmpProgApiImplPort" /> <apikit-soap:router config-ref="/EmpProgApiImplService/EmpProgApiImplPort/api-config" doc:name="SOAP Router"/> </flow> <flow name="tagEmp:/EmpProgApiImplService/EmpProgApiImplPort/api-config"> <set-payload value="&lt;soap:Fault xmlns:soap=&quot;http://www.w3.org/2003/05/soap-envelope&quot;&gt;&lt;faultcode&gt;soap:Server&lt;/faultcode&gt;&lt;faultstring&gt;Operation [tagEmp:/EmpProgApiImplService/EmpProgApiImplPort/api-config] not implemented&lt;/faultstring&gt;&lt;/soap:Fault&gt;" doc:name="Set Payload"/> </flow> <flow name="startEmp:/EmpProgApiImplService/EmpProgApiImplPort/api-config"> <set-payload value="&lt;soap:Fault xmlns:soap=&quot;http://www.w3.org/2003/05/soap-envelope&quot;&gt;&lt;faultcode&gt;soap:Server&lt;/faultcode&gt;&lt;faultstring&gt;Operation [startEmp:/EmpProgApiImplService/EmpProgApiImplPort/api-config] not implemented&lt;/faultstring&gt;&lt;/soap:Fault&gt;" doc:name="Set Payload"/> </flow> <flow name="stopEmp:/EmpProgApiImplService/EmpProgApiImplPort/api-config"> <set-payload value="&lt;soap:Fault xmlns:soap=&quot;http://www.w3.org/2003/05/soap-envelope&quot;&gt;&lt;faultcode&gt;soap:Server&lt;/faultcode&gt;&lt;faultstring&gt;Operation [stopEmp:/EmpProgApiImplService/EmpProgApiImplPort/api-config] not implemented&lt;/faultstring&gt;&lt;/soap:Fault&gt;" doc:name="Set Payload"/> </flow> 中的单个调用。

答案 1 :(得分:0)

如果您使用的是兼容版本的Visual Studio,则可以设置Conditional Breakpoints。我没有可用的版本列表,但这是遵循这些步骤并查看菜单选项是否适合您的最简单方法。

  1. 进入foo()方法并在第一行设置断点
  2. 右键单击断点,然后单击&#34;条件&#34;
  3. 从那里你可以根据&#34; Hit Counter&#34;:
  4. 设置条件

    Conditional Breakpoint in Visual Studio

    如果你能找到你想要跳过的foo()个电话的确切数量(甚至是最低门槛),这个应该成为解决问题的方法。

    使用这种方法,您不需要编写任何代码,您可以使用IDE解决此