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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/714966.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我在代码随想录|写代码Day31 | 贪心算法总结篇 | 贪心终结一题

&#x1f525;博客介绍&#xff1a; 27dCnc &#x1f3a5;系列专栏&#xff1a; <<数据结构与算法>> << 算法入门>> << C项目>> &#x1f3a5; 当前专栏: << 算法入门>> 专题 : 数据结构帮助小白快速入门算法 &#x1f4…

window使用hyper安装centos及docker、kubenet\k8s

window虚拟机安装centos&#xff1a; windows系统下安装linux&#xff08;centos7&#xff09;虚拟机详细教程&#xff08;virtualbox环境&#xff09;_windows安装linux虚拟机-CSDN博客 准备3台机器&#xff1a; 172.29.34.250 172.29.37.174 172.29.39.106 安装教程&…

关于定时器 setTimeout 可能会引发的内存泄露

前言 setTimeout 本身并不直接引发内存泄露&#xff0c;但如果使用不当&#xff0c;确实可以间接导致内存泄漏。以下是一些使用 setTimeout 可能导致内存泄漏的情况&#xff1a; 闭包引用&#xff1a; 在 setTimeout 的回调函数中&#xff0c;如果引用了外部变量&#xff08;形…

AJAX实例

AJAX - Asynchronous JavaScript and XML - 异步的JavaScript与XML&#xff0c;不是一门新技术&#xff0c;只是一个新的术语。&#xff08;老技术新玩法&#xff09; - 使用AJAX&#xff0c;网页能够将增量更新呈现在页面上&#xff0c;而不需要刷新整个页面。 - 虽然X代表…

力扣1892 页面推荐Ⅱ

力扣1892&#xff0c;页面推荐Ⅱ&#xff0c;为一个社交媒体网站实施一个页面推荐系统。如果页面被user_id的 至少一个朋友喜欢 &#xff0c;而 不被user_id喜欢 &#xff0c;你的系统将 推荐 一个页面到user_id。 目录 题目描述 解题思路 完整代码 优化 题目描述 表&…

【C++】cout 的默认精度

cout 的默认精度为&#xff1a; 四舍五入保留六位有效数字输出。例如 123.4567 应该输出为 123.457&#xff0c;5432.10 应该输出为 5432.1。 一、使用C语言输出符合cout默认精度的数值 double weight; scanf("%lf",&weight);printf("%.6g",weight)…

FlinkSql hint之状态生命周期 state_ttl

状态生命周期hint FlinkSQL 的 state ttl&#xff08;Time-To-Live&#xff0c;生存时间&#xff09;是一个用于管理状态数据生命周期的机制。在 Flink 流处理中&#xff0c;状态是一个重要的概念&#xff0c;它允许跨时间窗口或事件时间处理的状态化操作。然而&#xff0c;随…

分治法(Divide and Conquer)

目录 1.定义 2.例子 3.注意 1.定义 分治法&#xff08;Divide and Conquer&#xff09;是一种解决问题的算法设计策略&#xff0c;它将一个大问题分解成若干个规模较小且结构与原问题相似的子问题&#xff0c;然后递归地解决这些子问题&#xff0c;最后将子问题的解合并起来…

Dockerfile 语法教程

Dockerfile 语法教程 文章目录 Dockerfile 语法教程Dockerfile 语法教程基础概念Dockerfile 简介镜像、容器、仓库的概念 Dockerfile 基本语法 Dockerfile 基本语法Dockerfile 的基本结构注释的使用指令的格式指令的执行顺序 Dockerfile 常用指令FROM 指令RUN 指令CMD 指令ENTR…

鸿蒙岗位需求突增!移动端、PC端、IoT到底该怎么选?

“2024年是原生鸿蒙的关键一年&#xff0c;我们要加快推进各类鸿蒙原生应用的开发&#xff0c;集中打赢技术底座和三方生态两大最艰巨的战斗。”这是余承东在新年信中表达的决心。 随后在1月18日举行的鸿蒙生态千帆启航仪式上&#xff0c;华为宣布 HarmonyOS NEXT 鸿蒙星河版系…

