Java应用调试利器——BTrace教程

2023-11-10

http://www.jianshu.com/p/26f19095d396

背景

生产环境中可能出现各种问题,但是这些问题又不是程序error导致的,可能是逻辑性错误,这时候需要获取程序运行时的数据信息,如方法参数、返回值来定位问题,通过传统的增加日志记录的方式非常繁琐,而且需要重启server,代价很大。BTrace应运而生,可以动态地跟踪java运行程序,将跟踪字节码注入到运行类中,对运行代码侵入较小,对性能上的影响可以忽略不计。

配置及用法

  1. 去官网下载BTrace,配置环境变量以便在任何路径下能执行btrace命令。

  2. 命令格式:

    btrace [-p <port>] [-cp <classpath>] <pid> <btrace-script>

port指定BTrace agent的服务端监听端口号,用来监听clients,默认为2020,可选。
classpath用来指定类加载路径,比如你的BTrace代码里用到了netty等第三方jar包。
pid表示进程号,可通过jps命令获取。
btrace-script即为BTrace脚本。
下面是我用来测试的一条btrace命令,大家可以参考一下:

btrace -p 2020 -cp /home/mountain/Softwores/tomcat8/lib/servlet-api.jar (jps | grep Bootstrap | awk '{print $1}') /home/mountain/test/Btrace.java

实战

  1. 获取方法参数以及返回值

    业务代码:

    public String sayHello(String name, int age) {
       return "hello everyone";
    }

    BTrace代码:

    import com.sun.btrace.BTraceUtils;
    import static com.sun.btrace.BTraceUtils.*;
    import com.sun.btrace.annotations.*;
    
    @BTrace
    public class Btrace {
    
       @OnMethod(
           clazz = "com.jiuyan.message.controller.AdminController",
           method = "sayHello",
           location = @Location(Kind.RETURN)//函数返回的时候执行,如果不填,则在函数开始的时候执行
       )
       public static void sayHello(String name, int age, @Return String result) {
           println("name: " + name);
           println("age: " + age);
           println(result);
       }
    
    }

    调用sayHello('mountain', 1),输出应该是:

    name: mountain
    age: 1
    hello everyone

    可以对字符串进行正则匹配以达到监控特定问题的目的:

    if(BTraceUtils.matches(".*345.*", str)) {
        println(str);
    }
  2. 计算方法运行消耗的时间

    BTrace代码:

    import java.util.Date;
    
    import com.sun.btrace.BTraceUtils;
    import static com.sun.btrace.BTraceUtils.*;
    import com.sun.btrace.annotations.*;
    
    @BTrace
    public class Btrace {
    
       @OnMethod(
           clazz = "com.jiuyan.message.controller.AdminController",
           method = "sayHello",
           location = @Location(Kind.RETURN)
       )
       public static void sayHello(@Duration long duration) {//单位是纳秒,要转为毫秒
           println(strcat("duration(ms): ", str(duration / 1000000)));
       }
    
    }

 

