快捷搜索: 王者荣耀 脱发

VS编译器调试小技巧(持续更新)

PS:

调出调试窗口:菜单栏 -> 调试 -> 窗口

查看堆栈信息

堆栈信息是调试程序过程中必不可少的,只要做程序开发,必定会使用到。

1.当触发断点调试时,堆栈信息会显示当前运行位置,和上几层的接口信息,并可查看某些变量的当前值;
1.当程序产生dmp时,查看dmp中的堆栈信息,极有可能马上定位到问题点;

返回值寄存器

在代码中,可能会有以下写法

//定义接口
int GetValue();

//调用接口
if(GetValue()){
	//todo...
}

当执行完if(GetValue())代码时,有可能需要知道返回值是什么,此时可以在VS编译器的监视中添加EAX寄存器中查看返回值(一般返回值是int,可以直接用EAX查看低32位值,如果long long值,还需要查看EDX寄存器查看高32位值)。

多线程调试

当程序是多线程时,打断点调试,往往会在多个线程之间切换,特别是单步调试,程序员期望可以在当前已经确定的线程中调试流程,此时可以冻结线程,使不相干的线程挂起,不再运行。

查看变量内存值

我们期望看到指针p所指向的内存中的所有内容 很明显,指针p在监视中,只能看到部分内容"abcdef",但实际我们期望的内容是"abcdefhijkl",只是因为字符串中间出现结束符’’导致被截断,此时我们可以在监视器中要求从指针p位置开始,显示指定个数的内存:“p,16” 表示从p位置,显示16个与p 同类型的内存大小的数据; 甚至我们还可以对p进行内存类型转换,对于查看数据流非常有用: 看起来没啥说服力?再来个不一样的例子: 怎么样,查看指针p所指向的数据流时,一脸懵逼?如果我们明确知道这段数据就是int型数组,就可以转换: 看起来是不是舒服多了???我举的例子都是用的简单内置类型,实际应用过程中,还可以转换成class、struct等任意需要转换的类型

你以为这样就够了么,No No No,如果很明确地知道,我们要从指针p的位置往后偏移8个字节开始,接下来4个字节才是我们想要查看的内存,我们还可以这样做:“p+8,4” 或许你会觉得,这很多此一举,我直接查看整个内存不就完事了么? But,有这种思想的,只能说太年轻啦,如果这段内存有10w个字节,你需要查看偏移9w字节的某些字节内容呢?

经验分享 程序员 微信小程序 职场和发展