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

Visual Studio C++项目远程断点调试客户现场程序方法

前言

程序开发一个很常见的场景,就是程序在自己本地部署调试明明一点问题都没有,但是部署到客户现场就问题百出,要调试起来还很困难,在自己本地也没有条件复现,很多时候只能靠日志一点点排查和猜测,耗费大量时间精力,最后发现只是因为环境不同,导致的一个很小的问题。

这个问题在工业自动化程序开发更为突出,自己本地没有一整套外部硬件可以测试,但到了实际上机测试,很多问题就暴露出来了,又不能在生产环境的机器上安装整个开发环境,调试过程往往也需要耗费大量时间精力,有些问题更是可能成为玄学问题,只能靠曲线救国或者不停地打补丁式来规避。

其实Visual Studio有一个完美的方法来应对这样的场景,就是远程调试,可以让你在自己电脑上通过Visual Studio,远程连接到实际的生产设备上。

说白了就是代码和开发环境在你电脑上,执行文件和运行环境在生产设备上。生产环境运行时出现问题,会通过远程调试软件把错误信息发到你的Visual Studio上,从而实现原本只能在自己电脑上的各种调试方法,包括断点调试,单步调试和异常中断等。

步骤

使用起来也很简单,方法和安装文件在以下链接

Remote Debug a C++ Project - Visual Studio (Windows) | Microsoft Learn

选择并下载你的Visual Studio 对应版本的远程调试工具,这里我选择2019版

下载后,在生产设备上安装,设置好防火墙,开启调试工具

 顺利的话开启后界面是这样的

然后将你的部署文件复制到生产设备上。

在你自己的Visual Studio上,右键对应的项目,点击【属性】-【配置属性】-【调试】-【要启动的调试器】,选择【远程windows调试器】。

【远程命令】填生产设备上要启动的exe路径。

【工作目录】选择生产设备上部署文件的目录。

【远程服务器名称】填远程调试器启动的服务器名+端口。

设置完是这样的。

选择【远程Windows调试器】,输入生产设备的用户名密码即可开始远程调试。

需要注意的是,本地代码改动后,需要把生成的文件覆盖到生产环境上,再开始调试。

这一步Visual Studio似乎也支持自动部署过去,但是勾选的选项是暗的,暂时还没去进一步研究如何自动部署。

拓展

在局域网环境内进行远程调试,只要防火墙配置好,不需要更多对网络进行配置,即开即用即可。

如果需要跨越公网到客户现场,远程进行调试,理论上也是可行的。

首要前提是客户现场能连上网络。实在不行临时用随身wifi连一下,这个问题不大。

齐次的是需要进行内网穿透,这个可以结合frp或者Zerotier之类的内网穿透工具,理论上也是可行的。

frp的优势是开源,稳定可控,甚至可以整合到自己开发的程序里。但是劣势是需要自己有一台有公网IP的云服务器,需要自己稍微配置下。

Zerotier的优势是啥也不需要,两边安装完程序即可,免费方便,并且网络好的情况下能实现点对点满带宽传输。劣势是有时候不太稳定。

相关文章:

  • 蓝桥杯(3.1)
  • 李沐动手学习深度学习——4.2练习
  • 面试数据库篇(mysql)- 06覆盖索引
  • 一句话讲清楚数据库中事务的隔离级别(通俗易懂版)
  • 贪心 Leetcode 53 最大子数组和
  • Pycharm的下载安装与汉化
  • 【Mybatis】多表映射 第二期
  • 德人合科技 | 天锐绿盾终端安全管理系统
  • GO数组切片
  • 排序算法--堆排序
  • Leetcode210. 课程表 II
  • 大语言模型LLM推理加速:LangChain与ChatGLM3-6B的推理加速技术(LLM系列11)
  • 【Redis】高级特性 - 有序集合
  • 【mysql 数据库事务】开启事务操作数据库,写入失败后,不回滚,会有问题么? 这里隐藏着大坑,复试,面试时可以镇住面试老师!!!!
  • 【pytorch】函数记录
  • 2017前端实习生面试总结
  • Consul Config 使用Git做版本控制的实现
  • Docker入门(二) - Dockerfile
  • Java 网络编程(2):UDP 的使用
  • JavaScript设计模式系列一:工厂模式
  • Js基础知识(四) - js运行原理与机制
  • js写一个简单的选项卡
  • Laravel 菜鸟晋级之路
  • Odoo domain写法及运用
  • React组件设计模式(一)
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • Vue UI框架库开发介绍
  • yii2中session跨域名的问题
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #14vue3生成表单并跳转到外部地址的方式
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #每天一道面试题# 什么是MySQL的回表查询
  • $.ajax()
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (1)(1.13) SiK无线电高级配置(六)
  • (20050108)又读《平凡的世界》
  • (C语言)二分查找 超详细
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (算法设计与分析)第一章算法概述-习题
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .Net 代码性能 - (1)
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .NET 解决重复提交问题
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记
  • [android] 看博客学习hashCode()和equals()