linux下jdb远程调试tomcat源码

本文介绍如何使用jdb进行Tomcat远程调试。通过配置JVM参数启动Tomcat,并利用jdb连接到指定端口设置断点进行调试。示例展示了如何在特定行设置断点并打印变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

jdb远程调试tomcat

  • 在tomcat打开调试设置jvm参数

    -Xrunjdwp:transport=dt_socket,server=y,address=9090,suspend=y
    
  • 在linux命令行jdb连接9090端口

    jdb -attach ip:9090 -sourcepath /softwares/apache-tomcat-7.0.40-src/java
    
  • 设置断点

    stop at org.apache.tomcat.util.IntrospectionUtils:402
    stop at org.apache.tomcat.util.IntrospectionUtils:406
    stop at org.apache.tomcat.util.IntrospectionUtils:408
    stop at org.apache.tomcat.util.IntrospectionUtils:412 
    
  • 执行程序

    main[1] run
    > Set deferred breakpoint org.apache.tomcat.util.IntrospectionUtils:412
    Set deferred breakpoint org.apache.tomcat.util.IntrospectionUtils:412
    Set deferred breakpoint org.apache.tomcat.util.IntrospectionUtils:408
    Unable to set deferred breakpoint org.apache.tomcat.util.IntrospectionUtils:406 
    
    
    : No code at line 406 in org.apache.tomcat.util.IntrospectionUtils
    
    
    Stopping due to deferred breakpoint errors.
    Set deferred breakpoint org.apache.tomcat.util.IntrospectionUtils:402
    
    
    Breakpoint hit: 
    Breakpoint hit: "thread=main", 
    
    
    org.apache.tomcat.util.IntrospectionUtils.setProperty(), line=412 bci=849
    412                ExceptionUtils.handleThrowable(ie.getCause());
    
  • 打印变量

    main[1] locals
    Method arguments:
    o = instance of x.x.x.JNDIRealm(id=1156) 
    name = "connectionPassword"
    value = "1234"
    invokeSetProperty = true
    Local variables:
    setter = "setConnectionPassword"
    ie = instance of java.lang.reflect.InvocationTargetException(id=1160)
    main[1] dump ie.target 
     ie.target = {
        serialVersionUID: -7034897190745766939
        java.lang.Exception.serialVersionUID: -3387516993124229948
        java.lang.Throwable.serialVersionUID: -3042686055658047285
        java.lang.Throwable.detailMessage: "password decrypt is error!"
        java.lang.Throwable.cause: instance of java.lang.RuntimeException(id=1163)
        java.lang.Throwable.stackTrace: null
    }
    
  • 打印变量dump信息

    main[1] dump ie.target.cause
    ie.target.cause = {
        serialVersionUID: -7034897190745766939
        java.lang.Exception.serialVersionUID: -3387516993124229948
        java.lang.Throwable.serialVersionUID: -3042686055658047285
        java.lang.Throwable.detailMessage: "get content from cyberark error"
        java.lang.Throwable.cause: instance of 
    
    
    javapasswordsdk.exceptions.PSDKException(id=1165)
        java.lang.Throwable.stackTrace: null
    }
    
  • ctrl+c 退出

    main[1]
<think>好的,我现在需要帮助用户解决如何配置和使用JDB进行Java程序的远程调试。首先,我得回顾一下用户提供的引用内容,看看里面有没有相关的信息。 用户提供了四个引用,其中引用[1]、[3]、[4]提到了使用JDB进行远程调试的命令,比如通过SocketAttach连接本地主机的端口8000。引用[3]还特别说明了在无法使用图形化工具的情况下,JDB命令行调试的优势,比如在客户现场通过远程桌面环境使用。引用[2]则介绍了JDB的基本用法,包括编译时需要使用-g参数生成调试信息。 接下来,我需要整理这些信息,分步骤说明如何配置和进行远程调试。首先,用户需要确保目标Java程序在启动时开启了调试参数,通常是-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000。这样程序会监听指定端口,等待调试器连接。然后,用户需要编译带有调试信息的类文件,使用javac -g命令,否则可能无法查看变量等信息。 接下来是连接步骤,使用jdb命令附加到目标进程,命令如jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8000。如果目标程序在远程机器上,需要将hostname改为对应的IP地址,并确保防火墙开放了该端口。 然后可能需要介绍一些基本的JDB命令,比如设置断点、单步执行、查看变量等,帮助用户了解调试过程。此外,注意事项部分需要提醒用户关于防火墙设置、调试模式对性能的影响,以及编译时生成调试信息的重要性。 在生成相关问题的时候,需要考虑用户可能进一步的问题,比如如何设置断点、调试参数的具体含义、与图形化工具的区别,以及生产环境使用JDB的注意事项等。 现在需要确保步骤清晰,语言简洁,符合用户要求的中文回答,并且正确应用引用标注。同时,要检查LaTeX格式是否正确,但根据问题描述,这里可能不需要数学表达式,所以主要关注代码块和引用格式是否正确。</think>### 分步配置和使用JDB进行Java程序远程调试 #### 一、配置目标程序调试模式 1. **启动Java程序时添加调试参数** 在运行目标Java程序时,需添加`-agentlib`参数开启调试监听: ```bash java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000 JDB ``` - `transport=dt_socket`:使用Socket通信 - `server=y`:以服务端模式运行(等待调试器连接) - `suspend=n`:程序启动后不暂停(若需启动即暂停设为`y`) - `address=*:8000`:监听所有IP的8000端口[^3][^4] 2. **编译时生成调试信息** 使用`-g`参数编译Java代码以保留变量和行号信息: ```bash javac -g JDB.java ``` 缺少调试信息会导致无法查看变量或设置精确断点[^2]。 --- #### 二、连接远程调试会话 1. **本地调试连接命令** 若目标程序在本地运行,直接附加JDB调试器: ```bash jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8000 ``` 连接成功后显示`Initializing jdb...`并进入交互提示符`>`[^1][^4]。 2. **远程调试连接命令** 若目标程序在远程服务器(IP为`10.0.0.5`),修改`hostname`参数: ```bash jdb -connect com.sun.jdi.SocketAttach:hostname=10.0.0.5,port=8000 ``` **注意**:确保远程服务器防火墙开放8000端口[^3]。 --- #### 三、基础调试操作示例 1. **设置断点** ```bash > stop at JDB:15 # 在JDB类的第15行设置断点 ``` 2. **恢复执行** ```bash > run # 启动/恢复程序运行 ``` 3. **查看变量值** ```bash > print a # 查看变量a的值 ``` 4. **单步执行** ```bash > step # 进入方法内部 > next # 执行下一行但不进入方法 ``` --- #### 四、注意事项 1. **防火墙配置** 远程调试需确保目标服务器的端口(如8000)在防火墙中开放。 2. **调试模式影响** 生产环境谨慎使用`suspend=y`,否则程序会阻塞直到调试器连接。 3. **调试信息必要性** 编译时缺少`-g`参数可能导致断点无法绑定或变量不可见。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值