java扩展nginx之四:远程调试

程序员欣宸      2022-04-23     636

关键词:

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos

本篇概览

  • 本文是《Java扩展Nginx》系列的第四篇,一起来体验个实用的功能,此能力定会让爱学习的您大呼过瘾,它就是广大java程序员在日常开发和定位问题过程中常用的神技:远程调试;
  • 看变量、看堆栈,不论阅读代码还是定位问题,打断点都是我们最值得信赖的手段,当您的代码运行在nginx-clojure模块中的时候,如果能像tomcat那样远程打断点,单步调试,会大幅度提高工作效率
  • 远程断点的效果如下图所示,通过IDEA的Remote JVM Debug功能远程连接到nginx-clojure监听的远程debug端口,当浏览器请求触发了java代码的执行时,就会进入断点状态,停留在断点位置,可以看到堆栈和内存中的变量情况,以及单步执行:

关于工具

  • 本篇使用的编码工具是IntelliJ IDEA 2021.3.2 (Ultimate Edition)

关于代码

package com.bolingcavalry.simplehello;

import nginx.clojure.java.ArrayMap;
import nginx.clojure.java.NginxJavaRingHandler;
import java.time.LocalDateTime;
import java.util.Map;
import static nginx.clojure.MiniConstants.CONTENT_TYPE;
import static nginx.clojure.MiniConstants.NGX_HTTP_OK;

public class HelloHandler implements NginxJavaRingHandler 

    @Override
    public Object[] invoke(Map<String, Object> request) 
        return new Object[] 
                NGX_HTTP_OK, //http status 200
                ArrayMap.create(CONTENT_TYPE, "text/plain"), //headers map
                "Hello, Nginx clojure! " + LocalDateTime.now()  //response body can be string, File or Array/Collection of them
        ;
    

  • 在nginx.conf中,配置了一个location,path是/java
location /java 
	content_handler_type 'java';
	content_handler_name 'com.bolingcavalry.simplehello.HelloHandler';

  • 以上就是今天要打断点调试的代码和配置了

nginx-clojure的远程调试配置

  • 打开nginx.conf文件,在http的配置中增加以下两行,即可开启nginx-clojure的远程调试:
jvm_options "-Xdebug";
jvm_options "-Xrunjdwp:server=y,transport=dt_socket,address=840#pno,suspend=n";
  • 上述配置中,address=840#pno的含义要注意:
  1. 如果worker_processes配置的值等于1,address=840#pno表示远程调试的端口是8401
  2. 如果worker_processes配置的值大于1,例如等于3,此时有3个java进程,每个进程都有一个端口被用于远程调试,这三个端口分别是address=840#pno表示远程调试的端口是840184028403
  • 要注意的是,请确保这些端口没有被占用
  • 今天的实战为了简单省事儿,worker_processes的值等于1,所以只有一个java进程,它的远程调试端口是8401
  • 配置完成后,启动nginx
  • 用postman访问/java,确认可以响应成功,证明nginx和nginx-clojure是正常的:

IDEA上的远程调试操作

  • 用IDEA打开工程,点击下图红框中的按钮:
  • 操作如下图,新增一个Remote JVM Debug配置:
  • Remote JVM Debug的设置如下,红框1是nginx的ip地址,我这里IDEA和nginx在同一台电脑上,所以用localhost即可,红框2是端口号,对应nginx配置的jvm_options中的address=840#pno
  • 配置完成后,按照下图红框数字的顺序操作,先在代码上打断点,然后执行远程连接,顺利的话会看到红框3中的连接成功提示:
  • 至此,远程调试功能已经准备好,可以使用了

验证

  • 在postman上再发一次请求,IDEA上立即进入断点状态,如下图:
  • 如果想看堆栈中的代码,可以操作如下图:
  • 此刻,NginxClojureRT.java已经被下载下来,可以更仔细的阅读和研究nginx-clojure了:
  • 至此,nginx-clojure的远程调试功能演示完毕,各位java同僚们,如虎添翼的感觉有没有?学习和使用nginx-clojure的信心是否更强了呢?

你不孤单,欣宸原创一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 数据库+中间件系列
  6. DevOps系列

devops之四--publishoverssh远程部署

参考技术A可根据实际需求选择。问题:JAR包发送到服务器的位置不对解决方案:调整步骤二和步骤四的RemoteDirectory,最终的目录是连个RemoteDirectory拼接起来的。问题:JAR发送到服务器后,没有执行ExecCommand内的linux指令或shell脚本... 查看详情

远程debug调试java代码

远程debug调试java代码日常环境和预发环境遇到问题时,可以用远程调试的方法本地打断点,在本地调试。生产环境由于网络隔离和系统稳定性考虑,不能进行远程代码调试。整体过程是通过修改远程服务JAVA_OPTS参数&#x... 查看详情

spring4.1.8扩展实战之四:感知spring容器变化(smartlifecycle接口)(代码片段)

欢迎访问我的GitHub本篇概览本章是《spring4.1.8扩展实战》的第四篇,如果业务上需要在spring容器启动和关闭的时候做一些操作,可以自定义SmartLifecycle接口的实现类来扩展,本章我们通过先分析再实战的方法,来掌握这种扩展方... 查看详情

Java远程调试-性能[重复]

