根据VisualGDB官网(https://visualgdb.com)的帮助文档大致翻译而成。主要是作为个人学习记录。有错误的地方,Robin欢迎大家指正。

本文介绍如何快速调试GCC构建的Linux程序,而不用再创建一个单独的VS项目。

本文中,首先在Linux机器上构建GNU binutils程序,然后使用VS调试cxxfilt程序(GNU C++ name demangler)来发现该程序中的哪些函数真正进行了demangling。然后,我们可以使用本文介绍的技术来调试GCC构建的其他工具。

以下是快速调试步骤。

1 下载并解压binutils源码

在Linux电脑上下载并解压binutils源码。如果你使用的是基于Debian的Linux系统,使用如下命令来完成:

apt-get source binutils

2 配置并构建binutils

在Linux机器上运行如下命令来配置和构建binutils:

cd ~

mkdir binutils-build

cd binutils-build

../binutils-2.22/configure

make

3 使用构建的cxxfilt工具进行demangle

上一节构建结束后,在目录~/binutils-build/binutils下会包含cxxfilt二进制程序。运行该程序并键入二进制文件中的一个C++-mangled名字(比如_Z4testi),程序将会demangle该名字(对于名字_Z4testi,结果是test(int)):

4 从VS中快速远程调试二进制程序

从VS中远程调试cxxfilt二进制程序的最快方式是,使用VisualGDB的快速调试特性(需要VisualGDB3.0或更新版本)。

下面各步骤将介绍如何进行快速调试(Quick Debug)。

5 启动VS并快速调试

启动VS,并选择”Debug”->”Quick Debug with GDB”:

6 选择调试Linux程序及远程机器

选择”Debug a Linux app”,然后再选择远程机器。根据需要建立一个新的SSH连接。

7 选择被调试程序并配置GDB

设定要调试的程序的路径(比如cxxfilt),使用右侧的按钮来浏览Linux机器上的文件。在”GDB binary”中设定”gdb”,从而在Linux机器上使用默认的GDB。

推荐使用有意义的名字来保存preset,这样下次在调试同一个可执行程序时就可以避免再次手动配置了。

8 断点调试

点击”Debug”开始调试,然后会进入main()中的断点:

9 自动下载相应的源码

值得注意的是,VisualGDB会自动从Linux机器上将源码cxxfilt.c下载到%LOCALAPPDATA%\VisualGDB\AutoDownloadedSources中。如果你step into或者在Call Stack中切换选择,VisualGDB会继续下载需要的文件。当然,下载的过程是单向的:你不能在Windows上修改这些文件。如果想在Windows上修改你的Linux源码,请参考文档《使用VS来开发Linux程序》。

10 恢复运行并断点

按F5恢复程序运行,然后点击”Break All”断点进入:

11 在demangle函数中设置断点并用户输入

在Call Stack中可以发现,程序正等待用户输入。在函数调用demangle_it()上设置断点,并按F5恢复程序执行。

在Remote Console pane中,键入_Z4testi并按Enter键,将会进入刚设置的断点中:

12 单步进入demangle函数

单步进入demangle_it()函数中,观察该函数究竟干了啥:

可以看到,该函数内部实际上调用cplus_demangle_v3()进行demangle。cplus_demangle_v3()函数来自于libiberty库中的cplus-dem.c文件。

13 查看源码

由于没有创建VisualGDB项目,VS中的Solution Explorer并不显示任何文件。为了浏览symbol files中列出的所有源文件,在GDB Session窗口中点击按钮”Source File List”:

VisualGDB源文件浏览器页将会展示GDB报告的所有文件、对应的在Windows上的位置(如果已经建立路径映射的话),并允许在VS中打开这些文件。缺失的文件将会被自动下载。进入Hierarchical View,选择任意文件并点击”Open”,该文件将被下载并在VS中打开:

之后可以按Shift-F5结束调试。

VisualGDB系列10:快速调试Linux应用程序的更多相关文章

  1. VisualGDB系列4:概述-Linux程序与VS

    根据VisualGDB官网(https://visualgdb.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指正. 本文将会阐述如何使用VisualGDB来 ...

  2. slickedit编译调试linux应用程序

    目录 slickedit编译调试linux应用程序 工程建立 编译 智能报错跳转 配置编译环境 调试 title: slickedit编译调试linux应用程序 date: 2019/3/19 17: ...

  3. 在windows通过visual studio远程调试linux mono程序

    本文参考文章 https://github.com/techl/MonoRemoteDebugger 1.通过连接https://github.com/techl/MonoRemoteDebugger ...

  4. GDB+GDBServer调试Linux应用程序

    参考:http://blog.csdn.net/shanghaiqianlun/article/details/7820401 一.gdb+gdbserver总体介绍 远程调试环境由宿主机GDB和目标 ...

  5. DE1-SOC调试linux应用程序

    参考http://www.alterawiki.com/wiki/SoCEDSGettingStarted#Getting_Started_with_Linux_Application_Debuggi ...

  6. VisualGDB系列5:使用VS来开发Linux程序

    根据VisualGDB官网(https://visualgdb.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指正. 本文演示如何使用VS来构建和调试Linu ...

  7. VisualGDB系列7:使用VS创建Linux静态库和动态库

    根据VisualGDB官网(https://visualgdb.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指正. 本文介绍如何在VS中创建静态库和动态库, ...

  8. 通过Windows Visual Studio远程调试WSL2中的.NET Core Linux应用程序

    最近两天在Linux中调试.NET Core应用程序,同时我发现在Linux中调试.NET Core应用程序并不容易.一直习惯在Visual Studio中进行编码和调试.现在我想的是可以简单快速的测 ...

  9. 使用VS+VisualGDB编译调试Linux程序

    Linux程序开发变得越来越多,越来越多的程序.产品需要跨平台,甚至有些开源项目只支持Linux平台,所以掌握Linux开发变得越来越重要. 但是对于习惯了Windows下的开发,使用了VS这个宇宙第 ...

随机推荐

  1. spark总结4 算子问题总结

    官网上最清晰 sc 启动spark时候就已经初始化好了 sc.textFile后 会产生一个rdd spark 的算子分为两类 一类 Transformation  转换 一类 Action  动作 ...

  2. linux图形界面基本知识(X、X11、Xfree86、Xorg、GNOME、KDE之间的关系)

    linux图形界面基本知识(X.X11.Xfree86.Xorg.GNOME.KDE之间的关系)(转自互联网) LINUX初学者经常分不清楚linux和X之间,X和Xfree86之间,X和KDE,GN ...

  3. java导包

    下载响应的zip文件,就可以导入了,导入src目录也是可以的.

  4. [thinkphp使用phpspreadsheet时出现]Cannot redeclare xxxxxx() (previously declared in C:\WWW\xxx.xxx:xxx)

    [thinkphp使用phpspreadsheet时出现]Cannot redeclare xxxxxx() (previously declared in C:\WWW\xxx.xxx:xxx) 一 ...

  5. CSS基础(滑动门,雪碧图,网页布局)

    3.11.2017 这一篇主要是关于滑动门技术的学习,还有雪碧图(sprite),也就是精灵图,还有一点昨天的css可见性的回顾,下面先来回顾下吧 CSS可见性(元素可见性) overflow: hi ...

  6. Left Join ,On Where

    SQL语句如下: SELECT * FROM 表1 LEFT JOIN 表2 ON 表1.id = 表2.id AND 表2.Name != 'ff' WHERE 表1.NAME != 'aa' 步骤 ...

  7. 19条ANDROID平台设计规范平台设计规范

    1.尺寸以及分辨率: Android的界面尺寸比较流行的有:480*800.720*1280.1080*1920,我们在做设计图的 时候建议是以 480*800的尺寸为标准: 2.界面基本组成元素: ...

  8. Deep Learning(Ian Goodfellow) — Chapter1 Introduction

    Deep Learning是大神Ian GoodFellow, Yoshua Bengio 和 Aaron Courville合著的深度学习的武功秘籍,涵盖深度学习各个领域,从基础到前沿研究.因为封面 ...

  9. logz.io一个企业级的ELK日志分析器 内部集成了机器学习识别威胁——核心:利用用户对于特定日志事件的反馈处理动作来学习判断日志威胁 + 类似语音识别的专家系统从各方收集日志威胁信息

    转自: 可看到它使用机器学习算法来识别DNS安全问题 http://logz.io/blog/machine-learning-log-analytics/ A Machine Learning Ap ...

  10. nyoj-1099-Lan Xiang's Square(几何,水题)

    题目链接 /* Name:nyoj-1099-Lan Xiang's Square Copyright: Author: Date: 2018/4/26 9:19:19 Description: 给4 ...