您现在的位置是:首页 > 正文

Windows下的C/C++的远程调试

2024-01-30 23:06:07阅读 0

1. 问题

程序员经常会面临,开发电脑上一切运行正常,但是在测试电脑上却死活都有问题。一般情况下,我们可加一些弹窗或是打印Log来进行分析调试。但是如果问题复杂时,以上方法调试还是比较麻烦。如果可以像开发电脑一样,可以单步运行,并可以查看各种变量、堆栈信息,那就非常方法。有人直接在测试电脑上安装编译调试工具,但是有时问题是出现在客户电脑上,此时去安装相关编译调试工具,就非常不方便。那么有没有一种方法,不用安装Visual Studio,就能方便地直接对测试电脑进行调试呢?
另外,Windows内核程序的调试,有时是无法在测试电脑上进行的,因为内核程序运行时,Windows可能还没有启动完全。

2. 远程调试

针对以上问题,远程调试(也称双机调试)技术被开发出来。远程调试,即使用开发电脑通过网络、管道、串口、1394或USB等信息通信手段来与测试电脑进行连接,来控制测试电脑进行调试。两台电脑之间通信,更常用的方法是网络通信,即使用TCP/IP协议进行通信。

2.1. 准备

  1. 调试服务器,即需要调试的远程电脑。
  2. 调试客户端,即进行远程操作的电脑,也即开发电脑。
  3. 正常的TCP通信,保证两电脑在同一个局域网中,并且可以正常的ping连接,而且两台电脑应该处于同一个网段。如果调试服务器处在子路由网络,开发电脑处在父路由网络,可能无法进行连接。

2.2. 远程监控

实时查看Log信息时,需要使用一些监控工具。DbgView是Windows出品的调试信息监控查看工具。DbgView不仅可以在测试电脑上直接运行查看相关调试信息,还可以在开发电脑上运行查看测试电脑上程序运行的调试信息。
其基本原理是,在测试电脑上运行DbgView,对程序运行进行监控,然后在开发电脑上打开DbgView,然后连接测试电脑上的DbgView。这样开发电脑就可以实时显示测试电脑上的调试信息。

  1. 测试电脑上,通过命令启动DbgView

DbgView /a /k /g

  • /a表示以服务器方式启动DbgView。
  • /表示监控内核输出。
  • /g表示监控全局Win32l输出。
  1. 在开发电脑上,直接打开Dbgivew
    选择菜单Computer->Connect,输入测试电脑IP或计算机名,点击确定。
    连接成功,即会显示下图。DbgView可以同时监控本机和远程电脑,可以选择Disconnect本地连接,只监控远程电脑。
    在这里插入图片描述
  2. DbgView的版本最好保持一致,避免可能连接不成功。测试使用的Verson 4.81。

2.3. VS远程调试

  1. 将VS目录中的Remote Debugger目录整个拷贝到远程电脑上去。
  2. 根据远程电脑情况,选择相应内核版本目录打开msvsmon.exe
  3. 首次打开msvsmon.exe需要配置防火墙信息
    在这里插入图片描述
  4. 选择菜单Tools->Options进行如下配置,并记录Server Name用于远程连接。
    在这里插入图片描述
  5. 将exe/dll及对应的pdb文件拷贝到远程电脑上,并启动exe
  6. 打开开发电脑VS代码工程,选择Attach to Process,并在Qualifier中填入远程电脑名,并回车确认,然后Available Process中选择远程电脑上需要被调试的进程,并点击Attach,即可以进行调试。
    在这里插入图片描述

2.4. WinDbg远程调试

WinDbg的调试功能比VS更加强大,不仅仅可以调试应用程序代码,还可以调试内核代码。WinDbg远程调试,即远程电脑上启用WinDbg进行具体执行,而开发电脑上的WinDbg则通过网络连接远程电脑上的WinDbg进行操作和显示。

  1. 将需要调试的exe/dll及PDB文件拷贝到远程测试电脑上。
  2. 远程电脑上打开WinDbg,并打开需要调试的exe,WinDbg会立即中断在exe的入口函数处。
    在这里插入图片描述
  3. 在WinDbg命令框中输入 .server tcp:port=5000 并按回车,显示如下
    也可以通过命令行WinDbg -server tcp:port=5000直接启动WinDbg服务器模式。
    在这里插入图片描述
  4. 在打开电脑上打开WinDbg,连接服务端WinDbg。
    选择菜单File->Connect to remote Session,填入相应的IP及端口
    tcp:Port=5000,Server=172.18.41.31
    也可以直接通过命令行WinDbg -remote tcp:Port=5000,Server=172.18.41.31进行启动并连接服务端WinDbg,
    在这里插入图片描述
  5. 设置符号文件
    在命令框中输入 .sympath srvD:\MyServerSymbolshttps://msdl.microsoft.com/download/symbols
  6. 重新加载符号文件
    在命令框中输入 .reload,并回车,即会重新下载并加载系统符号文件
  7. 指定源代码路径
  8. 设置断点
  9. 按F5,运行程序到断点处,即可以单步调试

