专栏首页高性能服务器开发用Visual Studio调试linux程序

用Visual Studio调试linux程序

用Visual Studio调试linux程序?你真的没看错,这个是真的,不是标题党。当然如果你说VS2015及以上版本自带的linux调试插件,那就算了。这些自带的插件调试一个有简单的main函数程序还凑合,稍微复杂点的程序,根本无法编译调试。

而本文介绍的主角是VS的另外一款插件Visual GDB,让我们欢迎主角登场,下面是正文。

使用Visual Studio+VisualGDB调试远程linux程序

需要工具:

  1. Visual Studio 2013或以上版本(以下简称VS)
  2. VisualGDB(一款VS插件,官网为:http://visualgdb.com/)
  3. 含有调试符号的linux程序文件(该程序文件为调试目标)
  4. Visual Assistant(番茄助手,另外一款VS插件)

在VS上安装完VisualGDB插件以后,有如下几种方式来对远程linux机器上的程序进行调试:

  • 方法一、如果该程序已经启动,则可以使用VS菜单【Debug】->【Attach to Process...】。

这种方法有个缺点是,不能从开始启动的main函数处添加断点,自始至终地调试程序,查看完整程序运行脉络,所以下面推荐方法二。

  • 方法二、利用VS启动远程linux机器上一个linux程序文件进行调试。选择VS菜单【Debug】 ->【Quick Debugwith GDB】。

需要注意的地方,已经在上图中标红框。这里简单地解释一下:

如果你安装了交叉编译环境Target可以选择MinGW/Cygwin,否则就选择远程linux系统。这里如果不存在一个ssh连接,则需要创建一个。

Debugged program是需要设置的被调试程序的路径,位于远程linux机器上。

Arguments是该调试程序需要设置的命令行参数,如果被调试程序不需要命令行参数可以不设置。

Working directory是被调试程序运行的工作目录。

另外建议勾选上Initial breakpoint in main,这样启动调试时,程序就会停在程序入口处。

这样,我们就可以利用VS强大的功能去查看程序的各种状态了,常用的面板,如【内存】【线程】【观察】【堆栈】【GDB Session】【断点】等窗口位于VS 菜单【Debug】->【Windows】菜单下,注意,有些窗口只有在调试状态下才可见。这里有两个值得强调一下的功能是:

  1. GDB Session窗口,在这个窗口里面可以像原来直接使用gdb调试一样输入gdb指令来进行调试。
  1. SSH console窗口,这个窗口类似一个远程操作linux系统的应用程序如xshell、SecureCRT。

现在还剩下一个问题,就是我们虽然在调试时可视化地远程查看一个linux进程的状态信息,但很多类型的定义和什么却无法看到。解决这个问题的方法就是你可以先在VS里面建立一个工程,导入你要调试的程序的源代码目录。然后利用方法一或者方法二去启动调试程序。这个时候你想查看某个类型的定义或什么只要利用Visual Assit的查看源码功能即可,快捷键是Alt + G。

需要注意的时:同时安装了Visual Assist和VisualGDB后,后者也会提供一个go按钮去查找源码定义,但这个功能远不如Visual Assist按钮好用,我们可以禁用掉它来使用Visual Assist的Go功能。禁用方法,打开菜单:【Tools】->【Option...】:

然后重启VS即可。

到这里,既可以查看源码,也可以调试程序了。

本文分享自微信公众号 - 高性能服务器开发(easyserverdev),作者:张小方

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-03-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • API设计原则 – QT官网的设计实践总结

    原文链接:API Design Principles – Qt Wiki 链接:(http://wiki.qt.io/API_Design_Principles...

    范蠡
  • Linux内核中双向链表的经典实现

    本文对双向链表进行探讨,介绍的内容是Linux内核中双向链表的经典实现和用法。其中,也会涉及到Linux内核中非常常用的两个经典宏定义offset...

    范蠡
  • 002 Linux内核中双向链表的经典实现

    本文对双向链表进行探讨,介绍的内容是Linux内核中双向链表的经典实现和用法。其中,也会涉及到Linux内核中非常常用的两个经典宏定义offset...

    范蠡
  • Gson 序列化Javabean的时候要注意的地方

    如果是php做后台的时候,传回时间一般都用时间戳,不要传回一个string  而是传回一个数字

    wust小吴
  • Golang使用标签表达式校验结构体字段的有效性

    在服务的API接口层面,我们常常需要验证参数的有效性。 Golang中,大部分参数校验场景实际上是先将数据Bind到结构体,然后校验其字段值。

    henrylee2cn
  • Python 枚举

    首先,定义枚举要导入enum模块。 枚举定义用class关键字,继承Enum类。 用于定义枚举的class和定义类的class是有区别。

    周小董
  • 业界 | 李飞飞团队最新研究成果:视觉AI让医院细菌无处可逃!

    据说每年都会有很多人在医院感染病菌然后不幸患病,甚至因此导致的死亡人数比车祸还多。

    大数据文摘
  • WCF传输安全(Transfer Security)的基本概念和原理:认证(Authentication)[上篇]

    对于任何一个企业级应用来说,安全(Security)都是一个不可回避的话题。如何识别用户的身份?如何将用户可执行的操作和可访问的资源限制在其允许的权限范围之内?...

    蒋金楠
  • 【数据架构】概念数据模型和逻辑数据模型有什么区别

    概念数据模型和逻辑数据模型的主要区别在于,概念数据模型表示实体及其关系,而逻辑数据模型除了提供实体和关系之外,还提供了更多的细节,包括属性、主键和外键。

    首席架构师智库
  • 数据模型:数字化转型的核心能力

    对于下图的房屋平面图来说,我们基本看一眼就能知道这是一个三室两厅两卫的房子,有一个玄关和一个阳台,哪里是门,哪里是墙,哪里是窗户,每个房间的平米数是多少,全部都...

    数据猿

扫码关注云+社区

领取腾讯云代金券