首先我先列出来常用的一些命令或者键盘控制:
F5 开始调试,执行到断点
Shift + F5 停止调试
F9 在光标所在行添加断点
Shift + F9 QuickWatch
Shift Ctrl F9 delete all 断点
F10 单步执行
F11 进入调用的函数
Shift F11 跳出这次调用的函数
另外还可以用Disable all breakpoints
可以右键点击添加breakpoint condition.比如 int i = 0; 条件可以是 i==5,或者 i has changed.如果 string str,则可以 strcmp(str,"onestring") ==0这样的。
对于 char *str ; str = "abcd";在 debug 过程中需要看 str 的内容,可以在 watch 中 str,4 就会显示下面连续的4个的内容了。
Ctrl F10 直接将debug执行跳到当前光标所指的行
在断点上右键breakpoint hit count 还可以设置
(1)当满足条件,而且进入断点的累计次数等于N时,断点命中一次。
(2)当满足条件,而且进入断点的累计次数是N的倍数时,断点命中一次。
(3)当满足条件,而且进入断点的累计次数大于N时,每次命中断点。
Breakpoint Filter 可以对机器、进程、线程做指定。
更加详细的调试命令可以在VS上查看到:
、
首先我给出一份代码,我将带着代码来讲如何调试:
#include #include static int a;struct Demo{ int a; char c; int b;};void fun(struct Demo* p){ if (p->b > 1) { printf("enter this line"); } else { printf("enter else line"); }}int main() { struct Demo d; int i = 0; d.a = 1; d.b = 2; d.c = 3; for (; i < 10; i++) { d.a += i; } fun(&d); return 0;}
开始调试:
2. 插入断点:
或者,我插入一个条件断点:当i==8的时候,调试程序在此处断点暂停。
3.如何查看d和i的值呢
我们有个监视栏,可以通过鼠标拖动代码里的变量到监视,或者直接在监视栏输入变量名
如果是局部变量,你可以直接在局部变量窗口里查看。
好了,程序执行到这里,d和i的值我们都获取到了
可是在开发过程中,我们常常要修改某一个变量的值怎么办:
双击变量后边的值,或者右击鼠标选择编辑值。
当然,我相信看到这里的读者肯定会对d的内存布局感兴趣,我们来看下d的成员地址,偏移:
这里不难看出,Demo结构体的内存对齐规则,默认是4字节对齐,当然你可以通过程序来修改对齐方式。a占4自己,c虽然是字符类型只有1字节,但是由于后边的b是4字节,因此c也只能占用4字节,因此Demo结构体的占用字节大小为12.
查看堆栈信息:
接下来我们要进入到fun函数,我们可以在调用堆栈信息里查看当前的堆栈,以及执行到哪一层栈的第几行,这里能看到执行到函数fun(Demo* p)的第68行。
对了,我想大家应该也注意到这里有个“断点”的标签页,可以通过这里查看并修改或者取消断点: