2010-02-26 34 views
7

Trong dự án thiết bị đo đạc bytecode của tôi, tôi thường xuyên vấp ngã trên VerifyErrors. Tuy nhiên, Trình xác minh java mặc định cung cấp ít thông tin về hướng dẫn nào dẫn đến lỗi (nó chỉ cung cấp phương thức và một thông báo nhỏ). Có bất kỳ trình xác minh bytecode độc ​​lập nào cung cấp trợ giúp nâng cao hơn một chút trong việc định vị lỗi, ít nhất là vị trí lệnh chính xác không? Cảm ơn bạn.Độc lập Bytecode Verifier

Trả lời

2

Giống như với bất kỳ dự án nào liên quan đến mã bytecode JVM, trước tiên tôi sẽ kiểm tra xem liệu BCEL có bất kỳ thứ gì có thể hữu ích cho bạn hay không. Ngoài ra, có lẽ FindBugs có thể giúp - mặc dù tôi không chắc liệu nó có giả định bytecode có thể kiểm chứng được hay không.

+1

Tại sao tôi không nghĩ về điều đó. Tôi đang thực sự sử dụng BCEL, nhưng nó không bao giờ xảy ra với tôi để kiểm tra xác minh của nó. Nó thực sự được gọi là JustIce. –

2

Tôi cũng đang tìm kiếm cái gì đó sẽ báo cáo tiềm năng xác minh lỗi, nhưng đặc biệt là IncompatibleClassChangeError s. Tôi đã viết một dự án thử nghiệm nhỏ với một lớp API và một lớp ứng dụng khách gọi API khác, cộng với một lớp chính để chạy trình kiểm tra; sau đó thay đổi API, biên dịch lại nó nhưng không phải là khách hàng, và kiểm tra để xem những gì có thể bị bắt. Đã sử dụng -target 7 mặc dù không có tính năng JDK 7 đặc biệt nào cho bây giờ.

Đầu tiên và rõ ràng nhất, Class.forName có thể tìm thấy lỗi nhất định trong chữ ký của lớp khách hàng, nhưng dường như không kiểm tra các phương thức gọi cho các phương thức API không tồn tại và tương tự, ngay cả khi bạn gọi getDeclaredMethods; các lỗi được báo cáo bởi máy ảo chỉ khi dòng mã có vấn đề thực sự chạy.

JustIce trong BCEL 5.2 dường như là dễ nhất;

org.apache.bcel.verifier.Verifier.main(new String[] {clazz}); 

hiện công việc:

Pass 3a, method number 1 ['public void m()']: 
VERIFIED_REJECTED 
Instruction invokestatic[184](3) 4 constraint violated: 
    Referenced method 'x' with expected signature '()V' not found in class 'API'. 
    .... 

tôi đã cố gắng ASM 4.0, nhưng

org.objectweb.asm.util.CheckClassAdapter.main(new String[] {clazz}); 

không hoạt động; có lẽ nó kiểm tra định dạng của các phương thức, nhưng không phải là liên kết. Inline main và qua checkDataFlow=true không giúp ích gì.

Tìm kiếm, tôi cũng tìm thấy https://kenai.com/hg/maxine~maxine/file/8429d3ebc036/com.oracle.max.vm/test/test/com/sun/max/vm/verifier/CommandLineVerifier.java nhưng tôi không thể tìm thấy bất kỳ cách nào để thực hiện công việc này; kiểm tra đơn vị đi kèm sẽ ném một số ClassNotFoundException khi chạy.