当开发人员无法解决问题时,测试人员应该如何与他们沟通?

当开发人员无法解决问题时&#xff0c;测试人员可以采取以下方式进行沟通&#xff1a; 保持耐心和理解&#xff1a;意识到解决问题可能需要时间和努力&#xff0c;避免对开发人员施加过度压力。提供更多信息和细节&#xff1a;检查是否有其他相关信息或细节可以提供给开发人员…

Codeforces Round 929 (Div. 3)---->E. Turtle vs. Rabbit Race: Optimal Trainings

一&#xff0c;思路&#xff1a; 1&#xff0c;做这题如果对二分敏感的话&#xff0c;看完题目就大概很容易想到&#xff0c;通过二分来找到一个 r ,使得 [ l, r] 之间的和最接近 u (因为这样才是 Isaac 所能获得的最大提升)。 2&#xff0c;还有一个特殊情况&#xff0c;结合…

MobiLlama: Towards Accurate and Lightweight Fully Transparent GPT

论文的主要目的是设计一个准确且高效的小型语言模型&#xff08;SLM&#xff09;&#xff0c;以满足资源受限设备的需求。以下是根据论文内容整理的要点&#xff1a; 背景与挑战&#xff1a; 大型语言模型&#xff08;LLMs&#xff09;在处理复杂任务时表现出色&#xff0c;但它…

Linux下进程相关概念详解

目录 一、操作系统 概念 设计操作系统的目的 定位 如何理解“管理” 系统调用和库函数概念 二、进程 概念 描述进程—PCB&#xff08;process control block&#xff09; 查看进程 进程状态 进程优先级 三、其它的进程概念 一、操作系统 概念 任何计算机系统都包…

【Easyx】easyx从入门到精通 — 初步入门

easyx 初步入门 1 安装easyx图形库2 如何使用Easyx3 效果初试4 基本图形绘制4.1 绘制点4.2 绘制直线4.3 绘制圆形4.4 绘制矩形4.5 绘制椭圆4.6 绘制圆角矩形4.7 绘制扇形 Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01;&#xff01;下一篇…

Java学习—字符流

在 Java 中&#xff0c;字符流主要用于处理字符数据&#xff0c;比如文本文件。字符流直接以字符为单位进行读写操作&#xff0c;自动处理字符与底层字节之间的转换&#xff0c;因此非常适合处理包含文本数据的文件。Java 中处理字符流的核心抽象类是 Reader 和 Writer。 Read…

C#面:是否可以从一个 static 方法内部发出对非 static 方法的调用

不可以&#xff1b; 不能直接从一个静态方法内部调用非静态方法。 这是因为静态方法是属于类的&#xff0c;而非静态方法是属于类的实例的。 静态方法可以在没有创建类的实例的情况下被调用&#xff0c;而非静态方法需要通过类的实例来调用。 如果想要从静态方法内部调用非…

算法入门-二分搜索(长期更新)

文章目录 情景一 : 二分查找情景二 : 找出一个 > num 的最左侧的位置情景三 : 找出一个 < num 的最右侧的位置leetcode 162 :寻找峰值leetcode 69 : x 的平方根 首先来简介一下二分搜索算法,二分搜索是一种每次砍半的算法,最经典的案例当然是我们的二分查找算法,但是大部…

【JAVA重要知识 | 第一篇】一篇文章读懂HashMap(存储、扩容、初始化过程)

文章目录 1.一篇文章读懂HashMap&#xff08;存储、扩容、初始化过程&#xff09;1.1HashMap简介1.1.1特点1.1.2优点1.1.3缺点 1.2深入解读HashMap1.2.1常用常量和变量&#xff08;1&#xff09;常用常量&#xff08;2&#xff09;常用变量 1.2.2存储过程&#xff08;1&#xf…