https://www.cnblogs.com/zengkefu/p/5720854.html

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java应用调试利器——BTrace教程 的相关文章

  • gin context和官方context_Go语言gin框架从入门到精通(3)

    gin的渲染 1 各种数据格式的响应 json 结构体 XML YAML类似于java的properties ProtoBuf 分别对所有数据格式举个列子 func main r gin Default 1 json响应 r GET som
  • linux 网络协议栈栈 socket

    1 应用层socket类型 2
  • 7个视频素材网站,不用再为素材发愁

    1 pond5 https www pond5 com 全球最大的开放版权视频合集 不仅有视频 还有音乐 动态图片 用这些世界级的好素材 让你的视频如虎添翼 2 splashbase http www splashbase co 在这里搜索
  • 别让不好意思害了你

    有些事情是不能告诉别人的 有些事情是不必告诉别人的 有些事情是根本没有办法告诉别人的 而且有些事情是 即使告诉了别人 你也马上会后悔的 所以 假使你够聪明 那么 最后的办法就是静下来 啃啮自己的寂寞 或者反过来说 让寂寞来吞噬你 罗曼 罗兰
  • Django 应用 -- 发送邮件

    出现以上错误 是没有设置参数DJANGO SETTINGS MODULE os environ setdefault DJANGO SETTINGS MODULE emailclient settings Email 配置 emailcli
  • C语言——结构体类型数据在内存中存储

    结构体类型在内存中的存储 一 结构体对齐 二 结构体变量在内存储存练习 一 结构体对齐 要讲到结构体类型数据在内存中的存储 首先我们先来看看一自定义结构体类型数据 struct S char ch short a int i 它在内存中到底
  • Vue3+移动端适配屏幕+默认横屏展示

    效果图展示区 1 想要把px自动转换单位为vw需要项目根目录 postcssrc js中进行配置以下代码 module exports plugins autoprefixer 用来给不同的浏览器自动添加相应前缀 如 webkit moz
  • 使用replace(/.[\d]{3}Z/, ‘‘)报错 Replace this character class by the character itself.

    这个警告信息是由 ESLint 生成的 通常是在正则表达式中使用字符类而引起的 在你的代码中 使用了 d 3 Z 的正则表达式 它的作用是用空字符串替换掉字符串中的 Z 格式的子串 然而 由于字符类 中包含了只有一个字符的元素 ESLint
  • 华为OD机试 - 查找单入口空闲区域

    题目描述 给定一个 m x n 的矩阵 由若干字符 X 和 O 构成 X 表示该处已被占据 O 表示该处空闲 请找到最大的单入口空闲区域 解释 空闲区域是由连通的 O 组成的区域 位于边界的 O 可以构成入口 单入口空闲区域即有且只有一个位
  • Failed to create the java virtual machine解决办法

    1 原因 JAVA虚拟机报错 计算机的内存不足所致 还有一种说法是你的eclipse版本和虚拟机不兼容 2 解决方法 找到eclipse安装目录下的eclipse ini配置文件 打开 startup vm D Java jre6 bin
  • No module named 'tensorflow.contrib

    No module named tensorflow contrib 错误原因 解决方法 错误原因 这个错误可能是由 from tensorflow contrib learn python learn datasets import ba
  • 网络基础之网络层协议介绍(ping命令和ARP协议)

    文章目录 一 IP数据包格式 IP字段 二 ICMP协议 1 ICMP协议 Internet控制消息协议 2 ICMP协议的封装 3 ICMP的基本使用 Ping 4 跟踪路由路径命令 三 ARP协议 1 广播和广播域 2 ARP协议概述
  • stylecop4.0下载地址

    http soft city366 com version480 aspx
  • redis哨兵主从不切换_别找了!Redis主从模式和哨兵模式,这篇看完就足够了

    1 概述 一般的文档 都把redis的集群方式分成三种 主从 哨兵 集群 这里的集群只是广义集群的一种 但是这么分类很不严谨 哨兵模式 单独使用是没有意义的 哨兵的作用有两个 监控 监控主节点和从节点是否正常运行 提醒 当被监控的某个Red
  • Callable和Future原理解析

    首先进行分析前 我们需要了解到的概念 Callable是一个接口 是用于创建线程执行里面有一个call方法 用于线程执行的内容 由业务自己定义 Future也是一个接口 可以异步的通过get方法获取到call返回的内容 比较常见的使用场景
  • java如何声明公众类_类#是公共的,应在名为#.java的文件中声明

    classComplex privateintrealPart privateintimaginPart Complex this realPart 0 this imaginPart 0 Complex intrealPart intim
  • jdk-8u162 java安装

    linux下java环境配置 参照如下文章安装jdk https blog csdn net daerzei article details 80136457 1 上传jdk 8u162 文件 然后执行如下命令进行安装 安装完成之后设定环境
  • 边玩边学,15个学习Python 的编程游戏网站

    经常听到有朋友说 学习编程是一件非常枯燥无味的事情 其实 大家有没有认真想过 可能是我们的学习方法不对 比方说 你有没有想过 可以通过打游戏来学编程 今天我想跟大家分享几个网站 教你如何通过边打游戏边学编程 1 Coding Games 一
  • 力扣 289. 生命游戏

    虽然难度是中等但其实很简单 遍历矩阵判断每个点是死是活就可以了 进阶要求使用原地算法 即空间复杂度为O 1 所以我们不能简单的记录1是活 0是死 我规定 1 原来活 活变活 0 原来死 死变死 2 死变活 1 活变死 自己的 0ms cla

