目前,我按下鼠标右键选择"Copy file path to clipboard"
菜单。接下来左键单击源代码行,直到执行代码,外部循环(此行号在WinDbg的右下角显示)。
接下来在命令提示符下我设置断点(通过从剪贴板路径插入文件并输入从状态栏读取的行号):
bp `d:\home\devel\plugin\plugin-svn\common\win-gui-admin.c:788`
这似乎太复杂了。在GDB中,为了使循环返回已恢复的命令until
。有什么方法可以在WinDbg中执行此操作吗?
答案 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行
做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:\>