Someone recently asked me “How to have a break-point on a method based on certain function in the call-stack?”

Here is the sample code to demonstrate this

[sourcecode language=”csharp”]

using System;

using System.Threading.Tasks;

using System.Data.SqlClient;

namespace Test

{

class Program

{

string connectionString = @“Data Source=.sqlexpress;Initial Catalog=Tfs_Configuration;Integrated Security=True”;

public void Bar()

{

using (var c = new SqlConnection(connectionString))

{

c.Open();

var command = new SqlCommand(@“update [tbl_AccessMapping] set [DisplayName] = @param”, c);

command.Parameters.Add(new SqlParameter(“param”, “Bar”));

command.ExecuteNonQuery();

}

}

public void Foo()

{

using (var c = new SqlConnection(connectionString))

{

c.Open();

var command = new SqlCommand(@“update [tbl_AccessMapping] set [DisplayName] = @param”, c);

command.Parameters.Add(new SqlParameter(“param”, “Foo”));

command.ExecuteNonQuery();

}

}

static void Main(string[] args1)

{

var s = new Program();

Parallel.For(0, 2, (i) => s.Bar());

Parallel.For(0, 2, (i) => s.Foo());

Console.Read();

}

}

}

[/sourcecode]

The requirement is to have a break-point on “ExecuteNonQuery” but it should break only if it is invoked from “Foo” and not from “Bar”.

Launched the exe within windbg and loaded sos,sosex and set a bp on System.Data.SqlClient.SqlCommand.ExecuteNonQuery suing !mbm

And when the break-point hits the first time updated the bp using

bs 0  $$>a<“d:Debuggersx86ConditionalBP.txt” Foo

Here are the contents of ConditionalBP.txt

[sourcecode]

ad /q Contains

aS /c Contains .shell -ci “!CLRStack” FINDSTR $arg1

.block {

.if ($spat(“${Contains}”,”*${$arg1}*”))

{

!CLRStack

}

.else

{

g

}

}

ad /q Contains

[/sourcecode]