随机推荐

  • Windows Server 2012 R2 -DNS服务器安装与测试(VMware workstation环境)

    Windows Server 2012 R2 DNS服务器安装与测试 VMware workstation环境 搭建拓扑如下 DNS后缀名设置 DNS服务器 虚拟机 IP设置 DNS指向自己 物理机net8虚拟网卡IP设置 DNS指向DNS
  • Vivado 2018.3 安装步骤及 license 获取

    本文的主要内容是介绍 Vivado 2018 3 版本的安装步骤及其 license 的获取与加载 首先下载安装包 将其在没有中文的路径下解压 注意在解压前最好关闭电脑的杀毒软件 防止某些文件被拦截或者删除 解压完成后打开文件夹 在最底部双
  • Java多线程-并行处理以及事务控制

    1 为了提高我们接口的响应速度 我们可以开多个线程 并行处理 比如我们要大批量写入数据到数据库 Autowired private ThreadPoolExecutor executor Autowired private Platform
  • 六. HTTPS确保Web安全

    六 HTTPS确保Web安全 1 HTTP的缺点 通信使用明文 内容可能会被盗取 互连网中使用TCP IP协议族进行通信的过程中会经过非常多的通信载体 网关 路由器等 而这些主机并不可能完全是私人的 所以可能某个环节遭到恶意窥视 抓包 当然
  • Android 整合高德地图SDK实现 地图预览,定位,模拟导航

    一 准备工作 1 到高德地图官方网申请key 我的应用 高德控制台 2 申请key方法请参考 获取Key 创建工程 开发指南 Android 地图SDK 高德地图API 3 出现的问题 其中有一个获取SHA1的问题 E AmapErr 定位
  • Tracker 服务器地址大全 Tracker List

    https dns icoa cn tracker udp tracker tiny vps com 6969 announce https 1337 abcvg info announce https tracker fastdownlo
  • 【Linux系统编程(二)】Linux文件IO操作

    文章目录 Linux文件IO操作 1 系统调用 2 系统调用和库函数的区别 3 C库中IO函数工作流程 4 文件描述符 4 1 文件描述符表是如何管理文件描述符的呢 4 2 查看当前系统文件描述最大数量 5 文件IO的操作 5 1 open
  • 关于split(String agrex)

    split a b c 得到 a b c a b c 得到 a b c 前面的空格一个都不会省略 a b c 得到 a b c 中间空格省略一个 后缀的空格全部省略 不是以空格而是以某个String为划分依据时 现象相同 split a a
  • 2021-06-22安装docker-ce

    安装docker ce Docker 支持以下的 64 位 CentOS 版本 CentOS 7 CentOS 8 更高版本 使用官方安装脚本自动安装 安装命令如下 curl fsSL https get docker com bash s
  • VUE问题汇总(一)

    vue的起步教程与api https cn vuejs org v2 guide vue组件库 https element eleme cn zh CN component installation 1 解决vue中时间控件中获取时间少一天
  • 前端三大框架(vue、react、angular)对比(一)

    官网 vue https cn vuejs org react https react docschina org angular https angular cn 三者总体介绍 都是MVVM 从后端的MVC衍生 类型的框架 基本都用于构建
  • 时序数据库timescaleDB安装

    参考链接 时序数据库timescaleDB安装 http www lwops cn thread 300 1 1 html 本环境在Centos7 5采用编译安装的方式 主要介绍PostgreSQL 11 7 TimescaleDB 1 6
  • 机器学习理论笔记(一):初识机器学习

    文章目录 1 前言 蓝色是天的机器学习笔记专栏 1 1 专栏初衷与定位 1 2 本文主要内容 2 机器学习的定义 2 1 机器学习的本质 2 2 机器学习的分类 3 机器学习的基本术语 4 探索 没有免费的午餐 定理 NFL 5 结语 1
  • tkinter控件样式

    文章目录 以按钮为例 共有参数 动态属性 tkinter系列 GUI初步 布局 绑定变量 绑定事件 消息框 文件对话框 控件样式 扫雷小游戏 强行表白神器 以按钮为例 tkinter对控件的诸多属性提供了可定制的功能 下面以最常用的按钮作为
  • 学习 Spring Boot:(二十九)Spring Boot Junit 单元测试

    前言 JUnit 是一个回归测试框架 被开发者用于实施对应用程序的单元测试 加快程序编制速度 同时提高编码的质量 JUnit 测试框架具有以下重要特性 测试工具 测试套件 测试运行器 测试分类 了解 Junit 基础方法 加入依赖 在 po
  • Eclipse中的checkstyle插件

    一 Checkstyle工具 Checkstyle是一款检查Java程序源代码样式的工具 它可以有效的帮助我们检视代码以便更好的遵循代码编写标准 官方地址 http checkstyle sourceforge net 二 在Eclipse
  • PPT模板

    http www officeplus cn List shtml cat PPT tag 1
  • CH3-Android常见界面控件

    目标 掌握简单控件的使用 能够独立搭建一个注册界面 掌握ListView控件与RecyclerView控件的使用 能独立搭建列表界面 掌握自定义控件的定义方式 能够自定义一个简单的控件 几乎每一个Android应用都是通过界面控件与用户交互
  • Linux--多线程(1)

    目录 一 概念 二 理解 三 创建 退出 合并进程 man pthread create Compile and link with pthread 1 为什么没有fun函数 2 加上sleep来改进 3 线程结束会不会影响主线程运行 4
  • Java应用调试利器——BTrace教程

    http www jianshu com p 26f19095d396 背景 生产环境中可能出现各种问题 但是这些问题又不是程序error导致的 可能是逻辑性错误 这时候需要获取程序运行时的数据信息 如方法参数 返回值来定位问题 通过传统的