模拟“直到”命令,如GDB for WinDbg或在WinDbg中留下循环的简单方法?

时间:2011-02-07 17:07:38

标签: debugging windbg

目前,我按下鼠标右键选择"Copy file path to clipboard"菜单。接下来左键单击源代码行,直到执行代码,外部循环(此行号在WinDbg的右下角显示)。

接下来在命令提示符下我设置断点(通过从剪贴板路径插入文件并输入从状态栏读取的行号):

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

这似乎太复杂了。在GDB中,为了使循环返回已恢复的命令until。有什么方法可以在WinDbg中执行此操作吗?

2 个答案:

答案 0 :(得分:3)

F7为您提供了“Run to Cursor”命令,我认为这样做可以满足您的需求。只需将光标放在您想要的任何源行上,然后点击F7。

-Scott

答案 1 :(得分:1)

这是一个非常晚的答案,但可以在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
在cdb中

.lines turns on src line support(在windbg中由defaukt启用)
l+*启用所有src行选项
lsf加载src文件jmpouttaloo.cpp
set a bp on main and run exe

jmpouttaloo:\>cdb -c ".lines;l+*; lsf jmpouttaloo.cpp; bp jmpouttaloo!main;g" jmpouttaloo.exe

每步踩踏一步src线 在6个步骤中,我们落在最里面的while循环中 现在我们想系统地摆脱每个循环

ls start , count显示从起始编号到起始编号+计数

的src行

直到我们到达某个src行

做g graveaccent colon linenumber 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:\>