3. 其他

  1. exe/dll、pdb文件和源代码一定要保持编译时的版本。
  2. 远程电脑和本地电脑上的调试工具版本要对应。
  3. 更多WinDbg调试信息见WinDbg调试。

网站文章

  • spark-各版本特性

    0.3 Save Operations You can now save distributed datasets to the Hadoop filesystem (HDFS), Amazon S3...

    2024-01-30 23:05:59
  • 插入排序小结

    最近上心找实习,把博客落下了,这不行啊 抓住3月的尾巴,赶紧更新 预计会把排序算法总结一下,手边有现撸的代码 其他的(二叉树、图等)还需要看情况,要找OJ去刷题(只怪先前没积累,还是要过笔试关的),或者修补一下其他短板,总结性的工作要靠后了。直接插入排序思想:从未排序部分的数组中找到第一个元素,与已经排序(升序)部分由后向前比较,找到(有后向前)第一个比选中元素小的位置(或者说是

    2024-01-30 23:05:30
  • 控制流图、圈复杂度 热门推荐

    控制流图、圈复杂度 热门推荐

    继续上次的测试作业,学习完程序插装的概念,今天学习测试的静态分析方法:绘制控制流图与计算圈复杂度。 一、控制流图: 一个过程或程序的抽象表现,常以数据结构链的形式表示。 二、圈复杂度: 复杂度越高,软件质量就越低,测试就越困难。 圈复杂度(McCabe),其复杂度V(G)可按以下公式计算: V(G) = E – n + 2 其中,E为图G中的边数,

    2024-01-30 23:05:23
  • MT6701磁编码器使用指南,14Bit单圈绝对值,I2C stm32 HAL库读角度,兼容AS5600

    MT6701磁编码器使用指南,14Bit单圈绝对值,I2C stm32 HAL库读角度,兼容AS5600

    MT6701是麦歌恩(MagnTek)公司的磁性角度传感器芯片,提供14Bit 0~360°单圈绝对角度检测,拥有等多种信息输出方式,还可根据磁场强度的瞬时变化提供非接触式按压检测功能。能够以较低的成...

    2024-01-30 23:05:16
  • jcg 836 固件_JCG Studios – ArkDroid Beta发布

    jcg 836 固件_JCG Studios – ArkDroid Beta发布

    jcg 836 固件 大家好, 最近几个月,我们一直在忙于开发我们的第一个Android游戏项目。 方舟机器人我们就是所谓的“进化的碎石机”; 一个Arkanoid克隆游戏,它以电影故事和RPG精髓丰富了经典的“打破常规”游戏世界! 可以肯定的是,我们在Android平台上进行的首次游戏开发工作中学到了很多东西,并且打算与Java Code Geeks社区的其他成员共享所有“多汁的”细节! ...

    2024-01-30 23:04:49
  • JAVA和C语言有啥区别?是选择学习JAVA还是C?

    JAVA和C语言有啥区别?是选择学习JAVA还是C?

    JAVA和C语言有啥区别 1、C语言是面向过程的语言,执行效率高;Java是面向对象的语言,执行效率比C语言低; 2、C语言的安全性不如Java,C语言没有Java的垃圾回收机制,申请的空间要手动释放...

    2024-01-30 23:04:42
  • 程序员这个职业的危险期你知道吗

    这么多的职业病,再加上不分昼夜的加班,说不准哪天就又出来个胡新宇。 1.近视 整天瞅着屏幕,想不近视都难。每次开技术会议,往下看都是白茫茫一片。从事IT而不戴眼镜的人,真是让人羡慕啊。 2.颈椎病 每天坐在那里,盯着一个地方,时间稍长,就感觉脖子僵硬。赶快去检查下颈椎吧。 3.腰间盘突出 每天坐8个小时,很少活动,再加上坐姿不雅,腰酸背疼。 4.胃病 工作紧张,匆忙的快餐,有个好胃...

    2024-01-30 23:04:33
  • 关于AndroidStudio的代理(Proxy)设置无效问题

    关于AndroidStudio的代理(Proxy)设置无效问题

    AndroidStudio中的代理设置我们一般可以找到菜单Apperarance & Behavior->System Settings->HTTP Proxy配置界面大概如下直接配置HTTP代理即可...

    2024-01-30 23:04:04
  • 5G基本原理/5G NR的关键技术

    5G基本原理/5G NR的关键技术

    主要介绍5G技术的基本原理,包括调制方式、波形设计、帧结构、参考信号以及信道编码方式等。

    2024-01-30 23:03:57
  • Spring5框架

    Spring5框架

    Spring5框架文章目录Spring5框架概述小案例IOC什么是IOC底层原理IOC(beanfactory接口)IOC操作Bean管理什么是Bean管理Bean管理操作两种方式基于 xml 配置文...

    2024-01-30 23:03:49