Conditional BreakPoint based on callstack within Windbg – .NET
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
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();
}
}
}
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:\Debuggersx86\ConditionalBP.txt” Foo
Here are the contents of ConditionalBP.txt
ad /q Contains
aS /c Contains .shell -ci "!CLRStack" FINDSTR $arg1
.block {
.if ($spat("${Contains}","*${$arg1}*"))
{
!CLRStack
}
.else
{
g
}
}
ad /q Contains