windows下debug linux C/C++程序的一种方法

debug linux C/C++程序的方法有很多,下面介绍一种在windows下debug linux程序的方法,道理很简单,就是通过gdb提供的client和server的remote debug功能来进行远程调试,windows做gdb客户端,linux做gbd服务器。需要准备的软件如下:

  1. MinGW windows开发环境,主要用它的gcc来编译交叉gdb调试器
  2. 一个交叉gdb调试器,跑在windows上,但是target是linux
  3. eclipse和cdt
  4. 一个gbdserver,跑在linux上
  5. 可选,最好配置smb,这样方便

1 安装MinGW

MinGW是一个很小的GNU windows平台开发环境,包括linux下常见的开发工具,如gcc、gdb、make、autotools等等,具体介绍详见:http://mingw.org/
MinGW的自动安装比较简单,从以下地址下载mingw-get-inst文件,按照提示安装就可以了:
http://sourceforge.net/projects/mingw/files/Automated%20MinGW%20Installer/mingw-get-inst/
如果需要手工安装,请参考:http://mingw.org/wiki/InstallationHOWTOforMinGW 的 Manual Installation小节。

最后,MinGW只是GNU windows开发环境的一种,您还可以选择像CYGwin等其他环境。

2 构建交叉gdb调试器

由于我们debug的是linux c应用程序,因此我们需要一个linux C ABI兼容的调试器,也就是说该gdb必须能够解析在linux C应用程序文件(通常是elf文件),
另外,该gdb调试器作为gdb客户端跑在windows机器上,因此运行平台(host)为windows。
安装完MinGW后,我们通过其提供的gcc来构建我们的交叉gdb调试器,其实很简单,步骤如下:

  1. 下载gdb源代码: wget http://ftp.gnu.org/gnu/gdb/gdb-7.2.tar.bz2
  2. 解压: tar xjf http://ftp.gnu.org/gnu/gdb/gdb-7.2.tar.bz2
  3. cd gdb-7.2
  4.  ./configure --target=i686-pc-linux-gnu
    先解释一下configure脚本的3个平台,输入configure --help可以看到:System types:
    System types:
      --build=BUILD     configure for building on BUILD [guessed]
      --host=HOST       cross-compile to build programs to run on HOST [BUILD]
      --target=TARGET   configure for building compilers for TARGET [HOST]System types:
    
    build表示你用来编译该gdb的平台
    host表示编译后用来运行gdb的平台
    target表示gdb的解析器的ABI平台,即gdb能够解析什么平台的可执行文件
    

    那么如何确定这3个平台呢,由于我们的target是linux平台,你可以在linux下先跑一下这个configure脚本,很快它会帮你guess出来的:
    windy@colinux:$ ./configure 
    checking build system type... i686-pc-linux-gnu
    checking host system type... i686-pc-linux-gnu
    checking target system type... i686-pc-linux-gnu

    由于这里是在linux下configure,又没有输入任何configure参数,因此我们看到configure脚本自动猜出我们的3个平台都为i686-pc-linux-gnu。
    由于我们的build是在windows下,host也是windows,所以这2个参数就不用指定了,直接指定target就可以了:
    Administrator@huangxr ~/gdb-7.2
    $ ./configure --target=i686-pc-linux-gnu
    checking build system type... i686-pc-mingw32
    checking host system type... i686-pc-mingw32
    checking target system type... i686-pc-linux-gnu
  5. configure完后,如果没有什么错误的话,就可以make了,最后gdb-7.2/gdb目录下生成一个gdb.exe可执行文件,这就是我们构建的交叉调试器
    为了方便可以将它重命名为linux_gdb.exe
  6. 构建后,测试一下,输入linux_gdb,应该输出类似以下文本:
    $ linux_gdb
    GNU gdb (GDB) 7.2
    Copyright (C) 2010 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
    and "show warranty" for details.
    This GDB was configured as "--host=i686-pc-mingw32 --target=i686-pc-linux-gnu".
    For bug reporting instructions, please see:
    <http://www.gnu.org/software/gdb/bugs/>.
    (gdb)
    

3 配置eclipse环境

假设你已经安装完windows下的eclipse和cdt开发环境,那么就可以配置debug环境了,步骤如下:

  1. 假设你已经有一个C工程,例如nginx代码,首先,你需要在linux下编译代码,得到可执行文件,然后将代码导入到eclipse(我是通过smb和linux共享代码的)
  2. 点击debug图标下的debug configurations,新建一个c/c++ Application,配置如下:

4 启动一个gdbserver


这个gdbserver对应你在cdt中设置的的ip、端口。启动后,可以看到gdbserver开始监听来自远端的请求。

5 开始debug

点击cdt中debug图标下相应的debug项:

eclipse就会连接这个gdbserver了,这是可以看到gdbserver端显示如下:

说明gdbserver已经和eclipse建立debug连接了,eclipse的cdt的debug视图如下:

至此,就可以对linux C/C++程序在windows下进行debug了,一样可以查看变量、设置断点等等,具体就不讲了。

6 一些尚未测试或者不能确定的地方

