Attach REPL console vào process JVM đang chạy
JVM
1
Scala
50
Clojure
12
Erlang
12
White

Ngoc Dao viết ngày 20/03/2016

Có vài loại JVM. JVM do Oracle cung cấp có tính năng gọi là attach API, cho phép gắn code mới vào thẳng vào process JVM đang chạy. Có vài cái hay:

  • Khi chạy process kia, ta không cần dùng tham số gì đặc biệt, ví dụ yêu cầu process chạy ở chế độ debug (process sẽ chạy chậm hơn bình thường). Có nghĩa tốc độ của process không bị ảnh hưởng, ta vẫn chạy bình thường trong chế độ production.
  • Sau khi attach, ta thực sự phẫu thuật trên cơ thể sống đang hoạt động, có thể kiểm tra giá trị của các object đang tồn tại trong bộ nhớ của process kia, hay chọc ngoáy gì cũng được!

Do đó, chiêu thức này có thể ứng dụng để điều tra khi production system gặp lỗi logic, hay chạy mã để tinh chỉnh process mà không cần tắt nó.

Chiêu thức này rất bình thường với lập trình viên Erlang. Erlang thì còn cao cấp hơn, cho phép debug, đặt breakpoint v.v. được luôn, y như khi ta debug trong IDE khi develop. Tuy nhiên đối với đa số lập trình viên JVM (Java, Scala v.v.) thì chiêu thức này rất mới mẻ.

Ở dưới xin giới thiệu 2 công cụ viết dựa trên attach API trên.

Scalive

Hãy xem

:

Screenshot

Rồi download và xem hướng dẫn cách dùng.

Công cụ Scalive do tác giả bài này viết. Có gì động viên, góp ý, đóng góp, muốn hỏi thêm chi tiết muốn cùng develop v.v. xin comment ở dưới, hoặc tạo issue.

Liverepl

Scalive ở trên cho bạn cửa sổ Scala console, còn Liverepl cho bạn cửa sổ Clojure console. Bắt chước, bạn có thể chế công cụ tương tự nhưng dùng Ruby, Python, JavaScript v.v.

Cách dùng Liverepl hơi khó Scalive. Theo hướng dẫn ở README của nó:

  1. Lấy source code của liverepl về
  2. Download clojure.jar, bỏ vào thư mục liverepl-server/lib
  3. Chạy lệnh ant, liverepl sẽ được biên dịch và mọi thứ cần thiết sẽ được gom lại trong thư mục tên là "build"
  4. Thêm quyền executable cho liverepl.sh để có thể chạy tập tin này

Chú ý cần sửa đường dẫn $JDK_HOME trong liverepl.sh cho hợp với hệ thống của bạn. Trên Mac OS tương đương với $JDK_HOME/lib/tools.jar là /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Classes/classes.jar.

Ví dụ cách dùng:

Giả sử bạn muốn attach vào process có dùng Ehcache, để gõ lệnh để Ehcache lưu cache trên đĩa cứng, để khi tắt process rồi bật lại, thì dữ liệu trong cache không bị mất. Muốn vậy bạn không được kill process bất thình lình khi nó đang chạy, mà phải gọi manager.shutdown rồi mới tắt process. Như vậy thì tập tin .data lưu dữ liệu và tập tin .index lưu metadata mới toàn vẹn, lần sau bật Ehcache lên nó mới load được cache đã lưu. Do đó cái ta muốn là chui vào process này để gọi manager.shutdown:

Chạy liverepl.sh, nó sẽ liệt kê các process có thể can thiệp. Ví dụ:

$ ./liverepl.sh

liverepl
Usage: liverepl 

List of Java processes
pid    Details
1099   net.djpowell.liverepl.client.Main /Users/ngoc/src/liverepl/b
1088   /Users/ngoc/opt/sbt/sbt-launch-0.7.5.RC0.jar run</code></pre>

Chọn process 1088:

$ ./liverepl.sh 1088

List of ClassLoaders for process #1088

System Class Loader:

#Id  ClassLoader          : Info
#0   AppClassLoader       : 

Thread Context Class Loaders:

#Id  ClassLoader          : Info
#1   URLClassLoader       : net.sf.ehcache.CacheManager@30d58ce2 #18 [trap.exit]

Ta cần chọn sẽ load REPL của Clojure vào class loader nào thích hợp. Ở đây chọn số 1:

$ ./liverepl.sh 1088 1
Clojure 1.2.0

user=> (import 'net.sf.ehcache.CacheManager)
net.sf.ehcache.CacheManager

user=> (def m (CacheManager/getInstance))
#'user/m

user=> (.shutdown m)
nil

Shutdown Ehcache xong, nếu cần ta (System/exit 0) là tắt được process từ xa theo đúng qui trình Ehcache qui định.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Ngoc Dao

102 bài viết.
252 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
56 6
Làm thế nào để nâng cấp trang web mà không làm gián đoạn dịch vụ? Đây là câu hỏi phỏng vấn các công ty lớn thường hỏi khi bạn xin vào vị trí làm lậ...
Ngoc Dao viết 2 năm trước
56 6
White
32 0
Bài viết này giải thích sự khác khác nhau giữa hai ngành khoa học máy tính (computer science) và kĩ thuật phần mềm (software engineering), hi vọng ...
Ngoc Dao viết gần 2 năm trước
32 0
White
28 1
Nếu là team leader, giám đốc công ty hay tướng chỉ huy quân đội, vấn đề cơ bản bạn gặp phải là “hướng mọi người đi theo con đường bạn chỉ ra”. Thử...
Ngoc Dao viết gần 2 năm trước
28 1
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
102 bài viết.
252 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!