当前位置: 首页 > news >正文

[Windows]_[VS2017]_[如何进行远程调试程序]

场景

  1. 在开发Windows程序时,有时候在测试机上测试出异常操作的情况,在开发机上就是出现不了。还比如在测试机上能测试到崩溃的情况,在开发机上也是重现不了,怎么办?

说明

  1. 这种情况可能是测试机上的系统版本,补丁版本,正在运行的程序和开发机不同等造成的。如果是客户的机子,有效的办法只能埋点收集运行的日志。还有就是收集崩溃报告,但是这两种情况无疑比较慢。收集日志还得记录整个软件运行的关键路径,记录关键的变量值,而崩溃报告也有可能收集不到的情况。

  2. 如果是公司内的测试机子,处于局域网的话,那么是可以借助VC++的远程调试功能快速定位的。

  3. 举例子,Visual Studio 2017Community版本就自带一个远程调试程序,在以下位置。

    D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\Remote Debugger
    

    它有x86x64两个版本,分别对应着调试32bit64bit的程序。调试主程序是msvsmon.exe

  4. 先说说它的调试原理,和JavaWeb的远程调试[2]差不多,都是远程设备(运行程序的测试机)运行一个监听服务,之后开发机连接这个监听服务,使用这个监听服务来代理调试。我们来说下它调试步骤:

    • 打包Remote Debuggerzip格式,并拷贝到测试机。解压,运行与测试程序位数相对应的msvsmon.exe

    • 选择配置远程调试. 打开菜单-> 工具 -> 选项-> 记住TCP/IP端口号, 默认是4022。 下边默认身份认证模式是Windows身份认证,等会开发机连接时需要输入账号密码连接。
      在这里插入图片描述

    • 打包例子程序的Debug版本到zip格式,并拷贝到测试机, 解压,运行。注意Debug模式下如果依赖C++运行时库,那么它们也需要打包。

    copy "D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Redist\MSVC\14.16.27012\debug_nonredist\x86\Microsoft.VC141.DebugCRT\*.dll" $(OutDir) 
    copy "C:\Program Files (x86)\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.UniversalCRT.Debug\10.0.22621.0\Redist\Debug\x86\ucrtbased.dll" $(OutDir)
    

    在这里插入图片描述
    在这里插入图片描述

    • 远程程序启动后,开发本地打开项目,在菜单-》调试-》附加到进程,之后连接类型选“远程”,连接目标填写远程测试机的IP和端口,如192.168.3.67:4022,点击查找。选择查找到的设备,选择之后会弹出Windows身份认证窗口,输入远程机子的账号密码确认。如果没有密码,需要在测试机上设置该账号的临时密码。
      在这里插入图片描述
      在这里插入图片描述

    • 输入密码确认,连接成功后会出现测试机上的所有进程,之后选择要调试的进程,附加即可。这样就进入了远程调试模式。
      在这里插入图片描述

    • 如果需要从开发机启动远程的程序,也可以在开发机的vs2017上配置。 右键项目属性-》调试。要启动的调试器,选择“远程Windows调试器”。配置远程命令是测试机上的“程序路径”,工作目录是该程序的“运行目录”,运行服务器名称是测试机的IP:端口。之后确定。之后从VS2017的运行里选择“远程Windows调试器”运行,它就会启动测试机的程序,之后正常调试即可。
      在这里插入图片描述
      在这里插入图片描述

例子

下载项目
https://download.csdn.net/download/infoworld/90657106

参考

  1. Visual Studio 2017 远程调试

  2. 使用IntelliJ IDEA进行远程Tomcat调试

http://www.xdnf.cn/news/47575.html

相关文章:

  • 计算机视觉与深度学习 | 工业视觉缺陷检测如何检小缺陷?背景概述,原理,检测难点,常用的检测算法,算法评估指标,新项目算法选择,算法部署
  • 【Oracle专栏】Oracle中的虚拟列
  • Linux文件时间戳详解:Access、Modify、Change时间的区别与作用
  • PCA——主成分分析数学原理及代码
  • 小迪抓包技术算法加密(6-9天)
  • Dify部署内网时遇到的代理问题及解决办法
  • 【Python爬虫详解】第一篇:Python爬虫入门指南
  • B+树节点与插入操作
  • git清理--解决.git文件过大问题
  • 基于蒙特卡洛模拟与时间序列分析的美的集团财务预测模型研究
  • DeepSeek 助力 Vue 开发:打造丝滑的二维码生成(QR Code)
  • 常用的验证验证 onnxruntime-gpu安装的命令
  • WIN10重启开机不用登录,直接进入桌面
  • Java【网络原理】(4)HTTP协议
  • Redis 的几种数据类型
  • 【Linux我做主】GDB调试工具完全指南
  • Pandas数据可视化
  • UE5 UI 教程系列全集
  • 从入门到精通汇编语言 第六章(中断及外部设备操作)
  • C++ 相关系统软件简介与学习方法【最水的一期】
  • An Improved Fusion Scheme for Multichannel Radar Forward-Looking Imaging论文阅读
  • 代码随想录算法训练营第二十二天(补)
  • Java8-遍历list取出两个字段重新组成list集合
  • linux常用基础命令_最新版
  • 【AI 加持下的 Python 编程实战 2_07】第七章:基于 Copilot 完整演示问题分解能力在实际问题中的落地应用
  • 虚拟教学助理应用系统设计框架
  • 整数分解---ca‘b模板的应用
  • 关于TCP三次握手和四次挥手过程中的状态机、使用三次握手和四次挥手的原因、拥塞控制
  • SpringCloud概述和环境搭建
  • SQL注入之information_schema表