Java扩展Nginx之四:远程调试
欢迎访问我的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)
关于代码
- 本篇直接使用《Java扩展Nginx之一:你好,nginx-clojure》中的工程和代码,这里简单回顾如下,只有一个类:
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}的含义要注意:
- 如果worker_processes配置的值等于1,address=840#{pno}表示远程调试的端口是8401
- 如果worker_processes配置的值大于1,例如等于3,此时有3个java进程,每个进程都有一个端口被用于远程调试,这三个端口分别是address=840#{pno}表示远程调试的端口是8401、8402、8403
- 要注意的是,请确保这些端口没有被占用
- 今天的实战为了简单省事儿,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的信心是否更强了呢?
欢迎关注博客园:程序员欣宸
Java扩展Nginx之四:远程调试的更多相关文章
- JAVA(TOMCAT)远程调试
当我们的项目部署到远程机器(开发环境和部署环境在不同的jvm下)中,而远程机器的数据和本地有可能不一样,这个时候我们可能需要连接到远程机器进行调试.为了解决这一问题,JAVA为我们提供了Java平台调 ...
- Java项目部署与远程调试两三事
[开启和进行远程调试]参考https://blog.csdn.net/WSYW126/article/details/748536801.tomcat:配置catalina.sh jpda参数,主要是 ...
- Android上的远程调试
来源: http://www.seejs.com/archives/296 目录 远程调试概述 使用 Chrome 的 ADB 扩展进行远程调试 1. 安装 ADB 扩展 2. 启用你的移动设备上的 ...
- 远程调试Spring项目
目录 服务端启动: 启动jar包: 使用环境变量参数调试jar包: 使用mvnDebug启动SpringMVC项目: 使用mvn启动: 使用Tomcat,非嵌入式启动: 客户端设置: IDEA设置: ...
- Tomcat配置远程调试
===========方法1================================ tomcat7 :catalina.bat jpda start,调试端口默认为8000 ======== ...
- 用Eclipse远程调试服务器tomcat
BEGIN; 在做远程调试时,在windows系统和非windows系统下的配置,Tomcat中会有所差别,具体如下: 第一步.配置tomcat 一.在windows系统中: 打开�TALINE_HO ...
- 远程调试Java程序
java 可以以调试模式启动,启动后可以使用 jdb 对程序进行调试.以调试模式启动,需要加入以下参数: java -Xdebug -Xrunjdwp:transport=dt_socket,addr ...
- Java远程调试代码不一致问题汇总
欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...
- paip. java resin 远程 调试 java resin remote debug
paip. java resin 远程 调试 java resin remote debug 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 ...
- java远程调试(断点)程序/tomcat( eclipse远程调试Tomcat方法)
tomcat远程调试: 1.Linux中配置tomcat在catalina.sh中添加如下CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_soc ...
随机推荐
- 浅谈对属性描述符__get__、__set__、__delete__的理解
1.属性描述符的基础介绍 1.1 何为属性描述符? 属性描述符是一种Python语言中的特殊对象,用于定义和控制类属性的行为.属性描述符可以通过定义__get__.__set__.__delete__ ...
- Generative Pre-trained Transformer(GPT)模型技术初探
一.Transformer模型 2017年,Google在论文 Attention is All you need 中提出了 Transformer 模型,其使用 Self-Attention 结构取 ...
- python函数参数与类参数
python关于函数的一些应用 前言 鉴于python3与python2有些不同,看到某些代码时可能会感到疑惑,就稍微记录一下. 一.不限制个数的函数参数 1.*args 以此为参数,会被python ...
- CSS—相对单位rem
一.概述 rem是一个相对长度单位,它的单位长度取决于根标签html的字体尺寸.rem即root em的意思,中文翻译为根em.浏览器的文本尺寸一般默认为16px,即默认情况下: 1rem = 16p ...
- pygame:简易游戏(飞机大战)
import math import random import pygame import sys # pygame初始化 pygame.init() # 得分初始化 score = 0 # 创建s ...
- 理解Java程序的执行
main 方法 public class Solution { public static void main(String[] args) { Person person = new Person( ...
- 笔记:C++学习之旅---初识C++
笔记:C++学习之旅---初识C++ 博主也是一个新手,学习编程才一年左右,刚大学毕业不久,以前在学校学习的语言主要是C,本人是从嵌入式学起的!我现在从事的公司主要是C++,所以我也 ...
- 计算机网络之MAC和IP地址
MAC地址 在局域网中,硬件地址,又称为物理地址或MAC地址. 目前现在的局域网中实际上使用的都是6字节的MAC地址,所以每一个以太网设备都具有唯一的MAC地址. MAC地址的格式 假设传输使用的是I ...
- django时区问题的解决
django时区问题的解决 更新时间:2021年05月18日 09:37:58 作者:Silent丿丶黑羽 我们都知道时区,标准时区是UTC时区,django默认使用的就是UTC时区,我 ...
- openlayers获取绘制多边形的顶点坐标
虽使用Interaction无数次,进行图形绘制与用户交互等,但当需要获取绘制图形的顶点坐标时还是不晓得咋弄? 都知道在绘制完成后回调中能获取到当前的event对象draw.on('drawend', ...