sách gpt4 ăn đã đi

Công cụ chẩn đoán quy trình java trực tuyến của Arthas giải thích chi tiết về tạo tác gỡ lỗi trực tuyến

In lại Tác giả: qq735679552 Thời gian cập nhật: 28-09-2022 22:32:09 42 4
mua khóa gpt4 giày nike

CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.

Bài viết blog CFSDN này Công cụ chẩn đoán quy trình Java trực tuyến Arthas Giải thích chi tiết về tạo tác gỡ lỗi trực tuyến được tác giả sưu tầm và biên soạn. Nếu bạn quan tâm đến bài viết này, hãy nhớ thích nó.

`Arthas` là công cụ chẩn đoán Java mã nguồn mở của Alibaba, được các nhà phát triển rất ưa chuộng.

Khi bạn gặp phải những vấn đề tương tự sau và đang bối rối, `Arthas` có thể giúp bạn giải quyết:

1. Lớp jar này được tải từ gói jar nào? Tại sao có nhiều loại Ngoại lệ khác nhau được báo cáo?

2. Tại sao mã tôi thay đổi không được thực thi? Có thể là tôi đã không cam kết? Nhánh sai?

3. Nếu gặp sự cố và không thể gỡ lỗi trực tuyến, bạn chỉ có thể thêm nhật ký và phát hành lại được không?

4. Xảy ra sự cố khi xử lý dữ liệu trực tuyến của người dùng, nhưng không thể sửa lỗi trực tuyến và không thể sao chép ngoại tuyến! .

5. Có góc nhìn toàn cầu nào để xem xét tình trạng của hệ thống không?

6. Có cách nào để theo dõi trạng thái chạy thời gian thực của JVM không?

7. Làm cách nào để nhanh chóng xác định vị trí các điểm nóng của ứng dụng và tạo biểu đồ ngọn lửa?

8. Làm cách nào để tìm một thể hiện của một lớp trực tiếp từ JVM?

`Arthas` hỗ trợ JDK 6+, hỗ trợ Linux/Mac/Windows, áp dụng chế độ tương tác dòng lệnh và cung cấp các chức năng tự động hoàn thành `Tab` phong phú để tạo điều kiện thuận lợi hơn cho việc xác định và chẩn đoán sự cố.

tag: ngăn xếp chẩn đoán java gỡ lỗi trực tuyến bế tắc tốn thời gian arthas Alibaba.

Arthas (Alsace).

Công cụ chẩn đoán quy trình java trực tuyến của Arthas giải thích chi tiết về tạo tác gỡ lỗi trực tuyến

Arthas là công cụ chẩn đoán Java mã nguồn mở của Alibaba, được các nhà phát triển rất ưa chuộng.

Tài liệu trang web chính thức: https://arthas.aliyun.com/doc/.

Khi bạn gặp phải những vấn đề tương tự như sau và không biết phải làm gì, Arthas có thể giúp bạn giải quyết chúng:

Lớp jar này được tải từ gói jar nào? Tại sao có nhiều loại Ngoại lệ khác nhau được báo cáo? Tại sao mã tôi đã thay đổi không được thực thi? Có thể là tôi đã không cam kết? Nhánh sai? Nếu gặp sự cố và không thể gỡ lỗi trực tuyến, bạn chỉ có thể thêm nhật ký và phát hành lại được không? Đã xảy ra sự cố khi xử lý dữ liệu trực tuyến của người dùng nhưng không thể sửa lỗi trực tuyến và không thể sao chép ngoại tuyến! Có cái nhìn toàn diện về cách hệ thống đang hoạt động không? Có cách nào để theo dõi trạng thái chạy thời gian thực của JVM không? Làm cách nào để nhanh chóng xác định vị trí các điểm nóng của ứng dụng và tạo biểu đồ ngọn lửa? Làm cách nào để tìm một thể hiện của một lớp trực tiếp từ JVM?

Arthas hỗ trợ JDK 6+, hỗ trợ Linux/Mac/Windows, áp dụng chế độ tương tác dòng lệnh và cung cấp các chức năng tự động hoàn thành Tab phong phú để tạo điều kiện thuận lợi hơn cho việc xác định và chẩn đoán sự cố.

  。

Cài đặt

  。

Cài đặt nhanh

1.1.1 Sử dụng arthas-boot (được khuyến nghị)

Tải xuống arthas-boot.jar, sau đó khởi động nó bằng java -jar:

cuộn tròn -O https://arthas.aliyun.com/arthas-boot.jarjava -jar arthas-boot.jar

In thông tin trợ giúp:

java -jar arthas-boot.jar -h 。

Nếu tốc độ tải xuống chậm, bạn có thể sử dụng gương của aliyun:

java -jar arthas-boot.jar --repo-mirror aliyun --use-http 。

Cài đặt bằng phương pháp as.sh.

Arthas hỗ trợ cài đặt bằng một cú nhấp chuột trên Linux/Unix/Mac và các nền tảng khác. Vui lòng sao chép nội dung sau, dán vào dòng lệnh và nhấn Enter để thực thi:

curl -L https://arthas.aliyun.com/install.sh | sh 。

Lệnh trên sẽ tải tập lệnh khởi động as.sh về thư mục hiện tại. Bạn có thể đặt nó ở bất cứ đâu hoặc thêm nó vào $PATH.

Thực thi ./as.sh ngay dưới shell và bạn sẽ vào giao diện tương tác.

Bạn cũng có thể thực thi ./as.sh -h để có thêm thông tin tham số.

Cài đặt đầy đủ (môi trường trực tuyến không cần truy cập mạng bên ngoài).

# java -jar arthas-boot.jar [INFO] phiên bản arthas-boot: 3.5.3 [INFO] Đã tìm thấy tiến trình java hiện có, vui lòng chọn một tiến trình và nhập số sê-ri của tiến trình, ví dụ: 1. Sau đó nhấn ENTER. * [1]: 24438 org.elasticsearch.bootstrap.Elasticsearch 1 [ERROR] Không thể đọc phiên bản arthas từ: https://arthas.aliyun.com/api/latest_version [ERROR] Không tìm thấy Arthas trong thư mục cục bộ: /root/.arthas/lib và bản sao lưu kho lưu trữ từ xa: aliyun [ERROR] Không thể tải xuống arthas từ máy chủ từ xa, vui lòng tải xuống gói đầy đủ theo wiki: https://github.com/alibaba/arthas 。

Khi sử dụng phương pháp cài đặt nhanh để kết nối với các dịch vụ Java trong môi trường trực tuyến, rất có thể Arthas không lấy được các gói jar như arthas-core và không thể chạy do môi trường trực tuyến không có quyền truy cập vào mạng bên ngoài.

Lúc này, bạn cần cài đặt đầy đủ gói Arthas.

Phương pháp cài đặt: (kích thước gói 13MB).

#### 获取 arthas 全量包curl -Lo arthas-packaging-latest-bin.zip 'https://arthas.aliyun.com/download/latest_version?mirror=aliyun'unzip -d arthas-latest-bin arthas-packaging-latest-bin.zip#### 开始运行java -jar ahthas-boot.jar[INFO] arthas-boot version: 3.5.4[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.* [1]: 27878 /data/tsf/tsf-oss/tsf-ratelimit/tsf-ratelimit-1.29.1/lib/tsf-ratelimit-1.29.1.jar1[INFO] arthas home: /root[INFO] Try to attach process 27878[INFO] Attach process 27878 success.[INFO] arthas-client connect 127.0.0.1 3658,---. ,------. ,--------.,--. ,--. ,---. ,---. / O \ | .--. ''--. .--'| '--' | / O \ ' .-' | .-. || '--'.' | | | .--. || .-. |`. `-. | | | || |\ \ | | | | | || | | |.-' |`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----' wiki https://arthas.aliyun.com/doctutorials https://arthas.aliyun.com/doc/arthas-tutorials.htmlversion 3.5.4main_classpid 27878time 2021-09-07 19:31:47

通过 rpm/deb 来安装 。

这部分见官方文档. 。

  。

快速入门

arthas 需要使用到 jps 命令,所以要保证 openjdk-devel 包已经安装.

jps || yum -y install java-1.8.0-openjdk-devel 。

运行 arthas:

# java -jar arthas-boot.jar [INFO] arthas-boot version: 3.5.3 [INFO] Process 5201 already using port 3658 [INFO] Process 5201 already using port 8563 [INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER. * [1]: 5201 cloud-access-auth-1.18.1.jar [2]: 14419 tsf-stack-base-1.0.0.jar [3]: 27862 cloud-access-gateway-1.18.1.jar [4]: 6550 tsfmanager-operation-1.29.1.jar 。

提示1:当 arthas 给出的进程列表不能确定进程信息的时候,我们可以通过在命令行输入jps -lmv 查看详细的 java 进程信息,来确定我们要查看的 java 进程号.

提示2:当提示如下信息时:

