2010-08-13 30 views
5

Tôi đang viết mã JVMTI cho các chương trình Java hồ sơ, chủ yếu đòi hỏi phải thu thập dấu vết ngăn xếp từ các chuỗi ngẫu nhiên tại các khoảng thời gian cố định bằng cách sử dụng hàm AsyncGetCallTrace. Vì vậy, tôi có thể có được các cấu trúc CallTrace, mỗi cấu trúc chứa một mảng các cấu trúc CallFrame, chứa các dữ liệu về các khung riêng lẻ trong một dấu vết ngăn xếp. Cụ thể, các dữ liệu này bao gồm: jmethodID method_id (ID của phương thức java nơi khung được đặt), và: jint lineno (BCI của phương thức trong tệp .class, theo như tôi hiểu tài liệu). Tôi dường như không thể tìm cách chuyển đổi "lineno" này thành số dòng mã nguồn tương ứng bằng cách sử dụng khung JVMTI (xem tệp jvmti.h, nằm trong/usr/lib/jvm/java-6-sun/include, ít nhất trên Linux). Trong thực tế, ngay cả ngoài khung công tác JVMTI, điều duy nhất tôi có thể tìm thấy trên web cho đến nay là: http://jakarta.apache.org/bcel/apidocs/org/apache/bcel/classfile/LineNumberTable.html, nhưng thậm chí điều này có thể không làm những gì tôi muốn và yêu cầu cài đặt bổ sung, VÀ yêu cầu tôi xử lý dữ liệu, được tạo bởi mã C++ JMVTI, sử dụng một chương trình Java riêng biệt.Chuyển đổi BCI (chỉ số bytecode) sang số dòng mã

Nếu có ai biết cách chuyển đổi BCI sang các số dòng mã nguồn từ bên trong JVMTI (hoặc thậm chí bằng bất kỳ cách nào), vui lòng trợ giúp!

[Nếu ai đó biết lĩnh vực này tốt, xin vui lòng cho tôi biết, kể từ khi tôi có thêm một vài câu hỏi để hỏi về quá trình này.]

Trả lời

5

Tôi đoán tôi hơi figured this out. Phương pháp chính để sử dụng là jvmti-> GetLineNumberTable (...), điền vào một mảng jvmtiLineNumberEntry. Với số dòng BCI n (được ánh xạ tới số dòng nguồn), ta có thể kiểm tra xem int i là gì: jvmtiLineNumberEntryArray [i] < = n < jvmtiLineNumberEntryArray [i + 1]. Sau đó, int i này là số dòng mã nguồn tương ứng mong muốn.

Một nắm bắt được rằng AsyncGetCallTrace, đối với một số lý do, luôn trả BCIS lạ, vì vậy mặc dù các bản đồ cho số dòng mã nguồn chính xác, họ vẫn không chính xác, vì BCIS gốc là không chính xác. Tại sao điều này là, tôi không biết. Tôi đã hy vọng sẽ sử dụng Sun Studio profiler, nó cũng sử dụng AsyncGetCallTrace, để kiểm tra xem các số dòng trả về có giống như chúng dành cho profiler của tôi hay không. Trong trường hợp đó, hàm AsyncGetCallTrace không chính xác. Nhưng cho đến nay, việc sử dụng Sun Studio đã trở thành một thách thức của riêng mình. NẾU BẤT CỨ AI BIẾT LÀM THẾ NÀO ĐỂ SỬ DỤNG CÔNG CỤ NÀY, XIN VUI LÒNG GIÚP!

Điểm lớn hơn là các phương thức Java thường được gạch chân, vì vậy các số dòng không luôn luôn ánh xạ chính xác. Trong thực tế, MIGHT này là nguyên nhân của vấn đề được mô tả trong đoạn trên, mặc dù điều này dường như không dựa trên những con số tôi đã nhìn thấy. Dưới đây là một số thông tin về cách giải quyết vấn đề nội tuyến: http://developer.amd.com/documentation/articles/pages/JVMTIEventPiggybacking.aspx

Các vấn đề liên quan