远程debug调试入门

远程debug调试是一个非常常见的问题,下面我会详细讲解其入门攻略,如果有不明白的地方,可以随时提出来。

远程debug的基本理念

远程debug调试,即在一台机器上编写和运行代码,在另一台机器上通过某种方式进行调试。这种调试方式非常适合大型项目,因为在大型项目中,我们并不能将整个工程都copy到本地进行调试。

远程debug的基本思想是:将编译好的程序复制到远程的运行环境中,然后使用本地的调试工具控制远程环境中的程序行为。按照这个思想,我们的远程debug调试流程就可以分为两个部分:

1.在远程环境中编译生成可执行文件:这需要在远程环境中安装编译器和必要的开发工具,将代码编译为可执行的二进制文件。

2.使用本地的调试环境设计远程程序的行为:这需要在本地运行调试工具,通过相应的设置和程序交互,实现对远程程序的监控和调试。

远程调试的实现方式

不同语言和工具支持的远程调试方式可能会有所不同,下面我列出几个常见的远程调试方式:

1.使用gdb进行远程调试:gdb是Linux下非常著名的调试工具,使用gdb进行调试的好处是,gdb允许我们在使用gdbserver的情况下,通过TCP/IP协议连接到远程计算机并进行调试。

2.使用clion进行远程调试:clion是一款非常好用的集成开发环境,它提供完整的调试工具以及支持远程开发和调试,对于远程开发和调试的流程非常友好。

3.使用IntelliJ idea进行远程调试:IntelliJ idea是一款非常强大的Java开发工具,它也支持Java远程调试并且对于Java应用程序的调试非常流畅。

下面,我将分别介绍使用gdb、clion和IntelliJ idea进行远程调试的流程。

使用gdb进行远程调试

环境准备

在进行远程调试前,需要在远程机器上安装gdb和gdbserver,这里以CentOS系统为例,执行以下命令安装:

yum install gdb gdbserver

开始调试

  1. 启动gdbserver

在远程机上,在你想调试的程序目录下,执行命令:

gdbserver host_address:port ./program_name

其中:

  • host_address:本地机器的IP地址或者hostname
  • port:用于和gdb客户端连接的端口号
  • ./program_name:要调试的程序

2.连接到远程gdb

在本地机上,使用gdb连接到远程gdbserver。

gdb program_name 
target remote host_address:port

其中:

  • program_name:要调试的程序
  • host_address:远程机器的IP地址或者hostname
  • port:gdbserver使用的端口号

  • 进行debug操作

使用本地的gdb客户端进行调试即可,命令和本地调试一致。

示例

例如我们要调试一个C++程序 prog,以下为远程 debug 过程:

在远程机器上运行 gdbserver:

suliu@localhost:~/lab/remote-debug$ gdbserver :2333 ./prog 
Process ./prog created; pid = 6126
Listening on port 2333

在本地机器上连接到远程 gdbserver:

suliu@localhost:~/lab/remote-debug$ gdb prog 
GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git
......
Reading symbols from prog...done.
(gdb) set target-async 1
(gdb) target remote 10.0.0.7:2333
Remote debugging using 10.0.0.7:2333
Reading symbols from remote target...
0x00007ffff7dc4658 in ?? () from /lib64/ld-linux-x86-64.so.2

使用CLion进行远程调试

环境准备

在进行远程调试前,需要在远程机器上安装好编译工具,并且配置好SSH服务,可以使用工具如SSH, PuTTY等,这里以CentOS系统为例,执行以下命令安装SSH服务:

yum install openssh-server

开始调试

1.在CLion中配置SSH

在CLion中,打开File -> Settings -> Build, Execution, Deployment -> Deployment,配置SSH服务器的连接方式和登录方式。

2.在CLion中创建远程的工具链

在CLion中打开File -> Settings -> Build, Execution, Deployment -> Toolchains,点击 "+" -> Remote Host -> SSH Credentials,配置远程主机的SSH连接信息。

3.在CLion中创建远程的C++项目

在CLion中,打开File -> New Project,选择Remote Host,输入工程的名称、选择刚刚配置的远程的工具链,CLion 便会自动为你创建一个在远程服务器上开发的C++项目。

4.在CLion中进行远程调试

打开要调试的C++文件,设置断点,点击左侧 tab 运行 -> Edit Configurations,添加一个新的 Remote 运行配置,选择服务器类型SSH,然后输入服务器地址和启动命令信息并确定。选择这个配置,点击 Run 把程序上传到远程后开始运行调试。

示例

下面是一个简单的示例,我们创建了一个新的CLion项目,并且配置好了连接SSH的信息。在Project中建立一个hello world 的cpp文件,然后设置一个断点。

