опять очень поздний ответ, но можно использовать синтаксис уровня источника в windbg
.lines
для включения поддержки линии src
l+*
чтобы включить все опции src
lsf
для загрузки файла src
ls from,to
для проверки строк src из текущего файла src
lsc
чтобы показать текущий файл src
`module!srcfile:linenum`
для обозначения любой строки из любого файла src (src syntax needs to be wrapped in grave accents not single quotes)
Вот пример прохождения
jmpouttaloo:\>dir /b
jmpouttaloo.cpp
jmpouttaloo:\>type jmpouttaloo.cpp
#include <stdio.h>
int main (void)
{
int i=0,j=0,k=0,l=0;
while (i++ < 100)
{
while (j++ < 100)
{
while(k++ < 100)
{
l++;
}
l++;
}
l++;
}
printf("%d\n",l);
return 0;
}
jmpouttaloo:\>cl /Zi /nologo jmpouttaloo.cpp
jmpouttaloo.cpp
jmpouttaloo:\>dir /b *.exe
jmpouttaloo.exe
jmpouttaloo:\>jmpouttaloo.exe
300
.lines turns on src line support
в cdb (включено по умолчанию в windbg)
l+*
включает все параметры линии src
lsf
загрузить файл src jmpouttaloo.cpp
set a bp on main and run
Отлично
jmpouttaloo:\>cdb -c ".lines;l+*; lsf jmpouttaloo.cpp; bp jmpouttaloo!main;g" jmpouttaloo.exe
пошагово с p шагами по одной строке src за шаг
в 6 шагов мы приземлимся в самый внутренний цикл while
теперь мы хотим систематически выходить из каждого цикла
ls start , count
показывает строки src от начального номера до начального номера + количество
работать до тех пор, пока мы не доберемся до определенной линии
do g graveaccent двоеточия льняного дерева graveaccent
полный синтаксис строки src следующим образом
graveaccent modulename! filename : linenumber graveaccent
первый запуск
0:000> cdb: Reading initial command '.lines;l+*; lsf jmpouttaloo.cpp; bp jmpouttaloo!main;g'
Breakpoint 0 hit
> 3: {
0:000> p
> 4: int i=0,j=0,k=0,l=0;
0:000>
> 5: while (i++ < 100)
0:000>
> 7: while (j++ < 100)
0:000>
> 9: while(k++ < 100)
0:000>
> 11: l++;
0:000>
> 12: }
0:000>
> 9: while(k++ < 100)
мы находимся в строке 12 цикла обратно к строке 9, нам нужно выйти из этого цикла в строке 13
0:000> ls 13,6 view src lines from line number 13 to 18 (6 lines )
13: l++;
14: }
15: l++;
16: }
17: printf("%d\n",l);
18: return 0;
0:000> dv view locals we have stepped only once so all locals must be 1
j = 0n1
l = 0n1
k = 0n1
i = 0n1
0:000> g `:13` lets get out of innermost loop and look at the locals
> 13: l++;
0:000> dv
j = 0n1
l = 0n100 <-------
k = 0n101 <-------------
i = 0n1
0:000> g `:15` getting out of second innermost loop and inspect locals
> 15: l++;
0:000> dv
j = 0n101
l = 0n200
k = 0n200
i = 0n1
0:000> g `:17` getting out of all loops and inspect locals
> 17: printf("%d\n",l);
0:000> dv
j = 0n200
l = 0n300
k = 0n200
i = 0n101
0:000> p
300 <--------------- output of printf
> 18: return 0;
0:000>
второй прогон
another jig this time we break on line 15 straight without even loading the src
jmpouttaloo:\>cdb -c ".lines;g `jmpouttaloo!jmpouttaloo.cpp:15`;dv;q" jmpouttaloo.exe | grep -A 4 "j ="
j = 0n101
l = 0n200
k = 0n200
i = 0n1
quit:
jmpouttaloo:\>