【Visual Studio2017查看反汇编代码】

本文指导如何在C++项目中设置断点,通过反汇编理解内存地址、机器指令和汇编语言,详解x86架构下的调试技巧。

第一、建立一个简单的项目,就比如下图中的测试项目,然后设置一个断点。

#include <iostream>

int main()
{
	int a = 1;
	int b = 2;
	a = a + b;
	std::cout << a;
}

在这里插入图片描述
第二、开始调试,然后如下图中所示,从调试->窗口->反汇编。
在这里插入图片描述
第三、下图是开启了反汇编功能后得到的窗口。大致可以分为三排信息,从左到右分别为内存地址(虚拟内存的地址)、机器指令(机器级的代码,可以直接被计算机所执行的指令)和汇编语言。汇编语言也不能直接被计算机所执行,必须汇编为机器指令。由于本人选择在x86架构下去调试,所以生成的机器级代码就是x86的指令,而x86属于cisc机器,cisc机器的一大特点就是指令长度不等。
在这里插入图片描述

### 如何在 Visual Studio 2022 中调试时查看汇编代码里的变量值 #### 启动调试会话并进入汇编视图 为了能够在Visual Studio 2022中查看汇编代码以及其中的变量值,在启动调试之前需确保项目配置允许生成调试信息。对于C/C++项目而言,默认情况下应该已经启用了这一选项。 一旦准备好要调试的应用程序,可以通过设置断点来暂停执行流程以便更细致地观察特定位置的状态。当遇到感兴趣的函数调用或指令序列时,右键点击编辑器左侧边栏中的行号区域放置断点[^1]。 接着按F5键开始调试过程,直到达到预设好的中断处停下。此时可以从菜单栏选择`Debug -> Windows -> Disassembly`打开反汇编窗口显示当前上下文附近的机器码表示形式。 #### 查看寄存器和内存地址上的数据 随着光标的移动至某条具体的汇编命令上,鼠标悬停于操作数之上可即时弹出提示框显示出该表达式的计算结果;这同样适用于那些存储着临时数值或是参数传递所使用的CPU内部寄存器名称(比如EAX, EBX等)。如果想要更加深入探究某个具体位置的内容,则可以在Disassembly窗格下方找到Registers子面板进一步探索各个通用目的寄存器的具体取值情况。 另外一种方法是利用Memory监视工具,通过它可以直接指定一块连续字节范围内的原始比特模式进行浏览——这对于理解指针指向的对象布局特别有用。只需转到`Debug -> Windows -> Memory`,然后输入相应的基址偏移量即可加载对应区间的映像副本供分析之用。 #### 利用自动/局部变量窗口追踪动态变化 尽管上述方式能够提供底层视角下的洞察力,但对于高级别的编程语言特性来说可能显得不够直观友好。幸运的是,IDE还提供了专门用于跟踪正在运行期间创建出来的实体状态的功能模块:“Autos” 和 “Locals”。前者专注于最近访问过的几个对象实例及其属性成员;后者则罗列出了作用域内定义的所有本地符号表项。即使是在混合模式下调用链路间穿梭跳跃的情况下也能保持同步更新这些列表内容,从而帮助开发者快速锁定关心的目标并评估其最新状况。 ```cpp // 示例:简单的 C++ 函数,可用于练习以上提到的各种调试技术 void exampleFunction(int param) { static int counter = 0; ++counter; char buffer[8]; sprintf(buffer, "%d", param); std::string strBuffer(buffer); } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值