提交 b2801f75 编写于 作者: B bpittore

6972759: Step over not working after thrown exception and Pop

Summary: reset jvmtithreadstate exception state after frame pop and forceearlyreturn processed
Reviewed-by: minqi, dholmes, dlong
Contributed-by: bill.pittore@oracle.com
上级 887fcf69
...@@ -319,6 +319,15 @@ void JvmtiThreadState::process_pending_step_for_popframe() { ...@@ -319,6 +319,15 @@ void JvmtiThreadState::process_pending_step_for_popframe() {
// clearing the flag indicates we are done with the PopFrame() dance // clearing the flag indicates we are done with the PopFrame() dance
clr_pending_step_for_popframe(); clr_pending_step_for_popframe();
// If exception was thrown in this frame, need to reset jvmti thread state.
// Single stepping may not get enabled correctly by the agent since
// exception state is passed in MethodExit event which may be sent at some
// time in the future. JDWP agent ignores MethodExit events if caused by
// an exception.
//
if (is_exception_detected()) {
clear_exception_detected();
}
// If step is pending for popframe then it may not be // If step is pending for popframe then it may not be
// a repeat step. The new_bci and method_id is same as current_bci // a repeat step. The new_bci and method_id is same as current_bci
// and current method_id after pop and step for recursive calls. // and current method_id after pop and step for recursive calls.
...@@ -385,6 +394,15 @@ void JvmtiThreadState::process_pending_step_for_earlyret() { ...@@ -385,6 +394,15 @@ void JvmtiThreadState::process_pending_step_for_earlyret() {
// the ForceEarlyReturn() dance // the ForceEarlyReturn() dance
clr_pending_step_for_earlyret(); clr_pending_step_for_earlyret();
// If exception was thrown in this frame, need to reset jvmti thread state.
// Single stepping may not get enabled correctly by the agent since
// exception state is passed in MethodExit event which may be sent at some
// time in the future. JDWP agent ignores MethodExit events if caused by
// an exception.
//
if (is_exception_detected()) {
clear_exception_detected();
}
// If step is pending for earlyret then it may not be a repeat step. // If step is pending for earlyret then it may not be a repeat step.
// The new_bci and method_id is same as current_bci and current // The new_bci and method_id is same as current_bci and current
// method_id after earlyret and step for recursive calls. // method_id after earlyret and step for recursive calls.
......
...@@ -165,6 +165,10 @@ class JvmtiThreadState : public CHeapObj { ...@@ -165,6 +165,10 @@ class JvmtiThreadState : public CHeapObj {
inline bool is_exception_caught() { return _exception_caught; } inline bool is_exception_caught() { return _exception_caught; }
inline void set_exception_detected() { _exception_detected = true; inline void set_exception_detected() { _exception_detected = true;
_exception_caught = false; } _exception_caught = false; }
inline void clear_exception_detected() {
_exception_detected = false;
assert(_exception_caught == false, "_exception_caught is out of phase");
}
inline void set_exception_caught() { _exception_caught = true; inline void set_exception_caught() { _exception_caught = true;
_exception_detected = false; } _exception_detected = false; }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册