这种debug方法有一些性质我还没有试过,目前我所了解到的可以说明如下:
1 debug共享库或者静态库一般是比较难的,我还没去找如何加载so和.a文件的方法
2 多线程调试和多进程调试支持不好,例如多进程不能set follow-fork-mode,这个是试过了的,但是多线程没试过

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
C 和 C++ 语言都是世界上最流行且使用最普遍的编程语言, 因此 Eclipse 平台Eclipse Platform)提供对 C/C++ 开发的支持一点都不足为奇。 因为 Eclipse 平台只是用于开发者工具的一个框架,它不直接支持 C/C++;它使用外部插件来提供支持。 本文将向您演示如何使用 CDT — 用于 C/C++ 开发的一组插件。CDT 项目(有关链接, 请参阅本文后面的 参考资料一节)致力于为 Eclipse 平台提供功能完全的 C/C++ 集成开发环境(Integrated Development Environment,IDE)。 虽然该项目的重点是 Linux,但它在可使用 GNU 开发者工具的所有环境(包括 Win32(Win 95/98/Me/NT/2000/XP)、QNX Neutrino 和 Solaris 平台)中都能工作。 CDT 是完全用 Java 实现的开放源码项目(根据 Common Public License 特许的),它作为 Eclipse SDK 平台的一组插件。这些插件将 C/C++ 透视图添加到 Eclipse 工作台(Workbench)中, 现在后者可以用许多视图和向导以及高级编辑和调试支持来支持 C/C++ 开发。 由于其复杂性,CDT 被分成几个组件,它们都采用独立插件的形式。 每个组件都作为一个独立自主的项目进行运作,有它自己的一组提交者、错误类别和邮件列表。 但是,所有插件都是 CDT 正常工作所必需的。 下面是 CDT 插件/组件的完整列表: 主 CDT 插件(Primary CDT plug-in)是“框架”CDT 插件。 CDT 功能 Eclipse(CDT Feature Eclipse)是 CDT 功能组件(Feature Component)。 CDT 核心(CDT Core)提供了核心模型(Core Model)、CDOM 和核心组件(Core Component)。 CDT UI是核心 UI、视图、编辑器和向导。 CDT 启动(CDT Launch)为诸如编译器和调试器之类的外部工具提供了启动机制。 CDT 调试核心(CDT Debug Core)提供了调试功能。 CDT 调试 UI(CDT Debug UI)为 CDT 调试编辑器、视图和向导提供了用户界面。 CDT 调试 MI(CDT Debug MI)是用于与 MI 兼容的调试器的应用程序连接器。 现在,让我们研究一下如何在实际应用程序中使用这些组件。图 1 显示了 Eclipse 中的 C/C++ 项目: 图 1. 在带有 CDT 插件的 Eclipse 中编辑 C/C++ 项目 安装和运行 CDT 在下载和安装 CDT 之前,首先必需确保 GNU C 编译器(GNU C compiler,GCC)以及所有附带的工具(make、binutil 和 GDB)都是可用的。 如果正在运行 Linux,只要通过使用适用于您分发版的软件包管理器来安装开发软件包。 在 Windows平台上,将需要安装 Cygwin 工具箱(请参阅 参考资料以获得链接)。Cygwin 是用于 Windows 的类 UNIX 环境,它包括 GCC 移植以及所有必需的开发工具,包括 automake 和 GNU 调试器(GNU Debugger,GDB)。Cygwin 是在 cygwin1.dll 库基础上构建的。Cygwin 的备用解决方案是 Minimalist GNU for Windows(MinGW)(请参阅 参考资料以获得链接)。 该工具是一组可免费获取、自由分发的特定于 Windows 的头文件和导入库,这些头文件和导入库与 GNU 工具集(它们允许您生成不依赖于任何第三方 DLL 的本机 Windows 程序)结合在一起。 如果您想要创建与 POSIX 兼容的 Windows 应用程序,那么 MinGW 是最佳选择。MinGW 甚至可以在 Cygwin 安装之上工作。 Solaris和 QNX要求您从因特网下载并安装其特定的 GCC、GNU Make binutils 和 GDB 移植(请参阅 参考资料以获得链接)。 假设您安装了适当的 Java SDK/JRE 和 Eclipse 平台 SDK,并且它们都正常运行。CDT 以两种“方式”可用:稳定的发行版和试运行版(nightly build)。 试运行版未经完全测试,但它们提供了更多的功能并改正了当前错误。 安装之前,请检查磁盘上是否存在先前版本的 CDT,如果存在,请确保完全除去它。 因为 CDT 没有可用的卸载程序,所以需要手工除去它。 为了检查先前版本是否存在,转至 CDT 插件所驻留的目录: eclipse/plugins 。 接着,除
WinDBG 是个非常强大的调试器,它设计了极其丰富的功能来支持各种调试任务,包括用户 态调试、 内核态调试、 调试转储文件、 远程调试等等。 WinDBG 具有非常大的灵活性和可扩展性, 用来满足各种各样的调试需求,比如用户可以自由定义调试事件的处理方式,编写调试扩展模块 来定制和补充 WinDBG 的调试功能。 尽管 WinDBG 是个典型的窗口程序, 但是它的大多数调试功能还是以手工输入命令的方式来 工作的。目前版本的 WinDBG 共提供了 20 多条标准命令, 140 多条元命令( Meta-commands), 和难以计数的大量扩展命令。学习和灵活使用这些命令是学习 WinDBG 的关键,也是难点。 上一章我们从设计的角度分析了 WinDBG ,本章将从使用(用户)的角度介绍 WinDBG 。我 们先介绍工作空间的概念和用法(第 1 节),然后介绍命令的分类和不同种类的命令提示符(第 2 节)。 第 3 节介绍不同的调试模式, 也就是如何与不同特征的调试目标建立调试会话。 第 4 节介绍 上下文的概念和在调试时应该如何切换和控制上下文。第 5 节介绍调试事件和如何定制调试事件 的处理方式。 从第 6 节到第 9 节我们将分别介绍如何在 WinDBG 中完成典型的调试操作, 比如控 制调试目标(第 6 节)、设置断点(第 7 节)、观察栈(第 8 节)以及如何观察和修改数据(第 9 节)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值