Arthas script version: 3.0.4 Calculating attach execution time... Attaching to 24110 using version 3.0.4... Start arthas failed, exception stack trace: java.lang.InternalError: instrument library is missing in target VM at sun.tools.attach.HotSpotVirtualMachine.loadAgent(HotSpotVirtualMachine.java:105) at com.taobao.arthas.core.Arthas.attachAgent(Arthas.java:84) at com.taobao.arthas.core.Arthas.(Arthas.java:25) at com.taobao.arthas.core.Arthas.main(Arthas.java:96) Caused by: com.sun.tools.attach.AgentLoadException: Failed to load agent library at sun.tools.attach.LinuxVirtualMachine.execute(LinuxVirtualMachine.java:224) at sun.tools.attach.HotSpotVirtualMachine.loadAgentLibrary(HotSpotVirtualMachine.java:58) at sun.tools.attach.HotSpotVirtualMachine.loadAgentLibrary(HotSpotVirtualMachine.java:79) at sun.tools.attach.HotSpotVirtualMachine.loadAgent(HotSpotVirtualMachine.java:103) ... 3 more attach to target jvm (24110) failed, check /root/logs/arthas/arthas.log or stderr of target jvm for any exceptions. 。

我们需要重新启动一下该进程,然后再运行 arthas ,连接到后台 java 进程即可.

下面的 java 进程编号即当前主机已经运行的 java 服务,输入编号即可进入 arthas 的交互式界面.

