WinDbg: Брейк поинт с условием если есть что-то в стеке

Pavel Kolmakov
Aug 28, 2017 · 1 min read

Вот иногда хочется чтобы брейк поинт сработал при таком случае, когда в стеке вызовов присутствует некоторый метод и вот что нужно сделать:
Определи API для брейкпоинта

bp module!methodName
или
bp адрес памяти

Потом дополни командой

bp module!methodName/адрес памяти “r $t0 = 0;.foreach (v { !CLRStack/k }) { .if ($spat(\”v\”, \”*некое наименование метода/некий адрес*\”)) { r $t0 = 1;.break } }; .if($t0 = 0) { gc }”

Очень удобно когда метод вызывается разными путями и нам нужен только один.

PS: Жутко тормозит если этот метод вызывается оооооочень много раз и стек вызовов оооочень длинный.

И еще один скриптец :
bp адрес “.if(проверка некого адреса){r @$t0 = получение адреса);.foreach ( myString{s -[1]u @$t0 L50 \”искомая строка в памяти\”} ){r @$t1= ${myString}}; .if(@$t1>0){.echo \”Есть такое слово!\”;}.else{.echo \”Продолжаю искать\”; gc;};.echo \” Поиск завершен\”;r @$t1=0;}.else {gc;} “

)