Аналог команды «пока», как в GDB для WinDbg или простой способ оставить цикл в WinDbg? - PullRequest
1 голос
/ 07 февраля 2011

В настоящее время я нажимаю правую кнопку мыши, чтобы выбрать меню "Copy file path to clipboard". Затем щелкните левой кнопкой мыши до строки исходного кода, пока не выполните код выполнения, внешний цикл (номер этой строки указан в правом нижнем углу WinDbg).

Далее в командной строке я устанавливаю точку останова (вставляя из буфера обмена путь к файлу и вводя номер строки, который читается из строки состояния):

bp `d:\home\devel\plugin\plugin-svn\common\win-gui-admin.c:788`

Это кажется слишком сложным. В GDB для выхода из циклов появилась команда until. Любой способ сделать это в WinDbg?

Ответы [ 2 ]

3 голосов
/ 08 февраля 2011

F7 дает вам команду «Run to Cursor», которая, я думаю, выполняет то, что вы ищете. Просто наведите курсор на любую нужную исходную строку и нажмите F7.

-Скотт

1 голос
/ 10 мая 2014

опять очень поздний ответ, но можно использовать синтаксис уровня источника в 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:\>
...