】Java远程调试-性能[重复]【英文标题】:Javaremotedebugging-performance[duplicate]【发布时间】:2017-01-2021:20:40【问题描述】:如果您启动一个通过jdwp/socket启用远程调试的java进程并且没有外部进程连接,是否会对性能造成影响?我确... 查看详情

xdebug远程调试

...得用XDEBUG的远程调试功能。首先要给远程环境中安装XDEBUG扩展,具体方法:http://www.cnblogs.com/mysic/p/5993463.html在配置XDEBUG之前,需要先了解下XDEBUG的工作模式,尤其是远程debug时的方式,XDEBUG是需要先和开发端建立连接,启动会话 查看详情

idea远程调试java代码

文章目录1前言2远程Debug调试原理2.1理论基础2.2远程调试分类3主动连接调试3.1远程服务中开启Debug服务3.1.1对于SpringBoot3.1.2对于Tomcat3.2IDEA中指定Debug服务器3.3远程服务器防火墙端口放行4被动连接调试4.1对于Tomcat4.2对于SpringBoot5开始... 查看详情

idea远程调试java代码(代码片段)

文章目录1前言2远程Debug调试原理2.1理论基础2.2远程调试分类3主动连接调试3.1远程服务中开启Debug服务3.1.1对于SpringBoot3.1.2对于Tomcat3.2IDEA中指定Debug服务器3.3远程服务器防火墙端口放行4被动连接调试4.1对于Tomcat4.2对于SpringBoot5开始... 查看详情

使用 Chrome 远程调试工具进行跨浏览器调试

....如何使用Firefoxie等在Chromedevtools中调试东西,是否有任何扩展,如IE、Firefox的adb(远程客户端)。【问题讨论】 查看详情

通信算法之四:九种调试方式理论误码率与实际误码率

1.BPSK。DBPSK,2ASK,2FSK,QPSK。OQPSK。DQPSK。16QAM,64QAM,九种调制方式。理论误码率公式通过查看书本,用matlab绘图。能够知道理论误码率。2.信噪比SNR:0:0.1:20  信道环境:AWGN  仿真流程:调制+AWGN+解调+BER  ... 查看详情

23种设计模式之四(装饰者模式)

...饰者模式:(动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性) 其别名为包装器(Wrapper);装饰模式是一种对象结构模式。设计原则:对扩展开放、对修改关闭,这句话体现在我如果想扩展被装饰... 查看详情

Java 小程序不适用于小程序的远程调试

】Java小程序不适用于小程序的远程调试【英文标题】:JavaappletsdoesntnotworkingwithRemotedebuggingofapplet【发布时间】:2014-04-2316:12:12【问题描述】:我尝试对Java小程序使用远程调试。我正在使用Java7update51,当我尝试加载小程序时,它... 查看详情

如何使用idea远程调试java代码

...式有在本地搭建服务器进行启动或是debug,或是将项目在远程服务器上面部署。一般如果在本地搭建服务器的时候,可以直接选择启动或是直接debug,但是如果项目部署在远程的服务器上面的时候,我们该如何进行调试呢?而一... 查看详情

Intellij IDEA远程调试java控制台程序

】IntellijIDEA远程调试java控制台程序【英文标题】:IntellijIDEAremotelydebugjavaconsoleprogram【发布时间】:2015-04-2810:33:25【问题描述】:我有一个运行Java的远程服务器,我可以通过SSH访问它。我正在本地机器上编写一个应用程序,用mav... 查看详情

要设置哪些 Java 命令行选项以允许远程调试 JVM?

】要设置哪些Java命令行选项以允许远程调试JVM?【英文标题】:WhatareJavacommandlineoptionstosettoallowJVMtoberemotelydebugged?【发布时间】:2010-09-1309:40:14【问题描述】:我知道有一些JAVA_OPTS可以设置为远程调试Java程序。它们是什么,它... 查看详情

使用 Eclipse 或其他方式在 Linux 目标上进行 Java 远程调试

】使用Eclipse或其他方式在Linux目标上进行Java远程调试【英文标题】:JavaremotedebuggingonlinuxtargetusingEclipseorotherwise【发布时间】:2014-09-1823:50:05【问题描述】:谁能告诉我在linux目标上远程调试Java的好方法?我所追求的是一些方法... 查看详情

使用idea远程debug调试(详细)(代码片段)

...og、不停的打包部署。这是何等的浪费时间呀。1:什么是远程调试  远程调试(对应IDEA功能:RemoteJVMDebug)。远程调试使开发人员能够直接诊断服务器或其它线上进程上的问题,它提供了跟踪线上运行时错误并确定性能瓶颈和... 查看详情

java项目部署与远程调试两三事

【开启和进行远程调试】参考https://blog.csdn.net/WSYW126/article/details/748536801、tomcat:配置catalina.shjpda参数,主要是address./catalina.shjpdastart2、springbootmaven插件or命令行<plugin><groupId>org.springframework 查看详情

如何从 Maven 命令行远程调试 Java 应用程序

】如何从Maven命令行远程调试Java应用程序【英文标题】:Howtoremotedebugjavaapplicationfrommavencommandline【发布时间】:2014-03-0808:20:02【问题描述】:我有一个在IntelliJ中运行的java应用程序。我可以知道如何从Maven命令行远程调试应用程... 查看详情