[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.* [1]: 5201 cloud-access-auth-1.18.1.jar[2]: 14419 tsf-stack-base-1.0.0.jar[3]: 27862 cloud-access-gateway-1.18.1.jar[4]: 6550 tsfmanager-operation-1.29.1.jar1[INFO] local lastest version: 3.5.3, remote lastest version: 3.5.4, try to download from remote.[INFO] Start download arthas from remote server: https://arthas.aliyun.com/download/3.5.4?mirror=aliyun[INFO] Download arthas success.[INFO] arthas home: /root/.arthas/lib/3.5.4/arthas[INFO] The target process already listen port 3658, skip attach.[INFO] arthas-client connect 127.0.0.1 3658,---. ,------. ,--------.,--. ,--. ,---. ,---. / O \ | .--. ''--. .--'| '--' | / O \ ' .-' | .-. || '--'.' | | | .--. || .-. |`. `-. | | | || |\ \ | | | | | || | | |.-' |`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----' wiki https://arthas.aliyun.com/doctutorials https://arthas.aliyun.com/doc/arthas-tutorials.htmlversion 3.5.3main_classpid 5201time 2021-09-03 09:55:42[arthas@5201]$

当出现上述彩条 ARTHAS 字符提示的时候,就表示已经正常连接到指定的 Java 进程,随即进入到下面的 arthas@PID 命令提示符.

  。

功能使用

dashboard 指令 -- 总览JVM信息 。

在 arthas 命令提示符下键入dashboard 回车,会展示当前进程的信息,按q 退出.

dashboard 会实时输出该java进程的JVM信息,包括线程、进程、内存、堆栈、以及当前系统运行时信息.

[arthas@5201]$ dashboard -hUSAGE: dashboard [-h] [-i ] [-n ]SUMMARY: Overview of target jvm's thread, memory, gc, vm, tomcat info. EXAMPLES: dashboard dashboard -n 10 dashboard -i 2000 WIKI: https://arthas.aliyun.com/doc/dashboardOPTIONS: -h, --help this help-i, --interval  The interval (in ms) between two executions, default is 5000 ms.-n, --number-of-execution  The number of times this command will be executed.

help 指令

该指令用以列出所有 arthas 交互式界面支持的 子命令 列表.

[arthas@5201]$ helpNAME DESCRIPTIONhelp Display Arthas Helpauth Authenticates the current sessionkeymap Display all the available keymap for the specified connection.sc Search all the classes loaded by JVMsm Search the method of classes loaded by JVMclassloader Show classloader infojad Decompile classgetstatic Show the static field of a classmonitor Monitor method execution statistics, e.g. total/success/failure count, average rt, fail rate, etc.stack Display the stack trace for the specified class and methodthread Display thread info, thread stacktrace Trace the execution time of specified method invocation.watch Display the input/output parameter, return object, and thrown exception of specified method invocationtt Time Tunneljvm Display the target JVM informationperfcounter Display the perf counter information.ognl Execute ognl expression.mc Memory compiler, compiles java files into bytecode and class files in memory.redefine Redefine classes. @see Instrumentation#redefineClasses(ClassDefinition...)retransform Retransform classes. @see Instrumentation#retransformClasses(Class...)dashboard Overview of target jvm's thread, memory, gc, vm, tomcat info.dump Dump class byte array from JVMheapdump Heap dumpoptions View and change various Arthas optionscls Clear the screenreset Reset all the enhanced classesversion Display Arthas versionsession Display current session informationsysprop Display, and change the system properties.sysenv Display the system env.vmoption Display, and update the vm diagnostic options.logger Print logger info, and update the logger levelhistory Display command historycat Concatenate and print filesbase64 Encode and decode using Base64 representationecho write arguments to the standard outputpwd Return working directory namembean Display the mbean informationgrep grep command for pipes.tee tee command for pipes.profiler Async Profiler. https://github.com/jvm-profiling-tools/async-profilervmtool jvm toolstop Stop/Shutdown Arthas server and exit the console.

每个子命令,都可以跟上 -h 来进一步获取帮助用法信息.

thread 指令

[arthas@5201]$ thread -hUSAGE: thread [--all] [-h] [-b] [--lockedMonitors] [--lockedSynchronizers] [-i ] [--state ] [-n ] [id]TÓM TẮT: Hiển thị thông tin luồng, ngăn xếp luồng VÍ DỤ: luồng luồng 51 luồng -n -1 luồng -n 5 luồng -b luồng -i 2000 luồng --state WIKI BỊ CHẶN: https://arthas.aliyun.com/doc/threadOPTIONS: --all Hiển thị tất cả kết quả của luồng thay vì trang đầu tiên-h, --help trợ giúp này-b, --include-blocking-thread Tìm luồng đang giữ khóa chặn nhiều luồng nhất. --lockedMonitors Tìm thông tin luồng có cờ lockedMonitors, giá trị mặc định là false. --lockedSynchronizers Tìm thông tin luồng với cờ lockedSynchronizers, giá trị mặc định là false.-i, --sample-interval  Chỉ định khoảng thời gian lấy mẫu (tính bằng ms) khi tính toán mức sử dụng CPU. --state  Hiển thị bộ lọc thead theo trạng thái. NEW, RUNNABLE, TIMED_WAITING, WAITING, BLOCKED, TERMINATED là tùy chọn.-n, --top-n-threads  Số luồng cần hiển thị, được sắp xếp theo mức sử dụng CPU, -1 để hiển thị tất cả. Hiển thị ngăn xếp luồng
$ thread -i 5000## Lấy dữ liệu tóm tắt tính toán với khoảng thời gian 5 giây $ thread -n 3## Sắp xếp theo mức sử dụng CPU và lấy thông tin ngăn xếp của 3 luồng từ cao đến thấp $ thread -b## View chỉ các chủ đề bế tắc Thông tin ngăn xếp $ thread --lockedSynchronizers## Chỉ xem thông tin ngăn xếp chủ đề của bế tắc đồng bộ hóa

dừng / thoát dừng và rời đi

stop: Dừng và thoát Arthas consol, thoát bước bình thường.

exit: Chỉ thoát khỏi bảng điều khiển Arthas, nhưng tác vụ arthas được liên kết với quy trình Java không thoát.

[SHELL]# java -jar arthas-boot.jar[INFO] phiên bản arthas-boot: 3.5.3[INFO] Đã tìm thấy quy trình java hiện có, vui lòng chọn một quy trình và nhập số sê-ri của quy trình, ví dụ: 1. Sau đó nhấn ENTER.* [1]: 5201 cloud-access-auth-1.18.1.jar[2]: 14419 tsf-stack-base-1.0.0.jar[3]: 27862 cloud-access-gateway-1.18.1.jar[4]: 6550 tsfmanager-operation-1.29.1.jar1[INFO] trang chủ arthas: /root/.arthas/lib/3.5.4/arthas[INFO] Thử đính kèm quy trình 5201[INFO] Đính kèm quy trình 5201 thành công.[INFO] arthas-client connect 127.0.0.1 3658,---. ,------. ,-------.,--. ,--. ,---. ,---. / O\ | .--. ''--. .--'| '--' | / O\' .-' | .-. || '--'.' | | | .--. || .-. |`. `-. | | | || |\ \ | | | | | || | | |.-' |`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----' wiki https://arthas.aliyun.com/doctutorials https://arthas.aliyun.com/doc/arthas-tutorials.htmlversion 3.5.4main_classpid 5201time 2021-09-03 13:05:51[arthas@5201]$ exit[SHELL]# java -jar arthas-boot.jar[INFO] phiên bản arthas-boot: 3.5.3[INFO] Quá trình 5201 đã sử dụng cổng 3658 ## 由于上次并没有 tắt máy 5201 进程上面的。[THÔNG TIN] Quy trình 5201 đã sử dụng cổng 8563[INFO] Đã tìm thấy quy trình java hiện có, vui lòng chọn một quy trình và nhập số sê-ri của quy trình, ví dụ: 1. Sau đó nhấn ENTER.* [1]: 5201 cloud-access-auth-1.18.1.jar[2]: 14419 tsf-stack-base-1.0.0.jar[3]: 27862 cloud-access-gateway-1.18.1.jar[4]: 6550 tsfmanager-hoạt động-1.29.1.jar

Chúng tôi đã xác nhận điều này bằng jstack -l 5201.

[ root@VM-0-4-cents ~]# jstack -l 5201 | thêm2021-09-03 13:08:16Kết xuất toàn bộ luồng OpenJDK 64-Bit Server VM (25.302-b08 chế độ hỗn hợp):"arthas-NettyHttpTelnetBootstrap-3-3" #169 daemon prio=5 os_prio=0 time=0x00007f314000b800 cần = 0x5632 có thể chạy được [ 0x00007f30cb51a000 ] java . Trạng thái chủ đề : RUNNABLE at sun . EPollArrayWrapper ( Phương thức gốc ) tại sun . 9 ) tại sun . nio ch . EPollSelectorImpl . doSelect ( EPollSelectorImpl . java : 93 ) tại nio . SelectorImpl . com.alibaba.arthas.deps.io.netty.channel.nio.SelectedSelectionKeySet) - đã khóa <0x00000000e8caf8a8>(a java.util.Collections$UnmodibilitySet) - đã khóa <0x00000000e8caf790>(a sun.nio.ch.EPollSelectorImpl); tại sun .ch . SelectorImpl . chọn ( Selector Impl . java : 97 ) tại sun ch . kênh.nio .SelectedSelectionKeySetSelector chọn ( SelectedSelectionKeySetSelector . java : 68 ) . tại com . java : 457 ) tại com .java : 74 ) tại com .NettyHttpTelnetBootstrap-3-2" #168 daemon prio = 5 os_prio = 0 time = 0x00007f314000a000 need = 0x51ce runnable [ 0x00007f30d09f9000] java . Trạng thái chủ đề : RUNNABLE at sun ch . Sun Poll. ; - bị khóa <0x00000000e8cac058>(a com.alibaba.arthas.deps.io.netty.channel.nio.SelectedSelectionKeySet) - đã khóa <0x00000000e8cabe00>(a java.util.Collections$UnmodibilitySet) - đã khóa < 0x00000000e8cabce8 > ( at sun . nio . ch . EPollSelectorImpl ) tại sun . SelectorImpl . chọn ( SelectorImpl . java : 97 ) tại nio . com.alibaba.arthas.deps.io.netty.channel.nio.SelectedSelectionKeySetSelector.select(SelectedSelectionKeySetSelector.java:68);

Chúng ta có thể xem thông tin ngăn xếp java của quy trình 5201 và các luồng arthas đang chạy.

Các bước thoát thông thường:

[arthas@5201]$ stopResetting all advanced classes ...Affect(class count: 0 , method count: 0) cost in 0 ms, listenerId: 0Arthas Server sắp tắt...[arthas@5201]$ session (f0151617-7fd2-4b4b-b79f-31d366a72fc5) đã đóng vì máy chủ sắp tắt.[SHELL]# jstack -l 5201 | more2021-09-03 13:10:16Bản dump toàn bộ luồng OpenJDK 64-Bit Server VM (chế độ hỗn hợp 25.302-b08):"Luồng dọn dẹp kết nối bị bỏ rơi" #51 daemon prio=5 os_prio=0 tid=0x00007f30e0246000 nid=0x1d86 trong Object.wait() [0x00007f3120393000] java.lang.Thread.State: TIMED_WAITING (trên màn hình đối tượng) tại java.lang.Object.wait(Phương thức gốc) tại java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144) - đã khóa <0x00000000e3280300> (một java.lang.ref.ReferenceQueue$Lock) tại com.mysql.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:64) tại java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) tại java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) tại java.lang.Thread.run(Thread.java:748) Bộ đồng bộ hóa có thể sở hữu đã khóa: - <0x00000000e3280390> (a java.util.concurrent.ThreadPoolExecutor$Worker)"Tomcat JDBC Pool Cleaner[1450495309:1630634377161]" #50 daemon prio=5 os_prio=0 tid=0x00007f30e01e4800 nid=0x1d85 trong Object.wait() [0x00007f3120494000] java.lang.Thread.State: TIMED_WAITING (trên màn hình đối tượng) tại java.lang.Object.wait(Native Method) tại java.util.TimerThread.mainLoop(Timer.java:552) - đã khóa <0x00000000e3280540> (java.util.TaskQueue) tại java.util.TimerThread.run(Timer.java:505) Bộ đồng bộ hóa có thể sở hữu bị khóa: - Không có

Có thể thấy, sau khi sử dụng lệnh stop để đóng chương trình chẩn đoán arthas, liên kết thread arthas trên tiến trình java cũng thoát ra.

lệnh xem ⭐ -- Phương pháp thực hiện quan sát dữ liệu

Lệnh watch là một trong những lệnh được sử dụng phổ biến nhất trong Arthas. Nó có thể lấy các tham số đầu vào của gói, lớp và phương thức được chỉ định, các đối tượng bên trong của thân phương thức lớp của chính nó và giá trị đối tượng trả về.

[arthas@5201]$ watch -hUSAGE: watch [-b] [-e] [--exclude-class-pattern ] [-x ] [-f] [-h] [-n ] [--listenerId ] [-E] [-M ] [-s] [-v] class-pattern method-pattern [express] [condition-express]SUMMARY: Display the input/output parameter, return object, and thrown exception of specified method invocation The express may be one of the following expression (evaluated dynamically): target : the object clazz : the object's class method : the constructor or method params : the parameters array of method params[0..n] : the element of parameters array returnObj : the returned object of method throwExp : the throw exception of method isReturn : the method ended by return isThrow : the method ended by throwing exception #cost : the execution time in ms of method invocationExamples: watch org.apache.commons.lang.StringUtils isBlank watch org.apache.commons.lang.StringUtils isBlank '{params, target, returnObj, throwExp}' -x 2 watch *StringUtils isBlank params[0] params[0].length==1 watch *StringUtils isBlank params '#cost>100' watch -f *StringUtils isBlank params watch *StringUtils isBlank params[0] watch -E -b org\.apache\.commons\.lang\.StringUtils isBlank params[0] watch javax.servlet.Filter * --exclude-class-pattern com.demo.TestFilter WIKI: https://arthas.aliyun.com/doc/watchOPTIONS: -b, --before Watch before invocation-e, --exception Watch after throw exception --exclude-class-pattern  exclude class name pattern, use either '.' or '/' as separator-x, --expand  Expand level of object (1 by default)-f, --finish Watch after invocation, enable by default-h, --help this help-n, --limits  Threshold of execution times --listenerId  The special listenerId-E, --regex Enable regular expression to match (wildcard matching by default)-M, --sizeLimit  Upper size limit in bytes for the result (10 * 1024 * 1024 by default)-s, --success Watch after successful invocation-v, --verbose Enables print verbose information, default value false. The full qualified class name you want to watch The method name you want to watch The content you want to watch, written by ognl. Default value is '{params, target, returnObj}' Examples: params params[0] 'params[0]+params[1]' '{params[0], target, returnObj}' returnObj throwExp target clazz method Conditional expression in ognl style, for example: TRUE : 1==1 TRUE : true FALSE : false TRUE : 'params.length>=0' FALSE : 1==2 '#cost>100'

Mô tả tham số.

  。

参数名称 Mô tả thông số
class-pattern 类名表达式匹配
method-pattern 方法名表达式匹配
express 观察表达式,默认值:{params, target, returnObj}
condition-express 条件表达式
[b] 在方法调用之前观察
[e] 在方法异常之后观察
[s] 在方法返回之后观察
[f] 在方法结束之后(正常返回和异常返回)观察
[E] 开启正则表达式匹配,默认为通配符匹配
[x:] 指定输出结果的属性遍历深度,默认为 1

这里重点要说明的是观察表达式,观察表达式的构成主要由 #OGNL 表达式组成,所以你可以这样写"{params,returnObj}",只要是一个合法的 ognl 表达式,都能被正常支持.

观察的维度也比较多,主要体现在参数 advice 的数据结构上。Advice 参数最主要是封装了通知节点的所有信息。请参考表达式核心变量中关于该节点的描述.

使用举例:

我需要观察cloud-access-auth-1.18.1.jar进程在处理登录信息时的登录方法信息,日志如下:

13:42:54.205 INFO [http-nio-7001-exec-4] c.t.c.access.sso.service.impl.AuthenticateService - [Access Auth] account login parameter. accountName:qcloudAdmin ,password:****** 。

得到指定类名为AuthenticateService.

我们带到 Arthas 中进行 watch:

### 报名在日志文件中是简写,所以我这里使用通配符方式匹配类名,第二个参数方法名我也用*代替,全部匹配[arthas@5201]$ watch *AuthenticateService *Press Q or Ctrl+C to abort.Affect(class count: 2 , method count: 6) cost in 130 ms, listenerId: 16### 从输出信息得知,在这个 Java 进程所有代码中匹配到有两个类,一共6个方法

我们来点击页面登录按钮,看看 watch 中能观察到哪些动作:

[arthas@5201]$ watch *AuthenticateService *Press Q or Ctrl+C to abort.Affect(class count: 2 , method count: 6) cost in 130 ms, listenerId: 16 #### 第一个方法开始执行 Beginmethod=com.tencent.cloud.access.sso.service.impl.AuthenticateService.login location=AtExitts=2021-09-03 13:51:25; [cost=2.217281ms] result=@ArrayList[ @Object[][isEmpty=false;size=3], @AuthenticateService[com.tencent.cloud.access.sso.service.impl.AuthenticateService@f5cadbf], @AccessAuthPrincipal[com.tencent.cloud.access.sso.model.AccessAuthPrincipal@72f71bf6],]#### 第一个方法执行结束 End #### 第二个方法开始执行 Beginmethod=com.tencent.cloud.access.sso.service.impl.AuthenticateService.updateSession location=AtExitts=2021-09-03 13:51:25; [cost=0.956478ms] result=@ArrayList[ @Object[][isEmpty=false;size=2], @AuthenticateService[com.tencent.cloud.access.sso.service.impl.AuthenticateService@f5cadbf], @AuthenticationResponse[com.tencent.cloud.access.sso.model.AuthenticationResponse@6b2bae10],]#### 第二个方法执行退出 End..............

在输出信息中我们可以看到,第一行有完整的方法路径,以及获取的退出状态location.

  • AtExit:表示正常退出。
  • AtExceptionExit:表示异常退出。

第二行有方法执行的开始时间戳以及cost 开销 ,最后一个为watch的结果.

这里result的 ArrayList 数组是 watch 指令的强大之处,它默认包含三个对象:

  • params: 入参,通常为数组,这里为 @Object 对象
  • target: 运行中当前 this 对象,也就是这个类对象本身,这里为@AuthenticateService实体类对象
  • returnObj: 返回对象值,这里为返回的@AccessAuthPrincipal对象

我们重新执行一次 watch 指令,这次咱们精确指定类名和方法名,以及加一个-x解析深度参数:

[arthas@5201]$ watch com.tencent.cloud.access.sso.service.impl.AuthenticateService login -x 2Press Q or Ctrl+C to abort.Affect(class count: 1 , method count: 2) cost in 74 ms, listenerId: 17method=com.tencent.cloud.access.sso.service.impl.AuthenticateService.login location=AtExitts=2021-09-03 14:10:15; [cost=3.289679ms] result=@ArrayList[ @Object[][ @String[qcloudAdmin], @String[Bgi8c0yC+IAvRLkuQRy6kLQ6T2J/9PNrL6G/+KX9ppE=], @String[127.0.0.1], ], @AuthenticateService[ log=@Logger[Logger[com.tencent.cloud.access.sso.service.impl.AuthenticateService]], sessionDAO=@RedisSessionDAO[com.tencent.cloud.access.sso.shiro.RedisSessionDAO@61813e98], accountSessionService=@AccountSessionService[com.tencent.cloud.access.account.service.impl.AccountSessionService@30e815ac], accessAuthRealm=@AccessAuthRealm[com.tencent.cloud.access.sso.shiro.AccessAuthRealm@1faea5], accountService=@AccountService[com.tencent.cloud.access.account.service.impl.AccountService@197459d8], ssoProperties=@SsoProperties[com.tencent.cloud.access.sso.config.SsoProperties@461879b2], securityManager=@DefaultSecurityManager[org.apache.shiro.mgt.DefaultSecurityManager@3b0f92f0], ssoService=@QCloudSsoService[com.tencent.cloud.access.sso.service.impl.QCloudSsoService@4f8704f5], userService=@UserService[com.tencent.cloud.access.user.service.impl.UserService@5e69da74], ], @AccessAuthPrincipal[ serialVersionUID=@Long[-2856270666386831504], accountName=@String[qcloudAdmin], userId=null, accountId=@String[account-96a79v5b], password=@String[VYUQeJrC5EJq21t/f9rb1Djm+4+eanqXY3ZkW2oiiwA=], serviceCode=null, isAdmin=null, loginName=null, serialVersionUID=@Long[8229738167949958388], token=@String[54158a08d8104de57a855249eb6ffe06], serialVersionUID=@Long[-4556824360581761962], appId=null, subAccountUin=null, uin=null, requestId=null, region=null, kv=null, ],] method=com.tencent.cloud.access.sso.service.impl.AuthenticateService.login location=AtExitts=2021-09-03 14:10:15; [cost=9.571541ms] result=@ArrayList[ @Object[][ @LoginRequest[com.tencent.cloud.access.sso.model.LoginRequest@3dd2bbb0], ], @AuthenticateService[ log=@Logger[Logger[com.tencent.cloud.access.sso.service.impl.AuthenticateService]], sessionDAO=@RedisSessionDAO[com.tencent.cloud.access.sso.shiro.RedisSessionDAO@61813e98], accountSessionService=@AccountSessionService[com.tencent.cloud.access.account.service.impl.AccountSessionService@30e815ac], accessAuthRealm=@AccessAuthRealm[com.tencent.cloud.access.sso.shiro.AccessAuthRealm@1faea5], accountService=@AccountService[com.tencent.cloud.access.account.service.impl.AccountService@197459d8], ssoProperties=@SsoProperties[com.tencent.cloud.access.sso.config.SsoProperties@461879b2], securityManager=@DefaultSecurityManager[org.apache.shiro.mgt.DefaultSecurityManager@3b0f92f0], ssoService=@QCloudSsoService[com.tencent.cloud.access.sso.service.impl.QCloudSsoService@4f8704f5], userService=@UserService[com.tencent.cloud.access.user.service.impl.UserService@5e69da74], ], @AuthenticationResponse[ serialVersionUID=@Long[-6134589862066278677], token=@String[54158a08d8104de57a855249eb6ffe06], accountId=@String[account-96a79v5b], changePwd=@String[N], users=@ArrayList[isEmpty=false;size=1], ],]..............

watch 指令的-x选项表示解析三个阶段的对象深度,默认值为 1,也就是只解析到对象层,不解析对象的下一级属性等信息.

通过上述指令,我们获取到了更加详细的入参、this对象、返回值的信息,依次解析如下:

params 方法入参:

  • @String[qcloudAdmin]: 参数一,用户名
  • @String[Bgi8c0yC+IAvRLkuQRy6kLQ6T2J/9PNrL6G/+KX9ppE=]: 密码加密串
  • @String[127.0.0.1]: 来源主机信息

this方法体内部对象:

  • log=@Logger: 定义 Logger 对象
  • sessionDAO=@RedisSessionDAO: 会话session数据入口,为 RedisSessionDAO 对象
  • accountSessionService=@AccountSessionService: 私有对象........

returnObj 返回值对象,这里为@AccessAuthPrincipal对象:

  • serialVersionUID: 用户
  • UIDaccountName: 登录用户名
  • password: 用户密码加密串token: token串
  • ........

条件表达式过滤 。

[arthas@5201]$ watch com.tencent.cloud.access.sso.service.impl.AuthenticateService login '{params[0]=qcloudAdmin,returnObj}' -x 2 。

诊断返回信息包含params[0]和returnObj对象,而且仅获取入参params[0] == "qcloudAdmin"的方法调用,最后解析深度为 2.

只有满足条件的调用,才会被 Arthas 捕获到.

观察异常信息 。

[arthas@5201]$ watch com.tencent.cloud.access.sso.service.impl.AuthenticateService login '{params[0],throwExp}' -e -x 2 。

  • -e: 表示在抛出异常之后观察
  • express观察表达式第二个参数throwExp: 表示异常信息的变量是throwExp

按方法执行耗时进行过滤 。

[arthas@5201]$ watch com.tencent.cloud.access.sso.service.impl.AuthenticateService login '{params[0],returnObj}' '#cost>200' -x 2 。

  • watch指令的第四个参数 condition-express 为#cost>200,表示诊断处理耗时大于 200ms 才会被捕获输出。
  • -x 2: 解析深度为 2。

仅观察当前对象的属性 。

[arthas@5201]$ xem com.tencent.cloud.access.sso.service.impl.AuthenticateService đăng nhập 'target' -x 3Nhấn Q hoặc Ctrl+C để hủy.Affect(class count: 1, method count: 2) cost trong 76 ms, listenerId: 23method=com.tencent.cloud.access.sso.service.impl.AuthenticateService.login location=AtExitts=2021-09-03 14:48:33; [chi phí=3,189525ms] kết quả=@AuthenticateService[ log=@Logger[ serialVersionUID=@Long[5454405123156820674], FQCN=@String[ch.qos.logback.classic.Logger], tên=@String[com.tencent.cloud.access.sso.service.impl.AuthenticateService], cấp độ=null, effectiveLevelInt=@Integer[20000], cha mẹ=@Logger[ serialVersionUID=@Long[5454405123156820674], FQCN=@String[ch.qos.logback.classic.Logger], tên=@String[com.tencent.cloud.access.sso.service.impl], cấp độ=null, effectiveLevelInt=@Integer[20000], parent=@Logger[Logger[com.tencent.cloud.access.sso.service]], childrenList=@CopyOnWriteArrayList[isEmpty=false;size=2], aai=null, addition=@Boolean[true], loggerContext=@LoggerContext[ch.qos.logback.classic.LoggerContext[default]], ], childrenList=null, aai=null, additional=@Boolean[true], loggerContext=@LoggerContext[DEFAULT_PACKAGING_DATA=@Boolean[false], root=@Logger[Logger[ROOT]], size=@Integer[501], noAppenderWarning=@Integer[0], loggerContextListenerList=@ArrayList[isEmpty=false;size=1], loggerCache=@ConcurrentHashMap[isEmpty=false;size=501], loggerContextRemoteView=@LoggerContextVO[LoggerContextVO{name='default', propertyMap={}, birthTime=1630634095948}], turboFilterList=@TurboFilterList[isEmpty=true;size=0], packagingDataEnabled=@Boolean[false], maxCallerDataDepth=@Integer[8], resetCount=@Integer[2], frameworkPackages=@ArrayList[isEmpty=true;size=0], birthTime=@Long[1630634095948], name=@String[default], sm=@BasicStatusManager[ch.qos.logback.core.BasicStatusManager@612c57fb], propertyMap=@HashMap[isEmpty=true;size=0], objectMap=@HashMap[isEmpty=false;size=6], configurationLock=@LogbackLock[ch.qos.logback.core.spi.LogbackLock@36566db5], scheduleExecutorService=null, scheduleFutures=@ArrayList[isEmpty=true;size=0], lifeCycleManager=@LifeCycleManager[ch.qos.logback.core.LifeCycleManager@44477e6], started=@Boolean[false], ], ], sessionDAO=@RedisSessionDAO[ .............

Mở rộng suy nghĩ của mình, chúng ta có thể quan sát trực tiếp thông tin jdbc kết nối cơ bản thông qua một cuộc gọi duy nhất:

[arthas@5201]$ xem com.tencent.cloud.access.sso.service.impl.AuthenticateService đăng nhập 'target.userService.userDao.jdbcTemplate.dataSource.pool.poolProperties.url' -x 2 Nhấn Q hoặc Ctrl+C để hủy. Affect(class count: 1, method count: 2) cost trong 69 ms, listenerId: 34 method=com.tencent.cloud.access.sso.service.impl.AuthenticateService.login location=AtExit ts=2021-09-03 15:09:55; [chi phí=2.682966ms] kết quả=@String[jdbc:mysql://*.*.*.*:3306/access_auth?useSSL=false&characterEncoding=utf8] phương thức=com.tencent.cloud.access.sso.service.impl.AuthenticateService.login vị trí=AtExit ts=2021-09-03 15:09:55; [chi phí=21.373065ms] kết quả=@String[jdbc:mysql://*.*.*.*:3306/access_auth?useSSL=false&characterEncoding=utf8] 。

Ở đây, từ cấp cao nhất trở xuống, chúng tôi lấy thông tin cấu hình kết nối jdbc dataSource của lệnh gọi này, bao gồm việc kiểm tra thư viện.

kết quả trả về một đối tượng kiểu Chuỗi có giá trị jdbc:mysql://*.*.*.*:3306/access_auth?useSSL=false&characterEncoding=utf8.

Loại trừ các lớp được chỉ định.

[arthas@5201]$ watch com.tencent.cloud.access.sso.service.impl.* * 'target' -x 1 --exclude-class-pattern AuthorizeService | grep --color AuthorizeServiceNhấn Q hoặc Ctrl+C để hủy.
  • --exclude-class-pattern: loại trừ các lớp được chỉ định

Lệnh theo dõi⭐

Phương thức này gọi đường dẫn nội bộ và xuất ra thời gian dành cho mỗi nút trên đường dẫn phương thức.

Lệnh theo dõi có thể chủ động tìm kiếm đường dẫn gọi phương thức tương ứng với mẫu lớp/mẫu phương thức, hiển thị và đếm tất cả chi phí hiệu năng trên toàn bộ liên kết gọi và theo dõi liên kết gọi.

Mô tả tham số.

  。

参数名称 Mô tả thông số
class-pattern 类名表达式匹配
method-pattern 方法名表达式匹配
condition-express 条件表达式
[E] 开启正则表达式匹配,默认为通配符匹配
[N:] Số lần thực hiện lệnh
#trị giá Thời gian thực hiện phương pháp
Điều quan trọng cần lưu ý ở đây là biểu thức quan sát chủ yếu bao gồm các biểu thức #OGNL, vì vậy bạn có thể viết "{params, returnObj}" như thế này miễn là nó là biểu thức ognl hợp pháp, nó sẽ được hỗ trợ. thông thường. .

Ngoài ra còn có nhiều khía cạnh quan sát, chủ yếu được phản ánh trong cấu trúc dữ liệu của lời khuyên tham số. Tham số Tư vấn chủ yếu gói gọn tất cả thông tin của nút thông báo.

Vui lòng tham khảo mô tả của nút này trong Biến lõi biểu thức.

  • Để biết cách sử dụng đặc biệt, vui lòng tham khảo: https://github.com/alibaba/arthas/issues/71
  • Trang web chính thức của biểu thức OGNL: https://commons.apache.org/proper/commons-ognl/lingu-guide.html

Nhiều khi chúng ta chỉ muốn xem kết quả theo dõi sau khi rt của một phương thức lớn hơn một thời gian nhất định. Bây giờ Arthas có thể lọc theo thời gian cần thiết để thực thi phương thức đó. Ví dụ: trace *StringUtils isBlank '#cost>100' có nghĩa là. khi thời gian thực hiện vượt quá 100 mili giây, kết quả theo dõi sẽ được xuất ra.

Ba lệnh xem/ngăn xếp/theo dõi đều hỗ trợ #cost.

使用举例:

[arthas@5201]$ trace com.tencent.cloud.access.sso.service.impl.AuthenticateService loginNhấn Q hoặc Ctrl+C để hủy.Affect(class count: 1 , method count: 2) cost in 114 ms, listenerId: 49`---ts=2021-09-03 15:37:52;thread_name=http-nio-7001-exec-5;id=18;is_daemon=true;priority=5;TCCL=org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedWebappClassLoader@1cfd053 `---[6.69059ms] com.tencent.cloud.access.sso.service.impl.AuthenticateService:login() +---[0.045058ms] com.tencent.cloud.access.sso.model.LoginRequest:getOpt() #87 +---[0.011503ms] com.tencent.cloud.access.sso.constant.LoginType:getType() #88 +---[0.004858ms] com.tencent.cloud.access.sso.constant.LoginType:getType() #89 +---[0.005082ms] com.tencent.cloud.access.sso.model.LoginRequest:getAccountName() #93 +---[0.005074ms] com.tencent.cloud.access.sso.model.LoginRequest:getPassword() #94 +---[min=0.002257ms,max=0.010395ms,total=0.012652ms,count=2] org.springframework.util.StringUtils:isEmpty() #95 +---[0,008128ms] com.tencent.cloud.access.sso.config.SsoProperties:isPasswordTextPrintable() #100 +---[0,084201ms] org.slf4j.Logger:info() #99 +---[0,00653ms] com.tencent.cloud.access.sso.model.AuthenticationResponse:() #101 +---[0,004871ms] com.tencent.cloud.access.sso.model.LoginRequest:getRemoteHost() #102 +---[3,317607ms] com.tencent.cloud.access.sso.service.impl.AuthenticateService:login() #102 | `---[3,285177ms] com.tencent.cloud.access.sso.service.impl.AuthenticateService:login() | +---[0,008045ms] org.apache.shiro.authc.UsernamePasswordToken:() #139 | +---[0,011232ms] org.apache.shiro.subject.SimplePrincipalCollection:() #141 | +---[0,00843ms] org.apache.shiro.subject.support.DelegatingSubject:() #142 | +---[0,015667ms] org.apache.shiro.util.ThreadContext:bind() #143 | +---[1,051658ms] org.apache.shiro.subject.support.DelegatingSubject:login() #144 | +---[0,988623ms] org.apache.shiro.subject.support.DelegatingSubject:getSession() #145 | +---[0,015629ms] org.apache.shiro.session.Session:getId() #146 | +---[0,323618ms] org.apache.shiro.subject.support.DelegatingSubject:getPrincipal() #147 | +---[0,009258ms] com.tencent.cloud.access.sso.model.AccessAuthPrincipal:setToken() #149 | +---[0,007608ms] com.tencent.cloud.access.sso.model.AccessAuthPrincipal:setAccountName() #150 | +---[0,429798ms] org.apache.shiro.session.Session:setAttribute() #151 | `---[0,207347ms] com.tencent.cloud.access.account.service.IAccountSessionService:bind() #152 +---[0,010654ms] com.tencent.cloud.access.account.Account:() #103 +---[0,824315ms] com.tencent.cloud.access.account.service.IAccountService:find() #103 +---[0,006474ms] com.tencent.cloud.access.account.Account:getLock() #104 +---[0,004144ms] com.tencent.cloud.access.account.Account:getChangePassword() #107 +---[0,005663ms] com.tencent.cloud.access.sso.model.AuthenticationResponse:setChangePwd() #107 +---[0,004683ms] com.tencent.cloud.access.sso.model.AccessAuthPrincipal:getToken() #108 +---[0.[00414ms] com.tencent.cloud.access.sso.model.AuthenticationResponse:setToken() #108 +---[0,003733ms] com.tencent.cloud.access.account.Account:getAccountId() #109 +---[0,005164ms] com.tencent.cloud.access.sso.model.AuthenticationResponse:setAccountId() #109 +---[0,002866ms] com.tencent.cloud.access.sso.model.AccessAuthPrincipal:setAccountName() #110 +---[0,00399ms] com.tencent.cloud.access.sso.model.AccessAuthPrincipal:getAccountId() #112 +---[0,014922ms] com.tencent.cloud.access.user.User:() #112 +---[0,004781ms] com.tencent.cloud.access.user.User:setAppIsolate() #113 +---[0,83272ms] com.tencent.cloud.access.user.service.IUserService:findAccountList() #114 +---[0,006398ms] com.tencent.cloud.access.user.User:getUserId() #116 +---[0,005214ms] com.tencent.cloud.access.sso.model.AccessAuthPrincipal:setUserId() #116 +---[0,00349ms] com.tencent.cloud.access.sso.model.AccessAuthPrincipal:getToken() #118 +---[0,002987ms] com.tencent.cloud.access.user.User:getUserId() #118 +---[0,887095ms] com.tencent.cloud.access.sso.service.impl.AuthenticateService:updateSession() #118 `---[0,004734ms] com.tencent.cloud.access.sso.model.AuthenticationResponse:setUsers() #120`---ts=2021-09-03 15:37:52;thread_name=http-nio-7001-exec-1;id=14;is_daemon=true;priority=5;TCCL=org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedWebappClassLoader@1cfd053 `---[1,28437ms] com.tencent.cloud.access.sso.service.impl.AuthenticateService:login() +---[0,003596ms] com.tencent.cloud.access.sso.model.LoginRequest:getOpt() #87 +---[0,006076ms] com.tencent.cloud.access.sso.constant.LoginType:getType() #88 +---[0,002865ms] com.tencent.cloud.access.sso.constant.LoginType:getType() #89 +---[0,010558ms] com.tencent.cloud.access.sso.model.LoginRequest:getAccessToken() #123 +---[0,003959ms] com.tencent.cloud.access.sso.model.LoginRequest:getUid() #124 +---[0,003368ms] org.springframework.util.StringUtils:isEmpty() #125 +---[0,002671ms] org.springframework.util.StringUtils:isEmpty() #128 `---[1,166953ms] com.tencent.cloud.access.sso.service.impl.AuthenticateService:updateSession() #131getToken() #118 +---[0.002987ms] com.tencent.cloud.access.user.User:getUserId() #118 +---[0.887095ms] com.tencent.cloud.access.sso.service.impl.AuthenticateService:updateSession() #118 `---[0.004734ms] com.tencent.cloud.access.sso.model.AuthenticationResponse:setUsers() #120`---ts=2021-09-03 15:37:52;thread_name=http-nio-7001-exec-1;id=14;is_daemon=true;priority=5;TCCL=org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedWebappClassLoader@1cfd053 `---[1.28437ms] com.tencent.cloud.access.sso.service.impl.AuthenticateService:login() +---[0.003596ms] com.tencent.cloud.access.sso.model.LoginRequest:getOpt() #87 +---[0.006076ms] com.tencent.cloud.access.sso.constant.LoginType:getType() #88 +---[0.002865ms] com.tencent.cloud.access.sso.constant.LoginType:getType() #89 +---[0.010558ms] com.tencent.cloud.access.sso.model.LoginRequest:getAccessToken() #123 +---[0.003959ms] com.tencent.cloud.access.sso.model.LoginRequest:getUid() #124 +---[0.003368ms] org.springframework.util.StringUtils:isEmpty() #125 +---[0,002671ms] org.springframework.util.StringUtils:isEmpty() #128 `---[1,166953ms] com.tencent.cloud.access.sso.service.impl.AuthenticateService:updateSession() #131getToken() #118 +---[0.002987ms] com.tencent.cloud.access.user.User:getUserId() #118 +---[0.887095ms] com.tencent.cloud.access.sso.service.impl.AuthenticateService:updateSession() #118 `---[0.004734ms] com.tencent.cloud.access.sso.model.AuthenticationResponse:setUsers() #120`---ts=2021-09-03 15:37:52;thread_name=http-nio-7001-exec-1;id=14;is_daemon=true;priority=5;TCCL=org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedWebappClassLoader@1cfd053 `---[1.28437ms] com.tencent.cloud.access.sso.service.impl.AuthenticateService:login() +---[0.003596ms] com.tencent.cloud.access.sso.model.LoginRequest:getOpt() #87 +---[0.006076ms] com.tencent.cloud.access.sso.constant.LoginType:getType() #88 +---[0.002865ms] com.tencent.cloud.access.sso.constant.LoginType:getType() #89 +---[0.010558ms] com.tencent.cloud.access.sso.model.LoginRequest:getAccessToken() #123 +---[0.003959ms] com.tencent.cloud.access.sso.model.LoginRequest:getUid() #124 +---[0.003368ms] org.springframework.util.StringUtils:isEmpty() #125 +---[0,002671ms] org.springframework.util.StringUtils:isEmpty() #128 `---[1,166953ms] com.tencent.cloud.access.sso.service.impl.AuthenticateService:updateSession() #131

Chẩn đoán lọc tốn thời gian.

[arthas@5201]$ theo dõi com.tencent.cloud.access.sso.service.impl.AuthenticateService đăng nhập '#cost > 2000' 。

#cost > 2000: Chỉ chụp các đường dẫn có chi phí lớn hơn 2000ms.

Phương thức lọc chỉ được gọi một lần.

[arthas@5201]$ theo dõi com.tencent.cloud.access.sso.service.impl.AuthenticateService đăng nhập -n 1 。

Chỉ ghi lại một lệnh gọi của phương thức đã chỉ định và sau đó thoát khỏi tác vụ.

chỉ thị sysprop - Nhận/đặt thuộc tính hệ thống quy trình.

sysprop chủ yếu được sử dụng để xem và thiết lập thông tin thuộc tính hệ thống của quy trình hiện tại.

Sử dụng các ví dụ.

Xem các thuộc tính hệ thống của quy trình java hiện tại.

[arthas@27878]$ syspropKEY GIÁ TRỊ--------------------------------------------------------------------awt.toolkit sun.awt.X11.XToolkitfile.encoding.pkg sun.iojava.specification.version 1.8sun.cpu.isalistsun.jnu.encoding UTF-8java.class.path /data/tsf/tsf-oss/tsf-ratelimit/tsf-ratelimit-1.29.1/lib/tsf-ratelimit-1.29.1.jarjava.vm.vendor Tencentsun.arch.data.model 64java.vendor.url http://jdk.oa.com/catalina.useNaming falseuser.timezone Asia/Shanghaiorg.jboss.logging.provider slf4jos.name Linuxjava.vm.specification.version 1.8@appId tsf-ratelimituser.country USsun.java.launcher SUN_STANDARDsun.boot.library.path /data/TencentKona-8.0.2-252/jre/lib/amd64sun.java.command /data/tsf/tsf-oss/tsf-ratelimit/tsf-ratelimit-1.29.1/lib/tsf-ratelimit-1.29.1.jarsun.cpu.endian littleuser.home /rootuser.language enjava.specification.vendor Oracle Corporationjava.home /data/TencentKona-8.0.2-252/jrefile.separator /line.separatorjava.vm.specification.vendor Oracle Corporationjava.specification.name Java Platform API Specificationjava.awt.graphicsenv sun.awt.X11GraphicsEnvironmentjava.awt.headless trueLOG_LEVEL_PATTERN %5p [bootstrap,%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-Span-Export:-}]sun.boot.class.path /data/TencentKona-8.0.2-252/jre/lib/resources.jar:/data/TencentKona-8.0.2-252/jre/lib/rt.jar:/data/TencentKona-8.0.2-252/jre/lib/sunrsasign.jar:/data/TencentKona-8.0.2-252/jre/lib/jsse.jar:/data/TencentKona-8.0.2-2 52/jre/lib/jce.jar:/data/TencentKona-8.0.2-252/jre/lib/charsets.jar:/data/TencentKona-8.0.2-252/jre/lib/jfr.jar:/data/TencentKona-8.0.2-252/jre/classesjava.protocol.handler.pkgs org.springframework.boot.loadersun.management.compiler HotSpot 64-Bit Tiered Compilersjava.runtime.version 1.8.0_252-b1java.net.preferIPv4Stack trueuser.name rootpath.separator :os.version 3.10.0-1127.19.1.el7.x86_64java.endorsed.dirs /data/TencentKona-8.0.2-252/jre/lib/endorsedjava.runtime.name Môi trường thời gian chạy OpenJDKfile.encoding UTF-8spring.beaninfo.ignore truesun.nio.ch.bugLeveljava.vm.name Máy chủ OpenJDK 64-Bit VMLOG_FILE /var/log/tsf-oss/tsf-ratelimit/tsf-ratelimitjava.vendor.url.bug http://ce.oa.com/biajava.io.tmpdir /tmpcatalina.home /tmp/tomcat.8220305148167761737.23000java.version 1.8.0_252user.dir /data/tsf/tsf-oss/tsf-ratelimit/tsf-ratelimit-1.29.1os.arch amd64PID 27878java.vm.specification.name Java Virtual Machine Specificationjava.awt.printerjob sun.print.PSPrinterJobsun.os.patch.level unknowncatalina.base /tmp/tomcat.8220305148167761737.23000loader.path /data/tsf/tsf-oss/tsf-ratelimit/tsf-ratelimit-1.29.1/configjava.library.path /data/tsf/tsf-oss/tsf-ratelimit/tsf-ratelimit-1.29.1/lib::/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/libjava.vm.info chế độ hỗn hợp, sharingjava.vendor Tencentjava.vm.version 25.252-b1java.ext.dirs /data/TencentKona-8.0.2-252/jre/lib/ext:/usr/java/packages/lib/extsun.io.unicode.encoding UnicodeLittlejava.class.version 52.0

Tạm thời thiết lập các thuộc tính hệ thống của quy trình hiện tại.

[arthas@29749]$ sysprop java.class.path /data/jdk/latestĐã thay đổi thành công thuộc tính hệ thống.GIÁ TRỊ KHÓA------------------------------------------------------------------------------------------------java.class.path /data/jdk/latest

Lệnh ghi nhật ký--*Xem hoặc đặt nhật ký

Mô tả tham số.

[arthas@29749]$ logger -hUSAGE: logger [-c ] [--classLoaderClass ] [-h] [--include-no-appender] [-l ] [-n ]TÓM TẮT: In thông tin logger và cập nhật cấp độ logger Ví dụ: logger logger -c 327a647b logger -c 327a647b --name ROOT --level debug logger --include-no-appender WIKI: https://arthas.aliyun.com/doc/loggerOPTIONS: -c, --classloader  Mã băm classLoader, nếu không có giá trị nào được đặt, giá trị mặc định là SystemClassLoader --classLoaderClass  Tên lớp của classLoader của lớp đặc biệt.-h, --help trợ giúp này --include-no-appender bao gồm các logger không có appender, giá trị mặc định là false-l, --level  set logger level-n, --name  tên logger

Sử dụng các ví dụ.

Đặt mức nhật ký của phần bổ sung ROOT của trình ghi nhật ký.

##### Nhận thông tin lớp logger [arthas@29749]$ loggername ROOTclass ch.qos.logback.classic.LoggerclassLoader org.springframework.boot.loader.LaunchedURLClassLoader@5674cd4dclassLoaderHash 5674cd4dlevel INFOperformanceLevel INFO.......... ............##### Đặt ROOT Cấp độ nhật ký tên là DEBUG[arthas@29749]$ logger -c 5674cd4d -n ROOT -l DEBUG

lệnh heapdump--Kết xuất đống.

Mô tả tham số.

[arthas@29749]$ heapdump -hUSAGE: heapdump [-h] [-l] [file]TÓM TẮT: Heap dump Ví dụ: heapdump ## Lưu tệp hprof vào thư mục hiện tại heapdump --live ## Đối tượng hoạt động heapdump -- trực tiếp /tmp/dump.hprof WIKI: https://arthas.aliyun.com/doc/heapdumpTÙY CHỌN: -h, --help this help-l, --live Chỉ kết xuất các đối tượng trực tiếp; nếu không được chỉ định, tất cả các đối tượng trong vùng heap sẽ bị kết xuất. Tệp đầu ra

lệnh sc -- Lấy danh sách các lớp đã nạp

Mô tả tham số.

[arthas@29749]$ sc -hUSAGE: sc [-c ] [--classLoaderClass ] [-d] [-x ] [-f] [-h] [-n ] [-E] class-patternSUMMARY: Tìm kiếm tất cả các lớp được tải bởi JVM VÍ DỤ: sc -d org.apache.commons.lang.StringUtils sc -d org/apache/commons/lang/StringUtils sc -d *StringUtils sc -d -f org.apache.commons.lang.StringUtils sc -E org\\.apache\\.commons\\.lang\\.StringUtils WIKI: https://arthas.aliyun.com/doc/scOPTIONS: -c, --classloader  Mã băm của classLoader của lớp đặc biệt --classLoaderClass  Tên lớp của classLoader của lớp đặc biệt.-d, --details Hiển thị thông tin chi tiết của class-x, --expand  Mở rộng cấp độ của đối tượng (0 theo mặc định)-f, --field Hiển thị tất cả các biến thành viên-h, --help this help-n, --limits  Số lượng tối đa các lớp khớp với thông tin chi tiết (100 theo mặc định)-E, --regex Cho phép biểu thức chính quy khớp (khớp ký tự đại diện theo mặc định) Mẫu tên lớp, sử dụng dấu '.' hoặc '/' làm dấu phân cách

Sử dụng các ví dụ.

#### Lấy danh sách tên gói và tên lớp đã tải dựa trên ký tự đại diện [arthas@29749]$ sc com.tencent.tsf.*com.sun.proxy.$Proxy132com.sun.proxy.$Proxy143com.tencent.tsf.TsfApplicationStartercom.tencent.tsf.TsfApplicationStarter$$EnhancerBySpringCGLIB$$e6e 6d3dccom.tencent.tsf.common.TsfBaseEntitycom.tencent.tsf.common.TsfPagecom.tencent.tsf.common.TsfPageQuerycom.tencent.tsf.common.aop.ControllerCommonLog............

Tham số -d lấy thông tin cơ bản của một lớp cụ thể:

[arthas@29749]$ sc com.tencent.tsf.TsfApplicationStarter -dclass-info com.tencent.tsf.TsfApplicationStartercode-source tệp:/data/tsf/tsf-oss/tsf-ratelimit/tsf-ratelimit-1.29.1/lib/tsf-ratelimit-1.29.1.jar!/BOOT-INF/lib/tsf-common-1.29.1. jar!/name com.tencent.tsf.TsfApplicationStarterisInterface falseisAnnotation falseisEnum falseisAnonymousClass falseisArray falseisLocalClass falseisMemberClass falseisPrimitive falseisSynthetic falsetên đơn giản TsfApplicationStartermodifier publicannotation org.springframework.boot.autoconfigure.SpringBootApplication,org.springframework.cloud.client.discovery.EnableDiscoveryClient,org.springframework.cloud.netflix.feign.EnableFeignClients,org.springframework.transaction.annotation.EnableTransactionManag ement,org.springframework.scheduling .annotation.EnableScheduling,org.springframework.context.annotation.EnableAspectJAutoProxyinterfacessuper-class +-java.lang.Objectclass-loader +-org.springframework.boot.loader.LaunchedURLClassLoader@5674cd4d +-sun.misc.Launcher$AppClassLoader@70dea4e + -sun.misc.Launcher$ExtClassLoader@65e2dbf3classLoaderBăm 5674cd4dclass-info com.tencent.tsf.TsfApplicationStarter$$EnhancerBySpringCGLIB$$e6e6d3dctệp nguồn mã:/data/tsf/tsf-oss/tsf-ratelimit/tsf-ratelimit-1.29.1/lib/tsf-ratelimit-1.29.1.jar! /BOOT-INF/lib/tsf-common-1.29.1.jar!/name com.tencent.tsf.TsfApplicationStarter$$EnhancerBySpringCGLIB$$e6e6d3dcisGiao diện falseisChú thích falseisEnum falseisAnonymousClass falseisMảng falseisLocalClass falseisMemberClass falseisPrimitive falseisSynthetic falsesimple-name TsfApplicationStarter$$EnhancerBySpringCGLIB$$e6e6d3dcmodifier giao diện chú thích công khai org.springframework.context.annotation.ConfigurationClassEnhancer$EnhancedConfigurationsuper-class +-com.tencent.tsf.TsfApplicationStarter +-java.lang.Objectclass-loader +-org.springframework.boot.loader.LaunchedURLClassLoader@5674cd4d +-sun.misc. Launcher$AppClassLoader@70dea4e +-sun.misc.Launcher$ExtClassLoader@65e2dbf3classLoaderHash 5674cd4dAffect(row-cnt:2) chi phí trong 17 ms.

lệnh sm -- Lấy thông tin phương thức của lớp được chỉ định

Tham số lệnh này tương tự như tham số lệnh sc.

使用举例:

## 获取 com.tencent.tsf.common.TsfPageQuery Không có thông tin nào được phân loại [arthas@29749]$ sm com.tencent.tsf.common.TsfPageQuery *com.tencent.tsf.ratelimit.domain.Ratelimit (Lcom/tencent/tsf/ratelimit/domain/Ratelimit;)Vcom.tencent.tsf.ratelimit.domain.Ratelimit ()Vcom.tencent.tsf.ratelimit.domain.Ratelimit toString()Ljava/lang/String;com.tencent.tsf.ratelimit.domain.Ratelimit getRules()Ljava/util/List;com.tencent.tsf.ratelimit.domain.Ratelimit lambda$containsIn$0(Lcom/tencent/tsf/ratelimit/domain/Ratelimit$Rule;Lcom/tencent/tsf/ratelimit/domain/Ratelimit$Rule;)Zcom.tencent.tsf.ratelimit.domain.Ratelimit setRules(Ljava/util/List;)Vcom.tencent.tsf.ratelimit.domain.Ratelimit isValidRequest(Z)Zcom.tencent.tsf.ratelimit.domain.Ratelimit getRequestIdentity()Ljava/lang/String;com.tencent.tsf.ratelimit.domain.Ratelimit setNamespaceId(Ljava/lang/String;)Vcom.tencent.tsf.ratelimit.domain.Ratelimit containsIn(Ljava/util/List;)Zcom.tencent.tsf.ratelimit.domain.Ratelimit isDimensionConflict(Ljava/util/List;)Zcom.tencent.tsf.ratelimit.domain.Ratelimit getNamespaceId()Ljava/lang/String;com.tencent.tsf.ratelimit.domain.Ratelimit getServiceName()Ljava/lang/String;com.tencent.tsf.ratelimit.domain.Ratelimit setServiceName(Ljava/lang/String;)Vcom.tencent.tsf.common.proxy.Application ()Vcom.tencent.tsf.common.proxy.Application setApplicationId(Ljava/lang/String;)Vcom.tencent.tsf.common.proxy.Application getMicroserviceType()Ljava/lang/String;com.tencent.tsf.common.proxy.Application setMicroserviceType(Ljava/lang/String;)Vcom.tencent.tsf.common.proxy.Application getApplicationId()Ljava/lang/String;com.tencent.tsf.ratelimit.proxy.Microservice ()Vcom.tencent.tsf.ratelimit.proxy.Microservice setMicroserviceName(Ljava/lang/String;)Vcom.tencent.tsf.ratelimit.proxy.Microservice setNamespaceId(Ljava/lang/String;)Vcom.tencent.tsf.ratelimit.proxy.Microservice getMicroserviceName()Ljava/lang/String;com.tencent.tsf.ratelimit.proxy.Microservice getNamespaceId()Ljava/lang/String;com.tencent.tsf.ratelimit.proxy.Microservice getMicroserviceId()Ljava/lang/String;com.tencent.tsf.ratelimit.proxy.Microservice setMicroserviceId(Ljava/lang/String;)Vcom.tencent.tsf.common.TsfPageQuery ()Vcom.tencent.tsf.common.TsfPageQuery xóa()Vcom.tencent.tsf.common.TsfPageQuery lấyOffset()Ljava/lang/Integer;com.tencent.tsf.common.TsfPageQuery đặtOffset(Ljava/lang/Integer;)Vcom.tencent.tsf.common.TsfPageQuery initDefault()Vcom.tencent.tsf.common.TsfPageQuery đặtSearchWord(Ljava/lang/String;)Vcom.tencent.tsf.common.TsfPageQuery lấyOrderType()Ljava/lang/Integer;com.tencent.tsf.common.TsfPageQuery lấyOrderTypeStr()Ljava/lang/String;com.tencent.tsf.common.TsfPageQuery đặtOrderType(Ljava/lang/Integer;)Vcom.tencent.tsf.common.TsfPageQuery getOrderBy()Ljava/lang/String;com.tencent.tsf.common.TsfPageQuery setOrderBy(Ljava/lang/String;)Vcom.tencent.tsf.common.TsfPageQuery getRealPage()Icom.tencent.tsf.common.TsfPageQuery transerPageQuery(Lcom/tencent/tsf/common/TsfPageQuery;)Vcom.tencent.tsf.common.TsfPageQuery getSearchWordLikeStr()Ljava/lang/String;com.tencent.tsf.common.TsfPageQuery getLimit()Ljava/lang/Integer;com.tencent.tsf.common.TsfPageQuery setLimit(Ljava/lang/Integer;)Vcom.tencent.tsf.common.TsfPageQuery getSearchWord()Ljava/lang/String;Affect(row-cnt:43) chi phí trong 12 ms.

lệnh giám sát-- Giám sát thực hiện phương pháp

Lệnh này là lệnh trả về không theo thời gian thực và trả về các giá trị thống kê cứ sau 120 giây một lần.

Trong khoảng thời gian thống kê, các thông tin như tổng số lần thực hiện phương thức, số lần thành công, số lần thất bại, tỷ lệ thực hiện trung bình, tỷ lệ thất bại, v.v.

Mô tả tham số.

[arthas@8738]$ monitor -hUSAGE: monitor [-b] [-c ] [--exclude-class-pattern ] [-h] [-n ] [--listenerId ] [-E ] [-v] class-pattern method-pattern [condition-express]TÓM TẮT: Theo dõi số liệu thống kê thực thi phương thức, ví dụ tổng số/thành công/thất bại, rt trung bình, tỷ lệ thất bại, v.v. Ví dụ: theo dõi org.apache.commons.lang.StringUtils isBlank theo dõi org.apache.commons.lang.StringUtils isBlank -c 5 theo dõi org.apache.commons.lang.StringUtils isBlank params[0]!=null monitor -b org.apache.commons.lang.StringUtils isBlank params[0]!=null monitor -E org\.apache\.commons\.lang\.StringUtils isBlank WIKI: https://arthas.aliyun.com/doc/monitorOPTIONS: -b, --before Đánh giá condition-express trước phương thức invoke-c, --cycle  Khoảng thời gian giám sát (tính bằng giây), mặc định là 60 giây --exclude-class-pattern  loại trừ mẫu tên lớp, sử dụng '.' hoặc '/' làm dấu phân cách-h, --help this help-n, --limits  Ngưỡng thời gian thực thi --listenerId  ListenerId-E đặc biệt, --regex  Cho phép biểu thức chính quy khớp (mặc định khớp ký tự đại diện)-v, --verbose Cho phép in thông tin chi tiết, giá trị mặc định là false. Đường dẫn và tên lớp của Pattern Matching Phương pháp Pattern Matching Biểu thức điều kiện theo kiểu ognl, ví dụ: TRUE : 1==1 TRUE : true FALSE : false TRUE : 'params.length>=0' FALSE : 1==2 '#cost>100'

Sử dụng các ví dụ.

[arthas@8738]$ monitor com.tencent.tsf.resource.ns.dao.NamespaceDao *Nhấn Q hoặc Ctrl+C để hủy.Affect(class count: 1 , method count: 15) cost in 104 ms, listenerId: 6timestamp class method total success fail avg-rt(ms) fail-rate--------------------------------------------------------------------------------------------------------------------------------------------------------------------------2021-09-09 18:26:58 com.tencent.tsf.resource.ns.dao.NamespaceDao countList 12 12 0 1.08 0.00%2021-09-09 18:26:58 com.tencent.tsf.resource.ns.dao.NamespaceDao getAuthWhereClause 28 28 0 0.18 0.00%2021-09-09 18:26:58 com.tencent.tsf.resource.ns.dao.NamespaceDao tìmDanh sách 2 2 0 1.09 0.00%

Đến đây là kết thúc bài viết về công cụ chẩn đoán quy trình java trực tuyến và tạo phẩm gỡ lỗi trực tuyến của Arthas. hỗ trợ tôi nhiều hơn trong tương lai! .

Liên kết gốc: https://www.cnblogs.com/TopGear/p/15508284.html.

Cuối cùng, bài viết này về giải thích chi tiết về tạo phẩm gỡ lỗi trực tuyến của công cụ chẩn đoán quy trình java trực tuyến Arthas kết thúc tại đây. Nếu bạn muốn biết thêm về giải thích chi tiết về tạo phẩm gỡ lỗi trực tuyến của công cụ chẩn đoán quy trình java trực tuyến Arthas, vui lòng tìm kiếm. cho các bài viết của CFSDN hoặc tiếp tục duyệt các bài viết liên quan, tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .

42 4 0
qq735679552
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress