云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

轻量服务器_阿里云有什么用_优惠券

小七 141 0

BTrace:DTrace for Java…ish

DTrace在2005年初首次关注Java,这要归功于jarodjenson的早期原型,它最终导致在热点JVM中包含USDT探测。如果你想看看,比如说java.net.SocketOutputStream.write()方法时,您只需运行以下DTrace脚本:热点$target:::方法项/copyinstr(arg1,arg2)="java/net/SocketOutputStream"&;copyinstr(arg3,arg4)="写入"/{jstack(508000);}只要您记住使用-XX:+extendedtraceprobes选项启动JVM,或者事后使用jinfo实用程序来启用它,那么这种方法就可以工作。只要你不介意严重的性能损失(提示:你可能会介意)。灵感来自dtrace.conf几周前,我想勾勒出真正的Java提供者应该是什么样子: 爪哇$目标:java.net.SocketOutputStream:写入:条目{jstack(508000);}d检查一下:# jdtrace.pl版-p$(pgrep java)-n'爪哇$目标:java.net.SocketOutputStream●条目{jstack(508000);}dtrace:脚本'/tmp/jdtrace.19092/jdtrace.d'匹配0个探测CPU ID功能:名称0 64991 Java_com_sun_btrace_btrace运行时_dtraceProbe0:事件libbtrace.so`Java_com_sun_btrace_btrace运行时_dtraceProbe0+0xbbcom/sun/btrace公司/BTraceRuntime.dtraceProbe0(Ljava/lang/String;Ljava/lang/String;II)Icom/sun/btrace公司/BTraceRuntime.dtraceProbe(Ljava/lang/String;Ljava/lang/String;II)Icom/sun/btrace/BTraceUtils$D.probe(Ljava/lang/String;Ljava/lang/String;II)Icom/sun/btrace/BTraceUtils$D.probe(Ljava/lang/String;Ljava/lang/String;)Ijava/net/SocketOutputStream.$btrace$jdtrace$probe1(Ljava/lang/String;Ljava/lang/String;)Vjava/net/SocketOutputStream.write([BII)V太阳/nio/cs/拖缆编码器.writeBytes()V太阳/nio/cs/StreamEncoder.implFlushBuffer()V太阳/nio/cs/StreamEncoder.implFlush()V太阳/nio/cs/拖缆编码器.flush()Vjava/io接口/OutputStreamWriter.flush()Vjava/io接口/BufferedWriter.flush()Vjava/io接口/PrintWriter.newLine()Vjava/io接口/PrintWriter.println()Vjava/io接口/PrintWriter.println(Ljava/lang/String;)Vcom/delphix/appliance/server/ham/impl/HAMonitorServerThread.run()Vjava/util/concurrent/ThreadPoolExecutor$Worker.runTask(Ljava/lang/Runnable;)Vjava/util/concurrent/ThreadPoolExecutor$工人.运行()Vjava/语言/线程运行()V存根例程(1)libjvm.so文件`__1cjjavaCallsCall_helper6FpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread_uv_+0x21dlibjvm.so文件`__1Cosuos_异常_wrapper6fpfNjjavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread_2468_v+0x27libjvm.so文件`__1cJJavaCallsMcall_virtual6FpnJJavaValue_nGHandle_nLKlassHandle_nMsymbolHandle_5pengthread_uv_+0x149libjvm.so文件`__1cMthread_entry6FpnKJavaThread_pnGThread_uv_x113libjvm.so文件`__1cKJavaThreadDrun6M_v_x+0x2c6libjvm.so文件`java_启动+0x1f2libc.so公司.1"thrp_设置+0x9blibc.so公司.1"启动显然有什么可疑的事情发生了。这是perl-bto-race的第一个输出。用BTrace来伪装BTrace是一个针对Java的动态检测工具;它既受DTrace的启发,又包含一些DTrace集成。上面的perl脚本采用DTrace语法并生成DTrace脚本和支持BTrace的Java源文件。与DTrace一样,BTrace允许您指定Java程序中的插入点以及要执行的操作。我们生成的源文件如下所示。进口com.sun.btrace网站.注释。*;导入静态com.sun.btrace网站.BTraceUtils.*;@BTrace公司公共类jdtrace{@OnMethod(clazz="java.net.SocketOutputStream,method="写入",位置=@位置(种类.条目))public static void probe1(@ProbeClassName String c,@ProbeMethodName字符串m){String;字符串p=字符串.strcat(c),字符串.strcat(":",字符串.strcat(米,字符串.strcat(":",名称)));D、 探头(p,"");}}请注意,我们指定了跟踪的位置(这可以是一个正则表达式),然后执行将类、方法和"entry"字符串联接到一个字符串中的操作,该字符串传递给D.probe()方法,该方法会触发BTrace USDT探测。下面是D脚本的外观:btrace$target:::事件{此->;\uujd_arg=copyinstr(arg0);this->;\uujd_mod=strtok(this->;\uuujd_arg,":");this->;\uu jd_func=strtok(空,":");this->;\uu jd_name=strtok(空,":");}btrace$target:::事件/(此->;\uujd_mod=="java.net.SocketOutputStream"&;此->jd_func=="写入"&;此->;\u jd_name=="条目"))/{jstack(508000);}很简单。我们解析传递给D.probe()的字符串,并将其分解为module、function和name的DTrace概念。然后我们使用这些信息,以便适当地执行指定的操作(我们可以指定不同的Java方法进行探测,并为每个方法指定不同的操作)。如果你感兴趣的话,这里是代码。这不是真正的Java提供者,但是它足够接近吗?不幸的是没有。最突出的问题是BTrace有时使我的Java进程没有响应。其他时候,它会把仪器放在后面,无法提取它。"安全"一词在BTrace网站上是第三个词("BTrace是安全的"),但显然,要达到必要的安全水平还有一段路要走。更好的比赛BTrace是检查Java程序的一个有趣的工具,但是一个明显的障碍是程序的编写非常麻烦。使用BTrace,我们应该能够编写一个简单的一行程序,以查看当java.net.SocketOutputStream.write()方法被调用,但我们必须编写一个相当麻烦的程序:进口com.sun.btrace网站.注释。*;导入静态com.sun.btrace网站.BTraceUtils.*;@BTrace公司公共类TraceWrite{@OnMethod(clazz="java.net.SocketOutputStream,method="写入",位置=@位置(种类.条目))公共静态void onWrite(){jstack();}}DTrace启发的语法可以让用户更快地进行迭代:$dbtrace-p$(pgrep-n java)-n'java.net.SocketOutputStream:写入:条目{jstack();}'java.net.SocketOutputStream.写入(SocketOutputStream.java)太阳.nio.cs.拖缆编码器.writeBytes(StreamEncoder.java:202)太阳.nio.cs.StreamEncoder.implFlushBuffer(java流媒体:272)太阳.nio.StreamEncoder.implFlush(StreamEncoder.java:276)太阳.nio.cs.拖缆编码器.flush(StreamEncoder.java:122)java.io.OutputStreamWriter.冲洗(OutputStreamWriter.java:212)java.io.BufferedWriter.冲洗(BufferedWriter.java:236)java.io.PrintWriter.新线(PrintWriter.java:438)java.io.PrintWriter.println公司(PrintWriter.java:585)java.io.PrintWriter.println公司(PrintWriter.java:696)com.delphix.appliance公司.服务器.ham.impl.H.小时AMonitorServerThread.run(小时)AMonitorServerThread.java:56)java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)java.util.concurrent.ThreadPoolExecutor$工人.运行(ThreadPoolExecutor.java:908)java.lang.Thread.运行(线程.java:662)使用BTrace,您可以跟踪有关程序状态的几乎任意信息,但不要执行以下操作:dbtrace-p$(pgrep-n java)-n'java.net.SocketOutputStream:写入:条目{打印字段(这个.impl); }'你必须这样做:进口com.sun.btrace网站.注释。*;进口com.sun.btrace网站.任意类型;导入静态com.sun.btrace网站.BTraceUtils。反光.*;@BTrace公司公共类TraceWrite{@OnMethod(clazz="java.net.SocketOutputStream,method="写入",位置=@位置(种类.条目))公共静态void onWrite(@Self Object Self){Object impl=get(字段(classOf(self),"impl"),self);打印字段(impl);}} $./bin/btrace$(pgrep-n java)跟踪写入.java{server=null,端口=1080,外部地址=null,useV4=false,cmdsock=null,cmdIn=null,cmdOut=null,applicationSetProxy=false,timeout=0,trafficClass=0,shut_rd=false,shutu wr=false,socketInputStream=java.net.SocketInputStream@9993a1,fdUseCount=0,fdLock=java.lang.Object@ab5443,closePending=false,连接\u不重置=0,连接重置挂起=1,连接重置=2,重置状态=0,重置锁定=java.lang.Object@292936,fd1=null,anyLocalBoundAddr=null,lastfd=-1,stream=false,socket=socket[addr=/127.0.0.1,port=38832,localport=8765],serverSocket=null,fd=java.io.FileDescriptor@端口=872.0,端口=127.0.0BTrace需要一种能够实现快速迭代的语言——Java的背负阻碍了它——而且它需要一些硬安全保障。有了这些,许多开发人员和支持工程师将BTrace作为他们日常工作的一部分,我们当然会在Delphix使用BTrace。回到DTrace。即使只有针对Java的可用解决方案,对Java(和其他动态语言)进行轻量级和集中跟踪的能力也是非常有价值的。我们看看BTrace能带我们走多远。