2 * Copyright (C) 2008 The Android Open Source Project
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include "jdwp/jdwp_event.h"
19 #include <stddef.h> /* for offsetof() */
24 #include "art_field-inl.h"
25 #include "art_method-inl.h"
26 #include "base/logging.h"
27 #include "base/stringprintf.h"
29 #include "jdwp/jdwp_constants.h"
30 #include "jdwp/jdwp_expand_buf.h"
31 #include "jdwp/jdwp_priv.h"
32 #include "jdwp/object_registry.h"
33 #include "scoped_thread_state_change-inl.h"
34 #include "thread-inl.h"
36 #include "handle_scope-inl.h"
41 The event add/remove stuff usually happens from the debugger thread,
42 in response to requests from the debugger, but can also happen as the
43 result of an event in an arbitrary thread (e.g. an event with a "count"
44 mod expires). It's important to keep the event list locked when processing
47 Event posting can happen from any thread. The JDWP thread will not usually
48 post anything but VM start/death, but if a JDWP request causes a class
49 to be loaded, the ClassPrepare event will come from the JDWP thread.
52 We can have serialization issues when we post an event to the debugger.
53 For example, a thread could send an "I hit a breakpoint and am suspending
54 myself" message to the debugger. Before it manages to suspend itself, the
55 debugger's response ("not interested, resume thread") arrives and is
56 processed. We try to resume a thread that hasn't yet suspended.
58 This means that, after posting an event to the debugger, we need to wait
59 for the event thread to suspend itself (and, potentially, all other threads)
60 before processing any additional requests from the debugger. While doing
61 so we need to be aware that multiple threads may be hitting breakpoints
62 or other events simultaneously, so we either need to wait for all of them
63 or serialize the events with each other.
65 The current mechanism works like this:
67 - If I'm going to suspend, grab the "I am posting an event" token. Wait
68 for it if it's not currently available.
69 - Post the event to the debugger.
70 - If appropriate, suspend others and then myself. As part of suspending
71 myself, release the "I am posting" token.
73 - When an event arrives, see if somebody is posting an event. If so,
74 sleep until we can acquire the "I am posting an event" token. Release
75 it immediately and continue processing -- the event we have already
76 received should not interfere with other events that haven't yet
79 Some care must be taken to avoid deadlock:
81 - thread A and thread B exit near-simultaneously, and post thread-death
82 events with a "suspend all" clause
83 - thread A gets the event token, thread B sits and waits for it
84 - thread A wants to suspend all other threads, but thread B is waiting
85 for the token and can't be suspended
87 So we need to mark thread B in such a way that thread A doesn't wait for it.
89 If we just bracket the "grab event token" call with a change to VMWAIT
90 before sleeping, the switch back to RUNNING state when we get the token
91 will cause thread B to suspend (remember, thread A's global suspend is
92 still in force, even after it releases the token). Suspending while
93 holding the event token is very bad, because it prevents the JDWP thread
94 from processing incoming messages.
96 We need to change to VMWAIT state at the *start* of posting an event,
97 and stay there until we either finish posting the event or decide to
98 put ourselves to sleep. That way we don't interfere with anyone else and
99 don't allow anyone else to interfere with us.
107 * Stuff to compare against when deciding if a mod matches. Only the
108 * values for mods valid for the event being evaluated will be filled in.
109 * The rest will be zeroed.
110 * Must be allocated on the stack only. This is enforced by removing the
114 explicit ModBasket(Thread* self)
115 : hs(self), pLoc(nullptr), thread(self),
116 locationClass(hs.NewHandle<mirror::Class>(nullptr)),
117 exceptionClass(hs.NewHandle<mirror::Class>(nullptr)),
120 thisPtr(hs.NewHandle<mirror::Object>(nullptr)) { }
122 StackHandleScope<3> hs;
123 const EventLocation* pLoc; /* LocationOnly */
124 std::string className; /* ClassMatch/ClassExclude */
125 Thread* const thread; /* ThreadOnly */
126 MutableHandle<mirror::Class> locationClass; /* ClassOnly */
127 MutableHandle<mirror::Class> exceptionClass; /* ExceptionOnly */
128 bool caught; /* ExceptionOnly */
129 ArtField* field; /* FieldOnly */
130 MutableHandle<mirror::Object> thisPtr; /* InstanceOnly */
131 /* nothing for StepOnly -- handled differently */
134 DISALLOW_ALLOCATION(); // forbids allocation on the heap.
135 DISALLOW_IMPLICIT_CONSTRUCTORS(ModBasket);
138 static bool NeedsFullDeoptimization(JdwpEventKind eventKind) {
139 if (!Dbg::RequiresDeoptimization()) {
140 // We don't need deoptimization for debugging.
144 case EK_METHOD_ENTRY:
146 case EK_METHOD_EXIT_WITH_RETURN_VALUE:
147 case EK_FIELD_ACCESS:
148 case EK_FIELD_MODIFICATION:
155 // Returns the instrumentation event the DebugInstrumentationListener must
156 // listen to in order to properly report the given JDWP event to the debugger.
157 static uint32_t GetInstrumentationEventFor(JdwpEventKind eventKind) {
161 return instrumentation::Instrumentation::kDexPcMoved;
163 case EK_EXCEPTION_CATCH:
164 return instrumentation::Instrumentation::kExceptionCaught;
165 case EK_METHOD_ENTRY:
166 return instrumentation::Instrumentation::kMethodEntered;
168 case EK_METHOD_EXIT_WITH_RETURN_VALUE:
169 return instrumentation::Instrumentation::kMethodExited;
170 case EK_FIELD_ACCESS:
171 return instrumentation::Instrumentation::kFieldRead;
172 case EK_FIELD_MODIFICATION:
173 return instrumentation::Instrumentation::kFieldWritten;
180 * Add an event to the list. Ordering is not important.
182 * If something prevents the event from being registered, e.g. it's a
183 * single-step request on a thread that doesn't exist, the event will
184 * not be added to the list, and an appropriate error will be returned.
186 JdwpError JdwpState::RegisterEvent(JdwpEvent* pEvent) {
187 CHECK(pEvent != nullptr);
188 CHECK(pEvent->prev == nullptr);
189 CHECK(pEvent->next == nullptr);
193 * If one or more "break"-type mods are used, register them with
196 DeoptimizationRequest req;
197 for (int i = 0; i < pEvent->modCount; i++) {
198 const JdwpEventMod* pMod = &pEvent->mods[i];
199 if (pMod->modKind == MK_LOCATION_ONLY) {
200 // Should only concern breakpoint, field access, field modification, step, and exception
202 // However breakpoint requires specific handling. Field access, field modification and step
203 // events need full deoptimization to be reported while exception event is reported during
204 // exception handling.
205 if (pEvent->eventKind == EK_BREAKPOINT) {
206 Dbg::WatchLocation(&pMod->locationOnly.loc, &req);
208 } else if (pMod->modKind == MK_STEP) {
209 /* should only be for EK_SINGLE_STEP; should only be one */
210 JdwpStepSize size = static_cast<JdwpStepSize>(pMod->step.size);
211 JdwpStepDepth depth = static_cast<JdwpStepDepth>(pMod->step.depth);
212 JdwpError status = Dbg::ConfigureStep(pMod->step.threadId, size, depth);
213 if (status != ERR_NONE) {
218 if (NeedsFullDeoptimization(pEvent->eventKind)) {
219 CHECK_EQ(req.GetKind(), DeoptimizationRequest::kNothing);
220 CHECK(req.Method() == nullptr);
221 req.SetKind(DeoptimizationRequest::kFullDeoptimization);
223 Dbg::RequestDeoptimization(req);
225 uint32_t instrumentation_event = GetInstrumentationEventFor(pEvent->eventKind);
226 if (instrumentation_event != 0) {
227 DeoptimizationRequest req;
228 req.SetKind(DeoptimizationRequest::kRegisterForEvent);
229 req.SetInstrumentationEvent(instrumentation_event);
230 Dbg::RequestDeoptimization(req);
237 MutexLock mu(Thread::Current(), event_list_lock_);
238 if (event_list_ != nullptr) {
239 pEvent->next = event_list_;
240 event_list_->prev = pEvent;
242 event_list_ = pEvent;
246 Dbg::ManageDeoptimization();
252 * Remove an event from the list. This will also remove the event from
253 * any optimization tables, e.g. breakpoints.
255 * Does not free the JdwpEvent.
257 * Grab the eventLock before calling here.
259 void JdwpState::UnregisterEvent(JdwpEvent* pEvent) {
260 if (pEvent->prev == nullptr) {
261 /* head of the list */
262 CHECK(event_list_ == pEvent);
264 event_list_ = pEvent->next;
266 pEvent->prev->next = pEvent->next;
269 if (pEvent->next != nullptr) {
270 pEvent->next->prev = pEvent->prev;
271 pEvent->next = nullptr;
273 pEvent->prev = nullptr;
277 * Unhook us from the interpreter, if necessary.
279 DeoptimizationRequest req;
280 for (int i = 0; i < pEvent->modCount; i++) {
281 JdwpEventMod* pMod = &pEvent->mods[i];
282 if (pMod->modKind == MK_LOCATION_ONLY) {
283 // Like in RegisterEvent, we need specific handling for breakpoint only.
284 if (pEvent->eventKind == EK_BREAKPOINT) {
285 Dbg::UnwatchLocation(&pMod->locationOnly.loc, &req);
288 if (pMod->modKind == MK_STEP) {
289 /* should only be for EK_SINGLE_STEP; should only be one */
290 Dbg::UnconfigureStep(pMod->step.threadId);
293 if (NeedsFullDeoptimization(pEvent->eventKind)) {
294 CHECK_EQ(req.GetKind(), DeoptimizationRequest::kNothing);
295 CHECK(req.Method() == nullptr);
296 req.SetKind(DeoptimizationRequest::kFullUndeoptimization);
298 Dbg::RequestDeoptimization(req);
300 uint32_t instrumentation_event = GetInstrumentationEventFor(pEvent->eventKind);
301 if (instrumentation_event != 0) {
302 DeoptimizationRequest req;
303 req.SetKind(DeoptimizationRequest::kUnregisterForEvent);
304 req.SetInstrumentationEvent(instrumentation_event);
305 Dbg::RequestDeoptimization(req);
309 CHECK(event_list_size_ != 0 || event_list_ == nullptr);
313 * Remove the event with the given ID from the list.
316 void JdwpState::UnregisterEventById(uint32_t requestId) {
319 MutexLock mu(Thread::Current(), event_list_lock_);
321 for (JdwpEvent* pEvent = event_list_; pEvent != nullptr; pEvent = pEvent->next) {
322 if (pEvent->requestId == requestId) {
324 UnregisterEvent(pEvent);
326 break; /* there can be only one with a given ID */
332 Dbg::ManageDeoptimization();
334 // Failure to find the event isn't really an error. For instance, it looks like Eclipse will
335 // try to be extra careful and will explicitly remove one-off single-step events (using a
336 // 'count' event modifier of 1). So the event may have already been removed as part of the
337 // event notification (see JdwpState::CleanupMatchList).
338 VLOG(jdwp) << StringPrintf("No match when removing event reqId=0x%04x", requestId);
343 * Remove all entries from the event list.
345 void JdwpState::UnregisterAll() {
346 MutexLock mu(Thread::Current(), event_list_lock_);
348 JdwpEvent* pEvent = event_list_;
349 while (pEvent != nullptr) {
350 JdwpEvent* pNextEvent = pEvent->next;
352 UnregisterEvent(pEvent);
357 event_list_ = nullptr;
361 * Allocate a JdwpEvent struct with enough space to hold the specified
362 * number of mod records.
364 JdwpEvent* EventAlloc(int numMods) {
366 int allocSize = offsetof(JdwpEvent, mods) + numMods * sizeof(newEvent->mods[0]);
367 newEvent = reinterpret_cast<JdwpEvent*>(malloc(allocSize));
368 memset(newEvent, 0, allocSize);
375 * Do not call this until the event has been removed from the list.
377 void EventFree(JdwpEvent* pEvent) {
378 if (pEvent == nullptr) {
382 /* make sure it was removed from the list */
383 CHECK(pEvent->prev == nullptr);
384 CHECK(pEvent->next == nullptr);
385 /* want to check state->event_list_ != pEvent */
388 * Free any hairy bits in the mods.
390 for (int i = 0; i < pEvent->modCount; i++) {
391 if (pEvent->mods[i].modKind == MK_CLASS_MATCH) {
392 free(pEvent->mods[i].classMatch.classPattern);
393 pEvent->mods[i].classMatch.classPattern = nullptr;
395 if (pEvent->mods[i].modKind == MK_CLASS_EXCLUDE) {
396 free(pEvent->mods[i].classExclude.classPattern);
397 pEvent->mods[i].classExclude.classPattern = nullptr;
405 * Run through the list and remove any entries with an expired "count" mod
406 * from the event list.
408 void JdwpState::CleanupMatchList(const std::vector<JdwpEvent*>& match_list) {
409 for (JdwpEvent* pEvent : match_list) {
410 for (int i = 0; i < pEvent->modCount; ++i) {
411 if (pEvent->mods[i].modKind == MK_COUNT && pEvent->mods[i].count.count == 0) {
412 VLOG(jdwp) << StringPrintf("##### Removing expired event (requestId=%#" PRIx32 ")",
414 UnregisterEvent(pEvent);
423 * Match a string against a "restricted regular expression", which is just
424 * a string that may start or end with '*' (e.g. "*.Foo" or "java.*").
426 * ("Restricted name globbing" might have been a better term.)
428 static bool PatternMatch(const char* pattern, const std::string& target) {
429 size_t patLen = strlen(pattern);
430 if (pattern[0] == '*') {
432 if (target.size() < patLen) {
435 return strcmp(pattern+1, target.c_str() + (target.size()-patLen)) == 0;
436 } else if (pattern[patLen-1] == '*') {
437 return strncmp(pattern, target.c_str(), patLen-1) == 0;
439 return strcmp(pattern, target.c_str()) == 0;
444 * See if the event's mods match up with the contents of "basket".
446 * If we find a Count mod before rejecting an event, we decrement it. We
447 * need to do this even if later mods cause us to ignore the event.
449 static bool ModsMatch(JdwpEvent* pEvent, const ModBasket& basket)
450 REQUIRES_SHARED(Locks::mutator_lock_) {
451 JdwpEventMod* pMod = pEvent->mods;
453 for (int i = pEvent->modCount; i > 0; i--, pMod++) {
454 switch (pMod->modKind) {
456 CHECK_GT(pMod->count.count, 0);
458 if (pMod->count.count > 0) {
463 CHECK(false); // should not be getting these
466 if (!Dbg::MatchThread(pMod->threadOnly.threadId, basket.thread)) {
471 if (!Dbg::MatchType(basket.locationClass.Get(), pMod->classOnly.refTypeId)) {
476 if (!PatternMatch(pMod->classMatch.classPattern, basket.className)) {
480 case MK_CLASS_EXCLUDE:
481 if (PatternMatch(pMod->classMatch.classPattern, basket.className)) {
485 case MK_LOCATION_ONLY:
486 if (!Dbg::MatchLocation(pMod->locationOnly.loc, *basket.pLoc)) {
490 case MK_EXCEPTION_ONLY:
491 if (pMod->exceptionOnly.refTypeId != 0 &&
492 !Dbg::MatchType(basket.exceptionClass.Get(), pMod->exceptionOnly.refTypeId)) {
495 if ((basket.caught && !pMod->exceptionOnly.caught) ||
496 (!basket.caught && !pMod->exceptionOnly.uncaught)) {
501 if (!Dbg::MatchField(pMod->fieldOnly.refTypeId, pMod->fieldOnly.fieldId, basket.field)) {
506 if (!Dbg::MatchThread(pMod->step.threadId, basket.thread)) {
510 case MK_INSTANCE_ONLY:
511 if (!Dbg::MatchInstance(pMod->instanceOnly.objectId, basket.thisPtr.Get())) {
516 LOG(FATAL) << "unknown mod kind " << pMod->modKind;
524 * Find all events of type "event_kind" with mods that match up with the
525 * rest of the arguments while holding the event list lock. This method
526 * is used by FindMatchingEvents below.
528 * Found events are appended to "match_list" so this may be called multiple times for grouped
531 * DO NOT call this multiple times for the same eventKind, as Count mods are
532 * decremented during the scan.
534 void JdwpState::FindMatchingEventsLocked(JdwpEventKind event_kind, const ModBasket& basket,
535 std::vector<JdwpEvent*>* match_list) {
536 for (JdwpEvent* pEvent = event_list_; pEvent != nullptr; pEvent = pEvent->next) {
537 if (pEvent->eventKind == event_kind && ModsMatch(pEvent, basket)) {
538 match_list->push_back(pEvent);
544 * Find all events of type "event_kind" with mods that match up with the
545 * rest of the arguments and return true if at least one event matches,
548 * Found events are appended to "match_list" so this may be called multiple
549 * times for grouped events.
551 * DO NOT call this multiple times for the same eventKind, as Count mods are
552 * decremented during the scan.
554 bool JdwpState::FindMatchingEvents(JdwpEventKind event_kind, const ModBasket& basket,
555 std::vector<JdwpEvent*>* match_list) {
556 MutexLock mu(Thread::Current(), event_list_lock_);
557 match_list->reserve(event_list_size_);
558 FindMatchingEventsLocked(event_kind, basket, match_list);
559 return !match_list->empty();
563 * Scan through the list of matches and determine the most severe
566 static JdwpSuspendPolicy ScanSuspendPolicy(const std::vector<JdwpEvent*>& match_list) {
567 JdwpSuspendPolicy policy = SP_NONE;
569 for (JdwpEvent* pEvent : match_list) {
570 if (pEvent->suspend_policy > policy) {
571 policy = pEvent->suspend_policy;
579 * Three possibilities:
580 * SP_NONE - do nothing
581 * SP_EVENT_THREAD - suspend ourselves
582 * SP_ALL - suspend everybody except JDWP support thread
584 void JdwpState::SuspendByPolicy(JdwpSuspendPolicy suspend_policy, JDWP::ObjectId thread_self_id) {
585 VLOG(jdwp) << "SuspendByPolicy(" << suspend_policy << ")";
586 if (suspend_policy == SP_NONE) {
590 if (suspend_policy == SP_ALL) {
593 CHECK_EQ(suspend_policy, SP_EVENT_THREAD);
596 /* this is rare but possible -- see CLASS_PREPARE handling */
597 if (thread_self_id == debug_thread_id_) {
598 LOG(INFO) << "NOTE: SuspendByPolicy not suspending JDWP thread";
606 * The JDWP thread has told us (and possibly all other threads) to
607 * resume. See if it has left anything in our DebugInvokeReq mailbox.
609 DebugInvokeReq* const pReq = Dbg::GetInvokeReq();
610 if (pReq == nullptr) {
615 Dbg::ExecuteMethod(pReq);
619 void JdwpState::SendRequestAndPossiblySuspend(ExpandBuf* pReq, JdwpSuspendPolicy suspend_policy,
621 Thread* const self = Thread::Current();
622 self->AssertThreadSuspensionIsAllowable();
623 CHECK(pReq != nullptr);
624 CHECK_EQ(threadId, Dbg::GetThreadSelfId()) << "Only the current thread can suspend itself";
625 /* send request and possibly suspend ourselves */
626 ScopedThreadSuspension sts(self, kWaitingForDebuggerSend);
627 if (suspend_policy != SP_NONE) {
628 AcquireJdwpTokenForEvent(threadId);
632 // Before suspending, we change our state to kSuspended so the debugger sees us as RUNNING.
633 ScopedThreadStateChange stsc(self, kSuspended);
634 SuspendByPolicy(suspend_policy, threadId);
639 * Determine if there is a method invocation in progress in the current
642 * We look at the "invoke_needed" flag in the per-thread DebugInvokeReq
643 * state. If set, we're in the process of invoking a method.
645 bool JdwpState::InvokeInProgress() {
646 DebugInvokeReq* pReq = Dbg::GetInvokeReq();
647 return pReq != nullptr;
650 void JdwpState::AcquireJdwpTokenForCommand() {
651 CHECK_EQ(Thread::Current(), GetDebugThread()) << "Expected debugger thread";
652 SetWaitForJdwpToken(debug_thread_id_);
655 void JdwpState::ReleaseJdwpTokenForCommand() {
656 CHECK_EQ(Thread::Current(), GetDebugThread()) << "Expected debugger thread";
657 ClearWaitForJdwpToken();
660 void JdwpState::AcquireJdwpTokenForEvent(ObjectId threadId) {
661 SetWaitForJdwpToken(threadId);
664 void JdwpState::ReleaseJdwpTokenForEvent() {
665 ClearWaitForJdwpToken();
669 * We need the JDWP thread to hold off on doing stuff while we post an
670 * event and then suspend ourselves.
672 * This could go to sleep waiting for another thread, so it's important
673 * that the thread be marked as VMWAIT before calling here.
675 void JdwpState::SetWaitForJdwpToken(ObjectId threadId) {
677 Thread* const self = Thread::Current();
678 CHECK_NE(threadId, 0u);
679 CHECK_NE(self->GetState(), kRunnable);
680 Locks::mutator_lock_->AssertNotHeld(self);
682 /* this is held for very brief periods; contention is unlikely */
683 MutexLock mu(self, jdwp_token_lock_);
685 if (jdwp_token_owner_thread_id_ == threadId) {
686 // Only the debugger thread may already hold the event token. For instance, it may trigger
687 // a CLASS_PREPARE event while processing a command that initializes a class.
688 CHECK_EQ(threadId, debug_thread_id_) << "Non-debugger thread is already holding event token";
691 * If another thread is already doing stuff, wait for it. This can
692 * go to sleep indefinitely.
695 while (jdwp_token_owner_thread_id_ != 0) {
696 VLOG(jdwp) << StringPrintf("event in progress (%#" PRIx64 "), %#" PRIx64 " sleeping",
697 jdwp_token_owner_thread_id_, threadId);
699 jdwp_token_cond_.Wait(self);
702 if (waited || threadId != debug_thread_id_) {
703 VLOG(jdwp) << StringPrintf("event token grabbed (%#" PRIx64 ")", threadId);
705 jdwp_token_owner_thread_id_ = threadId;
710 * Clear the threadId and signal anybody waiting.
712 void JdwpState::ClearWaitForJdwpToken() {
714 * Grab the mutex. Don't try to go in/out of VMWAIT mode, as this
715 * function is called by Dbg::SuspendSelf(), and the transition back
716 * to RUNNING would confuse it.
718 Thread* const self = Thread::Current();
719 MutexLock mu(self, jdwp_token_lock_);
721 CHECK_NE(jdwp_token_owner_thread_id_, 0U);
722 VLOG(jdwp) << StringPrintf("cleared event token (%#" PRIx64 ")", jdwp_token_owner_thread_id_);
724 jdwp_token_owner_thread_id_ = 0;
725 jdwp_token_cond_.Signal(self);
729 * Prep an event. Allocates storage for the message and leaves space for
732 static ExpandBuf* eventPrep() {
733 ExpandBuf* pReq = expandBufAlloc();
734 expandBufAddSpace(pReq, kJDWPHeaderLen);
739 * Write the header into the buffer and send the packet off to the debugger.
741 * Takes ownership of "pReq" (currently discards it).
743 void JdwpState::EventFinish(ExpandBuf* pReq) {
744 uint8_t* buf = expandBufGetBuffer(pReq);
746 Set4BE(buf + kJDWPHeaderSizeOffset, expandBufGetLength(pReq));
747 Set4BE(buf + kJDWPHeaderIdOffset, NextRequestSerial());
748 Set1(buf + kJDWPHeaderFlagsOffset, 0); /* flags */
749 Set1(buf + kJDWPHeaderCmdSetOffset, kJDWPEventCmdSet);
750 Set1(buf + kJDWPHeaderCmdOffset, kJDWPEventCompositeCmd);
759 * Tell the debugger that we have finished initializing. This is always
760 * sent, even if the debugger hasn't requested it.
762 * This should be sent "before the main thread is started and before
763 * any application code has been executed". The thread ID in the message
764 * must be for the main thread.
766 void JdwpState::PostVMStart() {
767 JdwpSuspendPolicy suspend_policy = (options_->suspend) ? SP_ALL : SP_NONE;
768 ObjectId threadId = Dbg::GetThreadSelfId();
770 VLOG(jdwp) << "EVENT: " << EK_VM_START;
771 VLOG(jdwp) << " suspend_policy=" << suspend_policy;
773 ExpandBuf* pReq = eventPrep();
774 expandBufAdd1(pReq, suspend_policy);
775 expandBufAdd4BE(pReq, 1);
776 expandBufAdd1(pReq, EK_VM_START);
777 expandBufAdd4BE(pReq, 0); /* requestId */
778 expandBufAddObjectId(pReq, threadId);
780 Dbg::ManageDeoptimization();
782 /* send request and possibly suspend ourselves */
783 SendRequestAndPossiblySuspend(pReq, suspend_policy, threadId);
786 static void LogMatchingEventsAndThread(const std::vector<JdwpEvent*>& match_list,
788 REQUIRES_SHARED(Locks::mutator_lock_) {
789 for (size_t i = 0, e = match_list.size(); i < e; ++i) {
790 JdwpEvent* pEvent = match_list[i];
791 VLOG(jdwp) << "EVENT #" << i << ": " << pEvent->eventKind
792 << StringPrintf(" (requestId=%#" PRIx32 ")", pEvent->requestId);
794 std::string thread_name;
795 JdwpError error = Dbg::GetThreadName(thread_id, &thread_name);
796 if (error != JDWP::ERR_NONE) {
797 thread_name = "<unknown>";
799 VLOG(jdwp) << StringPrintf(" thread=%#" PRIx64, thread_id) << " " << thread_name;
802 static void SetJdwpLocationFromEventLocation(const JDWP::EventLocation* event_location,
803 JDWP::JdwpLocation* jdwp_location)
804 REQUIRES_SHARED(Locks::mutator_lock_) {
805 DCHECK(event_location != nullptr);
806 DCHECK(jdwp_location != nullptr);
807 Dbg::SetJdwpLocation(jdwp_location, event_location->method, event_location->dex_pc);
811 * A location of interest has been reached. This handles:
816 * These four types must be grouped together in a single response. The
817 * "eventFlags" indicates the type of event(s) that have happened.
820 * Count, ThreadOnly, ClassOnly, ClassMatch, ClassExclude, InstanceOnly
821 * LocationOnly (for breakpoint/step only)
822 * Step (for step only)
824 * Interesting test cases:
825 * - Put a breakpoint on a native method. Eclipse creates METHOD_ENTRY
826 * and METHOD_EXIT events with a ClassOnly mod on the method's class.
827 * - Use "run to line". Eclipse creates a BREAKPOINT with Count=1.
828 * - Single-step to a line with a breakpoint. Should get a single
829 * event message with both events in it.
831 void JdwpState::PostLocationEvent(const EventLocation* pLoc, mirror::Object* thisPtr,
832 int eventFlags, const JValue* returnValue) {
833 DCHECK(pLoc != nullptr);
834 DCHECK(pLoc->method != nullptr);
835 DCHECK_EQ(pLoc->method->IsStatic(), thisPtr == nullptr);
837 ModBasket basket(Thread::Current());
839 basket.locationClass.Assign(pLoc->method->GetDeclaringClass());
840 basket.thisPtr.Assign(thisPtr);
841 basket.className = Dbg::GetClassName(basket.locationClass.Get());
844 * On rare occasions we may need to execute interpreted code in the VM
845 * while handling a request from the debugger. Don't fire breakpoints
846 * while doing so. (I don't think we currently do this at all, so
847 * this is mostly paranoia.)
849 if (basket.thread == GetDebugThread()) {
850 VLOG(jdwp) << "Ignoring location event in JDWP thread";
855 * The debugger variable display tab may invoke the interpreter to format
856 * complex objects. We want to ignore breakpoints and method entry/exit
857 * traps while working on behalf of the debugger.
859 * If we don't ignore them, the VM will get hung up, because we'll
860 * suspend on a breakpoint while the debugger is still waiting for its
861 * method invocation to complete.
863 if (InvokeInProgress()) {
864 VLOG(jdwp) << "Not checking breakpoints during invoke (" << basket.className << ")";
868 std::vector<JdwpEvent*> match_list;
870 // We use the locked version because we have multiple possible match events.
871 MutexLock mu(Thread::Current(), event_list_lock_);
872 match_list.reserve(event_list_size_);
873 if ((eventFlags & Dbg::kBreakpoint) != 0) {
874 FindMatchingEventsLocked(EK_BREAKPOINT, basket, &match_list);
876 if ((eventFlags & Dbg::kSingleStep) != 0) {
877 FindMatchingEventsLocked(EK_SINGLE_STEP, basket, &match_list);
879 if ((eventFlags & Dbg::kMethodEntry) != 0) {
880 FindMatchingEventsLocked(EK_METHOD_ENTRY, basket, &match_list);
882 if ((eventFlags & Dbg::kMethodExit) != 0) {
883 FindMatchingEventsLocked(EK_METHOD_EXIT, basket, &match_list);
884 FindMatchingEventsLocked(EK_METHOD_EXIT_WITH_RETURN_VALUE, basket, &match_list);
887 if (match_list.empty()) {
888 // No matching event.
891 JdwpSuspendPolicy suspend_policy = ScanSuspendPolicy(match_list);
893 ObjectId thread_id = Dbg::GetThreadId(basket.thread);
894 JDWP::JdwpLocation jdwp_location;
895 SetJdwpLocationFromEventLocation(pLoc, &jdwp_location);
897 if (VLOG_IS_ON(jdwp)) {
898 LogMatchingEventsAndThread(match_list, thread_id);
899 VLOG(jdwp) << " location=" << jdwp_location;
900 VLOG(jdwp) << " suspend_policy=" << suspend_policy;
903 ExpandBuf* pReq = eventPrep();
904 expandBufAdd1(pReq, suspend_policy);
905 expandBufAdd4BE(pReq, match_list.size());
907 for (const JdwpEvent* pEvent : match_list) {
908 expandBufAdd1(pReq, pEvent->eventKind);
909 expandBufAdd4BE(pReq, pEvent->requestId);
910 expandBufAddObjectId(pReq, thread_id);
911 expandBufAddLocation(pReq, jdwp_location);
912 if (pEvent->eventKind == EK_METHOD_EXIT_WITH_RETURN_VALUE) {
913 Dbg::OutputMethodReturnValue(jdwp_location.method_id, returnValue, pReq);
918 MutexLock mu(Thread::Current(), event_list_lock_);
919 CleanupMatchList(match_list);
922 Dbg::ManageDeoptimization();
924 SendRequestAndPossiblySuspend(pReq, suspend_policy, thread_id);
927 void JdwpState::PostFieldEvent(const EventLocation* pLoc, ArtField* field,
928 mirror::Object* this_object, const JValue* fieldValue,
929 bool is_modification) {
930 DCHECK(pLoc != nullptr);
931 DCHECK(field != nullptr);
932 DCHECK_EQ(fieldValue != nullptr, is_modification);
933 DCHECK_EQ(field->IsStatic(), this_object == nullptr);
935 ModBasket basket(Thread::Current());
937 basket.locationClass.Assign(pLoc->method->GetDeclaringClass());
938 basket.thisPtr.Assign(this_object);
939 basket.className = Dbg::GetClassName(basket.locationClass.Get());
940 basket.field = field;
942 if (InvokeInProgress()) {
943 VLOG(jdwp) << "Not posting field event during invoke (" << basket.className << ")";
947 std::vector<JdwpEvent*> match_list;
948 const JdwpEventKind match_kind = (is_modification) ? EK_FIELD_MODIFICATION : EK_FIELD_ACCESS;
949 if (!FindMatchingEvents(match_kind, basket, &match_list)) {
950 // No matching event.
954 JdwpSuspendPolicy suspend_policy = ScanSuspendPolicy(match_list);
955 ObjectId thread_id = Dbg::GetThreadId(basket.thread);
956 ObjectRegistry* registry = Dbg::GetObjectRegistry();
957 ObjectId instance_id = registry->Add(basket.thisPtr);
958 RefTypeId field_type_id = registry->AddRefType(field->GetDeclaringClass());
959 FieldId field_id = Dbg::ToFieldId(field);
960 JDWP::JdwpLocation jdwp_location;
961 SetJdwpLocationFromEventLocation(pLoc, &jdwp_location);
963 if (VLOG_IS_ON(jdwp)) {
964 LogMatchingEventsAndThread(match_list, thread_id);
965 VLOG(jdwp) << " location=" << jdwp_location;
966 VLOG(jdwp) << StringPrintf(" this=%#" PRIx64, instance_id);
967 VLOG(jdwp) << StringPrintf(" type=%#" PRIx64, field_type_id) << " "
968 << Dbg::GetClassName(field_id);
969 VLOG(jdwp) << StringPrintf(" field=%#" PRIx64, field_id) << " "
970 << Dbg::GetFieldName(field_id);
971 VLOG(jdwp) << " suspend_policy=" << suspend_policy;
974 ExpandBuf* pReq = eventPrep();
975 expandBufAdd1(pReq, suspend_policy);
976 expandBufAdd4BE(pReq, match_list.size());
978 // Get field's reference type tag.
979 JDWP::JdwpTypeTag type_tag = Dbg::GetTypeTag(field->GetDeclaringClass());
981 // Get instance type tag.
984 ScopedObjectAccessUnchecked soa(Thread::Current());
985 tag = Dbg::TagFromObject(soa, basket.thisPtr.Get());
988 for (const JdwpEvent* pEvent : match_list) {
989 expandBufAdd1(pReq, pEvent->eventKind);
990 expandBufAdd4BE(pReq, pEvent->requestId);
991 expandBufAddObjectId(pReq, thread_id);
992 expandBufAddLocation(pReq, jdwp_location);
993 expandBufAdd1(pReq, type_tag);
994 expandBufAddRefTypeId(pReq, field_type_id);
995 expandBufAddFieldId(pReq, field_id);
996 expandBufAdd1(pReq, tag);
997 expandBufAddObjectId(pReq, instance_id);
998 if (is_modification) {
999 Dbg::OutputFieldValue(field_id, fieldValue, pReq);
1004 MutexLock mu(Thread::Current(), event_list_lock_);
1005 CleanupMatchList(match_list);
1008 Dbg::ManageDeoptimization();
1010 SendRequestAndPossiblySuspend(pReq, suspend_policy, thread_id);
1014 * A thread is starting or stopping.
1019 void JdwpState::PostThreadChange(Thread* thread, bool start) {
1020 CHECK_EQ(thread, Thread::Current());
1023 * I don't think this can happen.
1025 if (InvokeInProgress()) {
1026 LOG(WARNING) << "Not posting thread change during invoke";
1030 // We need the java.lang.Thread object associated to the starting/ending
1031 // thread to get its JDWP id. Therefore we can't report event if there
1032 // is no Java peer. This happens when the runtime shuts down and re-attaches
1033 // the current thread without creating a Java peer.
1034 if (thread->GetPeer() == nullptr) {
1038 ModBasket basket(thread);
1040 std::vector<JdwpEvent*> match_list;
1041 const JdwpEventKind match_kind = (start) ? EK_THREAD_START : EK_THREAD_DEATH;
1042 if (!FindMatchingEvents(match_kind, basket, &match_list)) {
1043 // No matching event.
1047 JdwpSuspendPolicy suspend_policy = ScanSuspendPolicy(match_list);
1048 ObjectId thread_id = Dbg::GetThreadId(basket.thread);
1050 if (VLOG_IS_ON(jdwp)) {
1051 LogMatchingEventsAndThread(match_list, thread_id);
1052 VLOG(jdwp) << " suspend_policy=" << suspend_policy;
1055 ExpandBuf* pReq = eventPrep();
1056 expandBufAdd1(pReq, suspend_policy);
1057 expandBufAdd4BE(pReq, match_list.size());
1059 for (const JdwpEvent* pEvent : match_list) {
1060 expandBufAdd1(pReq, pEvent->eventKind);
1061 expandBufAdd4BE(pReq, pEvent->requestId);
1062 expandBufAdd8BE(pReq, thread_id);
1066 MutexLock mu(Thread::Current(), event_list_lock_);
1067 CleanupMatchList(match_list);
1070 Dbg::ManageDeoptimization();
1072 SendRequestAndPossiblySuspend(pReq, suspend_policy, thread_id);
1076 * Send a polite "VM is dying" message to the debugger.
1078 * Skips the usual "event token" stuff.
1080 bool JdwpState::PostVMDeath() {
1081 VLOG(jdwp) << "EVENT: " << EK_VM_DEATH;
1083 ExpandBuf* pReq = eventPrep();
1084 expandBufAdd1(pReq, SP_NONE);
1085 expandBufAdd4BE(pReq, 1);
1087 expandBufAdd1(pReq, EK_VM_DEATH);
1088 expandBufAdd4BE(pReq, 0);
1094 * An exception has been thrown. It may or may not have been caught.
1097 * Count, ThreadOnly, ClassOnly, ClassMatch, ClassExclude, LocationOnly,
1098 * ExceptionOnly, InstanceOnly
1100 * The "exceptionId" has not been added to the GC-visible object registry,
1101 * because there's a pretty good chance that we're not going to send it
1104 void JdwpState::PostException(const EventLocation* pThrowLoc, mirror::Throwable* exception_object,
1105 const EventLocation* pCatchLoc, mirror::Object* thisPtr) {
1106 DCHECK(exception_object != nullptr);
1107 DCHECK(pThrowLoc != nullptr);
1108 DCHECK(pCatchLoc != nullptr);
1109 if (pThrowLoc->method != nullptr) {
1110 DCHECK_EQ(pThrowLoc->method->IsStatic(), thisPtr == nullptr);
1112 VLOG(jdwp) << "Unexpected: exception event with empty throw location";
1115 ModBasket basket(Thread::Current());
1116 basket.pLoc = pThrowLoc;
1117 if (pThrowLoc->method != nullptr) {
1118 basket.locationClass.Assign(pThrowLoc->method->GetDeclaringClass());
1120 basket.className = Dbg::GetClassName(basket.locationClass.Get());
1121 basket.exceptionClass.Assign(exception_object->GetClass());
1122 basket.caught = (pCatchLoc->method != 0);
1123 basket.thisPtr.Assign(thisPtr);
1125 /* don't try to post an exception caused by the debugger */
1126 if (InvokeInProgress()) {
1127 VLOG(jdwp) << "Not posting exception hit during invoke (" << basket.className << ")";
1131 std::vector<JdwpEvent*> match_list;
1132 if (!FindMatchingEvents(EK_EXCEPTION, basket, &match_list)) {
1133 // No matching event.
1137 JdwpSuspendPolicy suspend_policy = ScanSuspendPolicy(match_list);
1138 ObjectId thread_id = Dbg::GetThreadId(basket.thread);
1139 ObjectRegistry* registry = Dbg::GetObjectRegistry();
1140 ObjectId exceptionId = registry->Add(exception_object);
1141 JDWP::JdwpLocation jdwp_throw_location;
1142 JDWP::JdwpLocation jdwp_catch_location;
1143 SetJdwpLocationFromEventLocation(pThrowLoc, &jdwp_throw_location);
1144 SetJdwpLocationFromEventLocation(pCatchLoc, &jdwp_catch_location);
1146 if (VLOG_IS_ON(jdwp)) {
1147 std::string exceptionClassName(mirror::Class::PrettyDescriptor(exception_object->GetClass()));
1149 LogMatchingEventsAndThread(match_list, thread_id);
1150 VLOG(jdwp) << " throwLocation=" << jdwp_throw_location;
1151 if (jdwp_catch_location.class_id == 0) {
1152 VLOG(jdwp) << " catchLocation=uncaught";
1154 VLOG(jdwp) << " catchLocation=" << jdwp_catch_location;
1156 VLOG(jdwp) << StringPrintf(" exception=%#" PRIx64, exceptionId) << " "
1157 << exceptionClassName;
1158 VLOG(jdwp) << " suspend_policy=" << suspend_policy;
1161 ExpandBuf* pReq = eventPrep();
1162 expandBufAdd1(pReq, suspend_policy);
1163 expandBufAdd4BE(pReq, match_list.size());
1165 for (const JdwpEvent* pEvent : match_list) {
1166 expandBufAdd1(pReq, pEvent->eventKind);
1167 expandBufAdd4BE(pReq, pEvent->requestId);
1168 expandBufAddObjectId(pReq, thread_id);
1169 expandBufAddLocation(pReq, jdwp_throw_location);
1170 expandBufAdd1(pReq, JT_OBJECT);
1171 expandBufAddObjectId(pReq, exceptionId);
1172 expandBufAddLocation(pReq, jdwp_catch_location);
1176 MutexLock mu(Thread::Current(), event_list_lock_);
1177 CleanupMatchList(match_list);
1180 Dbg::ManageDeoptimization();
1182 SendRequestAndPossiblySuspend(pReq, suspend_policy, thread_id);
1186 * Announce that a class has been loaded.
1189 * Count, ThreadOnly, ClassOnly, ClassMatch, ClassExclude
1191 void JdwpState::PostClassPrepare(mirror::Class* klass) {
1192 DCHECK(klass != nullptr);
1194 ModBasket basket(Thread::Current());
1195 basket.locationClass.Assign(klass);
1196 basket.className = Dbg::GetClassName(basket.locationClass.Get());
1198 /* suppress class prep caused by debugger */
1199 if (InvokeInProgress()) {
1200 VLOG(jdwp) << "Not posting class prep caused by invoke (" << basket.className << ")";
1204 std::vector<JdwpEvent*> match_list;
1205 if (!FindMatchingEvents(EK_CLASS_PREPARE, basket, &match_list)) {
1206 // No matching event.
1210 JdwpSuspendPolicy suspend_policy = ScanSuspendPolicy(match_list);
1211 ObjectId thread_id = Dbg::GetThreadId(basket.thread);
1212 ObjectRegistry* registry = Dbg::GetObjectRegistry();
1213 RefTypeId class_id = registry->AddRefType(basket.locationClass);
1215 // OLD-TODO - we currently always send both "verified" and "prepared" since
1216 // debuggers seem to like that. There might be some advantage to honesty,
1217 // since the class may not yet be verified.
1218 int status = JDWP::CS_VERIFIED | JDWP::CS_PREPARED;
1219 JDWP::JdwpTypeTag tag = Dbg::GetTypeTag(basket.locationClass.Get());
1221 std::string signature(basket.locationClass->GetDescriptor(&temp));
1223 if (VLOG_IS_ON(jdwp)) {
1224 LogMatchingEventsAndThread(match_list, thread_id);
1225 VLOG(jdwp) << StringPrintf(" type=%#" PRIx64, class_id) << " " << signature;
1226 VLOG(jdwp) << " suspend_policy=" << suspend_policy;
1229 ObjectId reported_thread_id = thread_id;
1230 if (reported_thread_id == debug_thread_id_) {
1232 * JDWP says that, for a class prep in the debugger thread, we
1233 * should set thread to null and if any threads were supposed
1234 * to be suspended then we suspend all other threads.
1236 VLOG(jdwp) << " NOTE: class prepare in debugger thread!";
1237 reported_thread_id = 0;
1238 if (suspend_policy == SP_EVENT_THREAD) {
1239 suspend_policy = SP_ALL;
1243 ExpandBuf* pReq = eventPrep();
1244 expandBufAdd1(pReq, suspend_policy);
1245 expandBufAdd4BE(pReq, match_list.size());
1247 for (const JdwpEvent* pEvent : match_list) {
1248 expandBufAdd1(pReq, pEvent->eventKind);
1249 expandBufAdd4BE(pReq, pEvent->requestId);
1250 expandBufAddObjectId(pReq, reported_thread_id);
1251 expandBufAdd1(pReq, tag);
1252 expandBufAddRefTypeId(pReq, class_id);
1253 expandBufAddUtf8String(pReq, signature);
1254 expandBufAdd4BE(pReq, status);
1258 MutexLock mu(Thread::Current(), event_list_lock_);
1259 CleanupMatchList(match_list);
1262 Dbg::ManageDeoptimization();
1264 SendRequestAndPossiblySuspend(pReq, suspend_policy, thread_id);
1268 * Setup the header for a chunk of DDM data.
1270 void JdwpState::SetupChunkHeader(uint32_t type, size_t data_len, size_t header_size,
1271 uint8_t* out_header) {
1272 CHECK_EQ(header_size, static_cast<size_t>(kJDWPHeaderLen + 8));
1273 /* form the header (JDWP plus DDMS) */
1274 Set4BE(out_header, header_size + data_len);
1275 Set4BE(out_header + 4, NextRequestSerial());
1276 Set1(out_header + 8, 0); /* flags */
1277 Set1(out_header + 9, kJDWPDdmCmdSet);
1278 Set1(out_header + 10, kJDWPDdmCmd);
1279 Set4BE(out_header + 11, type);
1280 Set4BE(out_header + 15, data_len);
1284 * Send up a chunk of DDM data.
1286 * While this takes the form of a JDWP "event", it doesn't interact with
1287 * other debugger traffic, and can't suspend the VM, so we skip all of
1288 * the fun event token gymnastics.
1290 void JdwpState::DdmSendChunkV(uint32_t type, const iovec* iov, int iov_count) {
1291 uint8_t header[kJDWPHeaderLen + 8] = { 0 };
1294 CHECK(iov != nullptr);
1295 CHECK_GT(iov_count, 0);
1296 CHECK_LT(iov_count, 10);
1299 * "Wrap" the contents of the iovec with a JDWP/DDMS header. We do
1300 * this by creating a new copy of the vector with space for the header.
1302 std::vector<iovec> wrapiov;
1303 wrapiov.push_back(iovec());
1304 for (int i = 0; i < iov_count; i++) {
1305 wrapiov.push_back(iov[i]);
1306 dataLen += iov[i].iov_len;
1309 SetupChunkHeader(type, dataLen, sizeof(header), header);
1311 wrapiov[0].iov_base = header;
1312 wrapiov[0].iov_len = sizeof(header);
1314 // Try to avoid blocking GC during a send, but only safe when not using mutexes at a lower-level
1315 // than mutator for lock ordering reasons.
1316 Thread* self = Thread::Current();
1317 bool safe_to_release_mutator_lock_over_send = !Locks::mutator_lock_->IsExclusiveHeld(self);
1318 if (safe_to_release_mutator_lock_over_send) {
1319 for (size_t i = 0; i < kMutatorLock; ++i) {
1320 if (self->GetHeldMutex(static_cast<LockLevel>(i)) != nullptr) {
1321 safe_to_release_mutator_lock_over_send = false;
1326 if (safe_to_release_mutator_lock_over_send) {
1327 // Change state to waiting to allow GC, ... while we're sending.
1328 ScopedThreadSuspension sts(self, kWaitingForDebuggerSend);
1329 SendBufferedRequest(type, wrapiov);
1331 // Send and possibly block GC...
1332 SendBufferedRequest(type, wrapiov);