在左侧的运行窗格中点击 Edit Configurations 按钮并进行如下配置:

  • 设置程序运行远程服务器的 SSH 连接信息,在 Deployment 中选择 Upload to server,并选择服务器作为目标,通过勾选和输入密码信息,完成远程主机信息的添加;
  • 点击「Run Configuration」栏中的「Add Configuration」,设置运行参数,包括调试程序的工作目录、调试程序的绝对路径、连接远程端口号等;
  • 设置好配置后,点击 OK 按钮,进行 Debug 操作。

使用IntelliJ idea进行远程调试

IntelliJ IDEA 智能地提供了调试功能,支持 Java 应用程序的远程调试,用户可以像本地调试一样,在在 Java 应用程序的源码中插入断点并调试。其远程调试的配置大致流程和 Clion 配置方法基本相同,因此这里略过。

总结

以上为远程debug调试的基本理念和实现方式,它可以大大提高远程开发的效率。在实际使用中,我们可以根据实际需要选择适合的debug工具和方式,例如,对于Python开发,可以使用Pycharm等工具,进行远程调试。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:远程debug调试入门 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 在JSP中使用formatNumber控制要显示的小数位数方法

    在JSP中,可以使用<fmt:formatNumber>标签来控制数字的显示格式,包括小数位数。 步骤如下: 在JSP页面中引入JSTL标签库: <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@tagli…

    Java 2023年6月15日
    00
  • Java将json对象转换为map键值对案例详解

    当需要在Java程序中处理JSON对象时,常见的方式是将其解析为Java中的HashMap数据结构。以下是将JSON对象转换为Map键值对的完整攻略。 步骤一:导入依赖包 在Java代码中解析JSON对象通常需要使用第三方库,如FastJson、Jackson等。我们可以在项目的pom.xml文件中添加如下依赖: <dependency> &lt…

    Java 2023年5月26日
    00
  • Java设计模式之java桥接模式详解

    Java设计模式之java桥接模式详解 什么是Java桥接模式? Java桥接模式是23种常用的设计模式之一,也称为桥梁模式。它是一个两层结构,其中底层定义了实现,而高层定义了抽象。抽象层通过委托调用实现层中的方法,以实现业务需求。这种模式可以将抽象部分与它的实现部分分离,使它们可以独立地变化。 应用场景 Java桥接模式常用于以下场景: 当需要避免使用由于…

    Java 2023年6月16日
    00
  • Java 使用IO流实现大文件的分割与合并实例详解

    Java 使用IO流实现大文件的分割与合并实例详解 前言 在现代应用程序中,经常需要处理非常大的文件。处理大文件的一种常见方法是将它们分成更小的文件,这有助于减少I/O操作的时间和资源消耗。在Java中,可以使用IO流来实现大文件的分割与合并。 分割文件 读取源文件 首先,我们需要通过使用Java IO API中的FileInputStream读取要分割的源…

    Java 2023年5月20日
    00
  • Java操作Mysql的方法

    关于Java操作MySQL的方法,需要掌握以下几点: 导入数据库驱动程序 建立数据库连接 创建statement对象,执行SQL语句 处理查询结果集 关闭各种连接 下面将详细介绍这些步骤以及如何实现它们。 导入数据库驱动程序 在Java中操作MySQL,需要先导入MySQL的JDBC驱动程序。如果你使用的是Maven等依赖管理工具,可以直接在pom.xml中…

    Java 2023年5月19日
    00
  • 一文详解Spring security框架的使用

    一文详解Spring Security框架的使用 简介 Spring Security是一个基于Spring框架的安全性管理框架,可以实现对Java Web应用程序进行完整的安全性管理。它提供了许多功能,例如认证,授权等,同时提供了广泛的API和扩展点,可以轻松地与其他框架和库集成。本文将详细介绍Spring Security框架的使用方法。 环境准备 在开…

    Java 2023年6月3日
    00
  • MyBatis批量添加、修改和删除

    关于MyBatis批量添加、修改和删除的完整攻略,我会从以下几点进行详细讲解: 批量添加 INSERT INTO 批量修改 UPDATE 批量删除 DELETE 针对每个点,我会详细介绍其语法,以及两个示例。 1.批量添加 INSERT INTO 语法: <insert id="batchInsert" parameterType=…

    Java 2023年5月20日
    00
  • 解决lambda表达式内出现异常无法throw抛出的问题

    当使用Lambda表达式时,可能会遇到无法抛出异常的问题。通常来说,在Lambda表达式中,我们不能throw出异常,因为这样做会导致代码无法编译。 但是,在一些特定的场合,我们还是需要在Lambda表达式中抛出异常。当这种情况发生时,我们可以通过使用java.util.function.Consumer或java.util.function.Supplie…

    Java 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部