diff --git a/VisualStudio/VisualStudio.md b/VisualStudio/VisualStudio.md index d0d5b9e..44058ec 100644 --- a/VisualStudio/VisualStudio.md +++ b/VisualStudio/VisualStudio.md @@ -1,162 +1,223 @@ # VisualStudio相关知识点 ## 工程创建 -- 工程相关 - - - 创建项目 - - ![image-20250709125108324](./pictures/image-20250709125108324.png) - - - 打开项目 - - ![image-20250710085645958](./pictures/image-20250710085645958.png) - - ![image-20250710085959302](./pictures/image-20250710085959302.png) - - - 加载/卸载项目 - - 加载项目 - - ![image-20250711084705933](./pictures/image-20250711084705933.png) - - 卸载项目 - - ![image-20250711084623468](./pictures/image-20250711084623468.png) - - - 设置启动项 - - ![image-20250710090403869](./pictures/image-20250710090403869.png) - -- 解决方案相关 - - - 添加项目 - - ![image-20250710090217653](./pictures/image-20250710090217653.png) - -- 文件相关 - - - 创建文件 - - ![image-20250710090809897](./pictures/image-20250710090809897.png) - - - 打开文件 - - ![image-20250710090916630](./pictures/image-20250710090916630.png) - - - 包括/排除文件 - - 排除文件 - - ![image-20250710095042067](./pictures/image-20250710095042067.png) - - ~~包括就是将排除的文件添加回去~~ +### 工程相关 + +#### 创建项目 + +![image-20250709125108324](./pictures/image-20250709125108324.png) + +#### 打开项目 + +![image-20250710085645958](./pictures/image-20250710085645958.png) + +![image-20250710085959302](./pictures/image-20250710085959302.png) + +#### 加载/卸载项目 + +加载项目 + +![image-20250711084705933](./pictures/image-20250711084705933.png) + +卸载项目 + +![image-20250711084623468](./pictures/image-20250711084623468.png) + +#### 设置启动项 + +![image-20250710090403869](./pictures/image-20250710090403869.png) + +### 解决方案相关 + +#### 添加项目 + +![image-20250710090217653](./pictures/image-20250710090217653.png) + +### 文件相关 + +#### 创建文件 + +![image-20250710090809897](./pictures/image-20250710090809897.png) + +#### 打开文件 + +![image-20250710090916630](./pictures/image-20250710090916630.png) + +#### 包括/排除文件 + +排除文件 + +![image-20250710095042067](./pictures/image-20250710095042067.png) + +~~包括就是将排除的文件添加回去~~ ## 工程配置 -- 解决方案配置 +### 解决方案配置 + +1. Debug:用于开发和调试应用程序。调试版本包含完整的调试信息,可以用于在调试模式下运行程序。 + +2. Release:用于发布生产环境中的应用程序。发布版本经过优化,通常比调试版本快,但不包含调试信息。 + +![image-20250710100448716](./pictures/image-20250710100448716.png) + +### 平台配置 + +![image-20250710091509521](./pictures/image-20250710091509521.png) + +### 项目类型配置 + +![image-20250710091420578](./pictures/image-20250710091420578.png) + +### 路径配置 + +#### 输出路径配置 + +![image-20250710092030740](./pictures/image-20250710092030740.png) + +#### 头文件路径配置 + +![image-20250710092136181](./pictures/image-20250710092136181.png) + +#### 源文件路径配置 + +![image-20250710092209778](./pictures/image-20250710092209778.png) + +#### 库文件路径配置 + +![image-20250710092232688](./pictures/image-20250710092232688.png) + +### 宏定义 - 1. Debug:用于开发和调试应用程序。调试版本包含完整的调试信息,可以用于在调试模式下运行程序。 +![image-20250710092856967](./pictures/image-20250710092856967.png) - 2. Release:用于发布生产环境中的应用程序。发布版本经过优化,通常比调试版本快,但不包含调试信息。 +![image-20250710092931584](./pictures/image-20250710092931584.png) - ![image-20250710100448716](./pictures/image-20250710100448716.png) +![image-20250710092821156](./pictures/image-20250710092821156.png) -- 平台配置 +### 运行库配置 - ![image-20250710091509521](./pictures/image-20250710091509521.png) +![image-20250710093134976](./pictures/image-20250710093134976.png) -- 项目类型配置 +#### 运行库各个选项具体含义 - ![image-20250710091420578](./pictures/image-20250710091420578.png) +| 编译选项 | 含义 | 链接方式 | 运行库 | 适用场景 | +| -------- | ---------------------- | --------------------------------------------- | ------------------------------ | ----------------------------------------------------- | +| `/MT` | 多线程静态链接 | 静态链接 LIBCMT.lib | 不依赖 DLL,直接嵌入运行库代码 | 发布版本(Release),不依赖外部 DLL,提高可移植性 | +| `/MTd` | 多线程静态链接(调试) | 静态链接 LIBCMTD.lib | 调试用库,嵌入调试符号 | 调试版本(Debug),便于调试但体积大 | +| `/MD` | 多线程动态链接 | 静态链接 MSVCRT.lib,运行时依赖 MSVCRxx.dll | 程序运行时需 MSVC 运行时 DLL | 发布版本(Release),节省体积,适合多个程序共享运行时 | +| `/MDd` | 多线程动态链接(调试) | 静态链接 MSVCRTD.lib,运行时依赖 MSVCRxxD.dll | 调试用 DLL,含调试信息 | 调试版本(Debug),适用于开发调试 | -- 路径配置 - - 输出路径配置 - - ![image-20250710092030740](./pictures/image-20250710092030740.png) - - - 头文件路径配置 - - ![image-20250710092136181](./pictures/image-20250710092136181.png) - - - 源文件路径配置 - - ![image-20250710092209778](./pictures/image-20250710092209778.png) - - - 库文件路径配置 - - ![image-20250710092232688](./pictures/image-20250710092232688.png) - -- 宏定义 +#### 调用库配置 - ![image-20250710092856967](./pictures/image-20250710092856967.png) +静态库配置: - ![image-20250710092931584](./pictures/image-20250710092931584.png) +在 Visual Studio 中调用静态库(.lib)的一般步骤如下: - ![image-20250710092821156](./pictures/image-20250710092821156.png) +1. **添加头文件路径**:在“项目属性 → C/C++ → 常规 → 附加包含目录”中添加 `.h` 文件所在目录。 +2. **添加库文件路径**:在“项目属性 → 链接器 → 常规 → 附加库目录”中添加 `.lib` 文件所在目录。 +3. **指定库文件名**:在“项目属性 → 链接器 → 输入 → 附加依赖项”中添加库名,如 `xxx.lib`。 +4. **保持运行时库一致**:在“C/C++ → 代码生成 → 运行库”中选择与库一致的选项(如 `/MT`、`/MD`)。 +5. **在代码中引入头文件**并调用库函数即可。 -- 运行库配置 +动态库配置: - ![image-20250710093134976](./pictures/image-20250710093134976.png) +在 Visual Studio 中调用动态库(.dll)的一般步骤如下: -- 调用库配置 +1. **添加头文件路径**:在“项目属性 → C/C++ → 常规 → 附加包含目录”中添加 `.h` 文件目录。 +2. **添加库文件路径**:在“项目属性 → 链接器 → 常规 → 附加库目录”中添加 `.lib` 文件目录。 +3. **指定依赖库名**:在“链接器 → 输入 → 附加依赖项”中添加对应的 `.lib` 文件名。 +4. **复制 DLL 文件**:将 `.dll` 文件放在可执行文件所在目录,确保运行时可以找到。 +5. **代码中引入头文件** 并调用导入的函数。 -- 安全检查 +### 安全检查 - ![image-20250710093220851](./pictures/image-20250710093220851.png) +![image-20250710093220851](./pictures/image-20250710093220851.png) + +#### Visual Studio 安全检查的目的 + +1. **防止缓冲区溢出** + 通过检查数组越界、字符串溢出等问题,防止栈溢出攻击(如启用 `/GS` 选项)。 +2. **检测非法内存访问** + 捕捉空指针解引用、未初始化内存使用等潜在错误。 +3. **启用运行时安全检查(RTC)** + 调试时检测变量使用错误、函数调用栈损坏等。 +4. **强化函数调用安全性** + 替换不安全函数(如 `strcpy`)为更安全版本(如 `strcpy_s`),避免未检查的内存拷贝。 +5. **防止代码注入和篡改** + 使用 DEP、ASLR、栈保护等机制增强运行时安全。 +6. **辅助发现潜在漏洞** + 通过静态分析、代码检查、警告等级等手段提前发现逻辑缺陷和潜在漏洞。 ## 工程调试 -- 断点 - - 1. 断点创建 - - 单击旁边栏出现红点,即创建断点。 - - 2. 断点删除 - - 单击红点,红点消失,即删除断点。 - - 3. 断点禁用 - - ALT+F9,或者单击鼠标右键 - - 4. 断点启用 - - ALT+F9,或者单击鼠标左键 - 5. 条件断点 - - ![image-20250707182318934](C:\Users\wsk\AppData\Roaming\Typora\typora-user-images\image-20250707182318934.png) - - 单击鼠标右键 - - - -- 窗口 - - 监视窗口 - - ![image-20250710093722255](./pictures/image-20250710093722255.png) - - - 内存窗口 - - ![image-20250710093824991](./pictures/image-20250710093824991.png) - - - 线程窗口 - - ![image-20250710093937339](./pictures/image-20250710093937339.png) - - - 调用堆栈窗口 - - ![image-20250710094042822](./pictures/image-20250710094042822.png) - -- 单步调试 - - 全速运行:点击继续符号,他就在两个相邻断点间,迅速执行。 - - ![image-20250710094412173](./pictures/image-20250710094412173.png) - - - 重新运行:点击重新运行或者CTRL+SHIFT+F5就重新运行 - - ![image-20250710094246863](./pictures/image-20250710094246863.png) - - - 逐过程:点击逐过程或者F10,逐过程是将主函数里面的子函数当作一个过程,不管子函数里面又引用了多少子函数。 - - - - - - ![image-20250710094211996](./pictures/image-20250710094211996.png) - - - 逐语句:点击逐语句或者F11,逐语句是将主函数里面的一个一个语句运行,如遇子函数,进入子函数又逐语句运行。 - - ![image-20250710094139698](./pictures/image-20250710094139698.png) +### 断点 + +#### 断点创建 + +- 单击旁边栏出现红点,即创建断点。 + +#### 断点删除 + +- 单击红点,红点消失,即删除断点。 + +#### 断点禁用 + +- ALT+F9,或者单击鼠标右键 + +#### 断点启用 + +- ALT+F9,或者单击鼠标左键 + +#### 条件断点 + +- ![image-20250707182318934](C:\Users\wsk\AppData\Roaming\Typora\typora-user-images\image-20250707182318934.png) +- 单击鼠标右键 + + + +### 窗口 + +#### 监视窗口 + +#### ![image-20250710093722255](./pictures/image-20250710093722255.png) + +#### 内存窗口 + +![image-20250710093824991](./pictures/image-20250710093824991.png) + +#### 线程窗口 + +![image-20250710093937339](./pictures/image-20250710093937339.png) + +#### 调用堆栈窗口 + +![image-20250710094042822](./pictures/image-20250710094042822.png) + +### 单步调试 + +#### 全速运行 + +点击继续符号,他就在两个相邻断点间,迅速执行。 + +![image-20250710094412173](./pictures/image-20250710094412173.png) + +#### 重新运行 + +点击重新运行或者CTRL+SHIFT+F5就重新运行 + +![image-20250710094246863](./pictures/image-20250710094246863.png) + +#### 逐过程 + +点击逐过程或者F10,逐过程是将主函数里面的子函数当作一个过程,不管子函数里面又引用了多少子函数。 + + + + + +![image-20250710094211996](./pictures/image-20250710094211996.png) + +#### 逐语句 + +点击逐语句或者F11,逐语句是将主函数里面的一个一个语句运行,如遇子函数,进入子函数又逐语句运行。 + +![image-20250710094139698](./pictures/image-20250710094139698.png)