2012-04-20 50 views
7

Tôi cố gắng để thiết lập một breakpoint có điều kiện trong mã decompiled, nhưng Eclipse tiếp tục đem lại cho tôi những lỗi:Điểm ngắt điều kiện của Eclipse bị hỏng?

Conditional breakpoint has compilation error(s)

Reason: Evaluations must contain either an expression or a block of well-formed statments

trường hợp của tôi là khá đơn giản, chỉ cần cố gắng để so sánh với một giá trị chuỗi. Tôi đã thử tất cả những điều sau đây và tôi nhận được lỗi với mỗi một đơn:

myObj.toString() == "abc123" 
myObj.toString().equals("abc123") 
if(myObj.toString() == "abc123"){ return true; } 
true == true 

Tôi cũng đã thử mọi sự kết hợp của việc có hay không có một dấu chấm phẩy ở cuối dòng (s) và mọi sự kết hợp khoảng cách và dòng mới và mọi kết hợp có hoặc không có {} xung quanh tình trạng của tôi. Về cơ bản, tôi không biết tại sao điều này không hoạt động ...

Mã tôi đang cố gỡ lỗi thông qua bên trong một cái bình được giải mã bằng JD-Eclipse. Các điểm ngắt bình thường hoạt động tốt trong mã này.

Có ai biết điều gì đang xảy ra ở đây không ???

+0

Bạn đã biên dịch lại bình từ nguồn bị giải mã hay không, nếu không mã sẽ không khớp với bình, ví dụ: tên biến cục bộ – vickirk

+0

Hmm nhưng tôi nhận được một lỗi khác nói rằng tên biến là sai khi tôi cố gắng sử dụng tên biến không tồn tại trong nguồn ... – kand

+0

Bước một là tìm hiểu xem việc giải mã có phải là vấn đề không. Việc thiết lập một điểm ngắt có điều kiện trong mã 'bình thường' trong một dự án Eclipse có hoạt động không? – sharakan

Trả lời

2

Trang Eclipse FAQ này chứa cú pháp định nghĩa CBP phù hợp và các lý do phổ biến nhất khiến chúng không hoạt động. Trong trường hợp của bạn, tôi nghĩ rằng những điều sau đây được áp dụng:

This can happen if you are setting a breakpoint in a class whose class file does not contain a local variable table. For example, let's say you want to set a conditional breakpoint on Class.forName(String). If you have a source attachment for rt.jar the content assist will allow you to refer to the argument by its variable name, className. However, at debug runtime, the variable name will only be known if the class file contains a local variable table. Depending on the options used at compilation time, this information may have been stripped from the class file.

JD có thể bịa đặt tên biến trong khi dịch ngược jar của bạn, vì vậy sử dụng "myObj" trong biểu thức điều kiện tạo ra một lỗi thời gian biên dịch.

+2

Âm thanh đầy hứa hẹn, nhưng OP đã cố gắng thử == true, điều này sẽ hoạt động ngay cả khi biến tên bị xé! – sharakan

+0

@sharakan Bạn nói đúng! Thats lạ. Không chắc chắn những gì có thể sai với true == true. – mazaneicha

+0

@mazaneicha Có vẻ như không có bất kỳ nội dung nào trên trang Hỏi đáp đó. Có cách nào tôi thực sự có thể thấy bảng được tạo ra cho tập tin lớp học của tôi? – kand

2

Có thể điểm ngắt có điều kiện ít hơn so với làm việc nói chung. Xem xét, ví dụ:

https://bugs.eclipse.org/bugs/show_bug.cgi?id=278146

+0

FYI, Điều này đã được thực hiện một bản sao của https://bugs.eclipse.org/bugs/show_bug.cgi?id=341232 được liệt kê là cố định trong 4.3 M6. – studgeek

1

Nó có thể là một lỗi trong nhật thực. Những gì eclipse làm là dệt một phương pháp mới hoặc một số như vậy vào nguồn cho tập tin bạn thiết lập các điểm ngắt và biên dịch nó lên. Nếu có điều gì sai trong quá trình này, điểm ngắt có điều kiện của bạn sẽ thất bại một cách bí ẩn.

Bạn có thể làm theo cách tiếp cận tôi sử dụng dưới đây, chạy eclipse trong debug để thử và theo dõi các vấn đề: -

https://bugs.eclipse.org/bugs/show_bug.cgi?id=341232#c21

0

Trong trường hợp của "true == true" điều kiện bạn chỉ nên thêm lợi nhuận tuyên bố:

return true == true; 

Đối với phần còn lại của vấn đề thiếu bảng biến cục bộ, hãy giải thích. 1 để Mazaneicha cho điều đó.

0

Trong trường hợp của "== true true" điều kiện bạn chỉ nên thêm lệnh return:

return true == true; 

Đối với phần còn lại của vấn đề thiếu bảng biến địa phương nên có lời giải thích. 1 để Mazaneicha cho điều đó.

Nếu bạn đang cố gắng để chỉ một đối số phương pháp theo tên của nó sau đó chỉ cần cố gắng thay đổi tên thành "arg0", "arg1", vv

Ví dụ, bạn có thể làm như thế này:

arg0 == null 

Dễ đoán tên biến.Chỉ cần đặt breakpoint vô điều kiện và xem danh sách các biến trong khung nhìn Variables.

0

Chỉ cần thêm những gì có thể giúp người khác vì tôi vừa giải quyết vấn đề này sau một thời gian. Tôi đang sử dụng JD-Eclipse để gỡ lỗi, quá, khi tôi nhận được vấn đề này.

Đảm bảo rằng tất cả các tệp jar cần thiết đều có trong Classpath. Tuyên bố điều kiện của bạn có thể rất đơn giản, chẳng hạn như "trả về true"; nhưng một khi hộp kiểm "breakpoint breakpoint" được chọn, nó có thể là (tôi cũng không thể chắc chắn) trình gỡ rối Eclipse sẽ kiểm tra đường dẫn lớp của dự án Eclipse dựa vào phạm vi lớn hơn và không chỉ dòng "trả về true" đó.

Vì tôi đang sử dụng JD-Eclipse, tôi không bận tâm thêm tất cả các tệp jar cần thiết. Vấn đề đã được giải quyết sau khi tôi thêm tệp jar vào đường dẫn lớp của dự án

Nếu bạn đang sử dụng gỡ lỗi từ xa, bạn cũng có thể thử cấu hình sao cho JDK của dự án Eclipse của bạn tương thích với JRE của JVM.

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