blob: ab3f2e4ddde48fc567f6745fc82a64393ddf75f4 [file] [log] [blame]
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
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
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
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.
15 */
Elliott Hughes872d4ec2011-10-21 17:07:15 -070016
Elliott Hughes07ed66b2012-12-12 18:34:25 -080017#include "jdwp/jdwp_event.h"
18
19#include <stddef.h> /* for offsetof() */
Elliott Hughes872d4ec2011-10-21 17:07:15 -070020#include <stdlib.h>
21#include <string.h>
Elliott Hughes872d4ec2011-10-21 17:07:15 -070022#include <unistd.h>
23
Mathieu Chartierc7853442015-03-27 14:35:38 -070024#include "art_field-inl.h"
Elliott Hughes07ed66b2012-12-12 18:34:25 -080025#include "base/logging.h"
Elliott Hughese222ee02012-12-13 14:41:43 -080026#include "base/stringprintf.h"
Elliott Hughes07ed66b2012-12-12 18:34:25 -080027#include "debugger.h"
28#include "jdwp/jdwp_constants.h"
29#include "jdwp/jdwp_expand_buf.h"
Elliott Hughes07ed66b2012-12-12 18:34:25 -080030#include "jdwp/jdwp_priv.h"
Sebastien Hertz6995c602014-09-09 12:10:13 +020031#include "jdwp/object_registry.h"
Sebastien Hertz6995c602014-09-09 12:10:13 +020032#include "scoped_thread_state_change.h"
Ian Rogers693ff612013-02-01 10:56:12 -080033#include "thread-inl.h"
Elliott Hughes07ed66b2012-12-12 18:34:25 -080034
Elliott Hughes872d4ec2011-10-21 17:07:15 -070035/*
36General notes:
37
38The event add/remove stuff usually happens from the debugger thread,
39in response to requests from the debugger, but can also happen as the
40result of an event in an arbitrary thread (e.g. an event with a "count"
41mod expires). It's important to keep the event list locked when processing
42events.
43
44Event posting can happen from any thread. The JDWP thread will not usually
45post anything but VM start/death, but if a JDWP request causes a class
46to be loaded, the ClassPrepare event will come from the JDWP thread.
47
48
49We can have serialization issues when we post an event to the debugger.
50For example, a thread could send an "I hit a breakpoint and am suspending
51myself" message to the debugger. Before it manages to suspend itself, the
52debugger's response ("not interested, resume thread") arrives and is
53processed. We try to resume a thread that hasn't yet suspended.
54
55This means that, after posting an event to the debugger, we need to wait
56for the event thread to suspend itself (and, potentially, all other threads)
57before processing any additional requests from the debugger. While doing
58so we need to be aware that multiple threads may be hitting breakpoints
59or other events simultaneously, so we either need to wait for all of them
60or serialize the events with each other.
61
62The current mechanism works like this:
63 Event thread:
64 - If I'm going to suspend, grab the "I am posting an event" token. Wait
65 for it if it's not currently available.
66 - Post the event to the debugger.
67 - If appropriate, suspend others and then myself. As part of suspending
68 myself, release the "I am posting" token.
69 JDWP thread:
70 - When an event arrives, see if somebody is posting an event. If so,
71 sleep until we can acquire the "I am posting an event" token. Release
72 it immediately and continue processing -- the event we have already
73 received should not interfere with other events that haven't yet
74 been posted.
75
76Some care must be taken to avoid deadlock:
77
78 - thread A and thread B exit near-simultaneously, and post thread-death
79 events with a "suspend all" clause
80 - thread A gets the event token, thread B sits and waits for it
81 - thread A wants to suspend all other threads, but thread B is waiting
82 for the token and can't be suspended
83
84So we need to mark thread B in such a way that thread A doesn't wait for it.
85
86If we just bracket the "grab event token" call with a change to VMWAIT
87before sleeping, the switch back to RUNNING state when we get the token
88will cause thread B to suspend (remember, thread A's global suspend is
89still in force, even after it releases the token). Suspending while
90holding the event token is very bad, because it prevents the JDWP thread
91from processing incoming messages.
92
93We need to change to VMWAIT state at the *start* of posting an event,
94and stay there until we either finish posting the event or decide to
95put ourselves to sleep. That way we don't interfere with anyone else and
96don't allow anyone else to interfere with us.
97*/
98
99
100#define kJdwpEventCommandSet 64
101#define kJdwpCompositeCommand 100
102
103namespace art {
104
105namespace JDWP {
106
107/*
108 * Stuff to compare against when deciding if a mod matches. Only the
109 * values for mods valid for the event being evaluated will be filled in.
110 * The rest will be zeroed.
111 */
112struct ModBasket {
Sebastien Hertz6995c602014-09-09 12:10:13 +0200113 ModBasket() : pLoc(nullptr), thread(nullptr), locationClass(nullptr), exceptionClass(nullptr),
114 caught(false), field(nullptr), thisPtr(nullptr) { }
jeffhao162fd332013-01-08 16:21:01 -0800115
Sebastien Hertz6995c602014-09-09 12:10:13 +0200116 const EventLocation* pLoc; /* LocationOnly */
117 std::string className; /* ClassMatch/ClassExclude */
118 Thread* thread; /* ThreadOnly */
119 mirror::Class* locationClass; /* ClassOnly */
120 mirror::Class* exceptionClass; /* ExceptionOnly */
121 bool caught; /* ExceptionOnly */
Mathieu Chartierc7853442015-03-27 14:35:38 -0700122 ArtField* field; /* FieldOnly */
Sebastien Hertz6995c602014-09-09 12:10:13 +0200123 mirror::Object* thisPtr; /* InstanceOnly */
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700124 /* nothing for StepOnly -- handled differently */
125};
126
Sebastien Hertz138dbfc2013-12-04 18:15:25 +0100127static bool NeedsFullDeoptimization(JdwpEventKind eventKind) {
Sebastien Hertzf3928792014-11-17 19:00:37 +0100128 if (!Dbg::RequiresDeoptimization()) {
129 // We don't need deoptimization for debugging.
130 return false;
131 }
Sebastien Hertz138dbfc2013-12-04 18:15:25 +0100132 switch (eventKind) {
133 case EK_METHOD_ENTRY:
134 case EK_METHOD_EXIT:
135 case EK_METHOD_EXIT_WITH_RETURN_VALUE:
Sebastien Hertz3f52eaf2014-04-04 17:50:18 +0200136 case EK_FIELD_ACCESS:
137 case EK_FIELD_MODIFICATION:
Sebastien Hertz138dbfc2013-12-04 18:15:25 +0100138 return true;
139 default:
140 return false;
141 }
142}
143
Sebastien Hertz9d6bf692015-04-10 12:12:33 +0200144// Returns the instrumentation event the DebugInstrumentationListener must
145// listen to in order to properly report the given JDWP event to the debugger.
Andreas Gampe277ccbd2014-11-03 21:36:10 -0800146static uint32_t GetInstrumentationEventFor(JdwpEventKind eventKind) {
Sebastien Hertz42cd43f2014-05-13 14:15:41 +0200147 switch (eventKind) {
148 case EK_BREAKPOINT:
149 case EK_SINGLE_STEP:
150 return instrumentation::Instrumentation::kDexPcMoved;
151 case EK_EXCEPTION:
152 case EK_EXCEPTION_CATCH:
153 return instrumentation::Instrumentation::kExceptionCaught;
154 case EK_METHOD_ENTRY:
155 return instrumentation::Instrumentation::kMethodEntered;
156 case EK_METHOD_EXIT:
157 case EK_METHOD_EXIT_WITH_RETURN_VALUE:
158 return instrumentation::Instrumentation::kMethodExited;
159 case EK_FIELD_ACCESS:
160 return instrumentation::Instrumentation::kFieldRead;
161 case EK_FIELD_MODIFICATION:
162 return instrumentation::Instrumentation::kFieldWritten;
163 default:
164 return 0;
165 }
166}
167
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700168/*
169 * Add an event to the list. Ordering is not important.
170 *
171 * If something prevents the event from being registered, e.g. it's a
172 * single-step request on a thread that doesn't exist, the event will
173 * not be added to the list, and an appropriate error will be returned.
174 */
Elliott Hughes761928d2011-11-16 18:33:03 -0800175JdwpError JdwpState::RegisterEvent(JdwpEvent* pEvent) {
Sebastien Hertz7d955652014-10-22 10:57:10 +0200176 CHECK(pEvent != nullptr);
177 CHECK(pEvent->prev == nullptr);
178 CHECK(pEvent->next == nullptr);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700179
Sebastien Hertz42cd43f2014-05-13 14:15:41 +0200180 {
181 /*
182 * If one or more "break"-type mods are used, register them with
183 * the interpreter.
184 */
185 DeoptimizationRequest req;
186 for (int i = 0; i < pEvent->modCount; i++) {
187 const JdwpEventMod* pMod = &pEvent->mods[i];
188 if (pMod->modKind == MK_LOCATION_ONLY) {
Sebastien Hertz033aabf2014-10-08 13:54:55 +0200189 // Should only concern breakpoint, field access, field modification, step, and exception
190 // events.
191 // However breakpoint requires specific handling. Field access, field modification and step
192 // events need full deoptimization to be reported while exception event is reported during
193 // exception handling.
194 if (pEvent->eventKind == EK_BREAKPOINT) {
195 Dbg::WatchLocation(&pMod->locationOnly.loc, &req);
196 }
Sebastien Hertz42cd43f2014-05-13 14:15:41 +0200197 } else if (pMod->modKind == MK_STEP) {
198 /* should only be for EK_SINGLE_STEP; should only be one */
199 JdwpStepSize size = static_cast<JdwpStepSize>(pMod->step.size);
200 JdwpStepDepth depth = static_cast<JdwpStepDepth>(pMod->step.depth);
201 JdwpError status = Dbg::ConfigureStep(pMod->step.threadId, size, depth);
202 if (status != ERR_NONE) {
203 return status;
204 }
Elliott Hughes2435a572012-02-17 16:07:41 -0800205 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700206 }
Sebastien Hertz42cd43f2014-05-13 14:15:41 +0200207 if (NeedsFullDeoptimization(pEvent->eventKind)) {
Hiroshi Yamauchi0ec17d22014-07-07 13:07:08 -0700208 CHECK_EQ(req.GetKind(), DeoptimizationRequest::kNothing);
209 CHECK(req.Method() == nullptr);
210 req.SetKind(DeoptimizationRequest::kFullDeoptimization);
Sebastien Hertz42cd43f2014-05-13 14:15:41 +0200211 }
212 Dbg::RequestDeoptimization(req);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700213 }
Sebastien Hertz42cd43f2014-05-13 14:15:41 +0200214 uint32_t instrumentation_event = GetInstrumentationEventFor(pEvent->eventKind);
215 if (instrumentation_event != 0) {
216 DeoptimizationRequest req;
Hiroshi Yamauchi0ec17d22014-07-07 13:07:08 -0700217 req.SetKind(DeoptimizationRequest::kRegisterForEvent);
218 req.SetInstrumentationEvent(instrumentation_event);
Sebastien Hertz42cd43f2014-05-13 14:15:41 +0200219 Dbg::RequestDeoptimization(req);
Sebastien Hertz4d25df32014-03-21 17:44:46 +0100220 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700221
Sebastien Hertz138dbfc2013-12-04 18:15:25 +0100222 {
223 /*
224 * Add to list.
225 */
226 MutexLock mu(Thread::Current(), event_list_lock_);
Sebastien Hertz7d955652014-10-22 10:57:10 +0200227 if (event_list_ != nullptr) {
Sebastien Hertz138dbfc2013-12-04 18:15:25 +0100228 pEvent->next = event_list_;
229 event_list_->prev = pEvent;
230 }
231 event_list_ = pEvent;
232 ++event_list_size_;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700233 }
Sebastien Hertz138dbfc2013-12-04 18:15:25 +0100234
235 Dbg::ManageDeoptimization();
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700236
237 return ERR_NONE;
238}
239
240/*
241 * Remove an event from the list. This will also remove the event from
242 * any optimization tables, e.g. breakpoints.
243 *
244 * Does not free the JdwpEvent.
245 *
246 * Grab the eventLock before calling here.
247 */
Elliott Hughes761928d2011-11-16 18:33:03 -0800248void JdwpState::UnregisterEvent(JdwpEvent* pEvent) {
Sebastien Hertz7d955652014-10-22 10:57:10 +0200249 if (pEvent->prev == nullptr) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700250 /* head of the list */
Elliott Hughesf8349362012-06-18 15:00:06 -0700251 CHECK(event_list_ == pEvent);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700252
Elliott Hughesf8349362012-06-18 15:00:06 -0700253 event_list_ = pEvent->next;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700254 } else {
255 pEvent->prev->next = pEvent->next;
256 }
257
Sebastien Hertz7d955652014-10-22 10:57:10 +0200258 if (pEvent->next != nullptr) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700259 pEvent->next->prev = pEvent->prev;
Sebastien Hertz7d955652014-10-22 10:57:10 +0200260 pEvent->next = nullptr;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700261 }
Sebastien Hertz7d955652014-10-22 10:57:10 +0200262 pEvent->prev = nullptr;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700263
Sebastien Hertz42cd43f2014-05-13 14:15:41 +0200264 {
265 /*
266 * Unhook us from the interpreter, if necessary.
267 */
268 DeoptimizationRequest req;
269 for (int i = 0; i < pEvent->modCount; i++) {
270 JdwpEventMod* pMod = &pEvent->mods[i];
271 if (pMod->modKind == MK_LOCATION_ONLY) {
Sebastien Hertz033aabf2014-10-08 13:54:55 +0200272 // Like in RegisterEvent, we need specific handling for breakpoint only.
273 if (pEvent->eventKind == EK_BREAKPOINT) {
274 Dbg::UnwatchLocation(&pMod->locationOnly.loc, &req);
275 }
Sebastien Hertz42cd43f2014-05-13 14:15:41 +0200276 }
277 if (pMod->modKind == MK_STEP) {
278 /* should only be for EK_SINGLE_STEP; should only be one */
279 Dbg::UnconfigureStep(pMod->step.threadId);
280 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700281 }
Daniel Mihalyieb076692014-08-22 17:33:31 +0200282 if (NeedsFullDeoptimization(pEvent->eventKind)) {
Hiroshi Yamauchi0ec17d22014-07-07 13:07:08 -0700283 CHECK_EQ(req.GetKind(), DeoptimizationRequest::kNothing);
284 CHECK(req.Method() == nullptr);
285 req.SetKind(DeoptimizationRequest::kFullUndeoptimization);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700286 }
Sebastien Hertz42cd43f2014-05-13 14:15:41 +0200287 Dbg::RequestDeoptimization(req);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700288 }
Sebastien Hertz42cd43f2014-05-13 14:15:41 +0200289 uint32_t instrumentation_event = GetInstrumentationEventFor(pEvent->eventKind);
290 if (instrumentation_event != 0) {
291 DeoptimizationRequest req;
Hiroshi Yamauchi0ec17d22014-07-07 13:07:08 -0700292 req.SetKind(DeoptimizationRequest::kUnregisterForEvent);
293 req.SetInstrumentationEvent(instrumentation_event);
Sebastien Hertz42cd43f2014-05-13 14:15:41 +0200294 Dbg::RequestDeoptimization(req);
Sebastien Hertz4d25df32014-03-21 17:44:46 +0100295 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700296
Elliott Hughesf8349362012-06-18 15:00:06 -0700297 --event_list_size_;
Sebastien Hertz7d955652014-10-22 10:57:10 +0200298 CHECK(event_list_size_ != 0 || event_list_ == nullptr);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700299}
300
301/*
302 * Remove the event with the given ID from the list.
303 *
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700304 */
Elliott Hughes761928d2011-11-16 18:33:03 -0800305void JdwpState::UnregisterEventById(uint32_t requestId) {
Sebastien Hertz138dbfc2013-12-04 18:15:25 +0100306 bool found = false;
307 {
308 MutexLock mu(Thread::Current(), event_list_lock_);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700309
Sebastien Hertz138dbfc2013-12-04 18:15:25 +0100310 for (JdwpEvent* pEvent = event_list_; pEvent != nullptr; pEvent = pEvent->next) {
311 if (pEvent->requestId == requestId) {
312 found = true;
313 UnregisterEvent(pEvent);
314 EventFree(pEvent);
315 break; /* there can be only one with a given ID */
316 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700317 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700318 }
319
Sebastien Hertz138dbfc2013-12-04 18:15:25 +0100320 if (found) {
321 Dbg::ManageDeoptimization();
322 } else {
Sebastien Hertzf272af42014-09-18 10:20:42 +0200323 // Failure to find the event isn't really an error. For instance, it looks like Eclipse will
324 // try to be extra careful and will explicitly remove one-off single-step events (using a
325 // 'count' event modifier of 1). So the event may have already been removed as part of the
326 // event notification (see JdwpState::CleanupMatchList).
327 VLOG(jdwp) << StringPrintf("No match when removing event reqId=0x%04x", requestId);
Sebastien Hertz138dbfc2013-12-04 18:15:25 +0100328 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700329}
330
331/*
332 * Remove all entries from the event list.
333 */
Elliott Hughes761928d2011-11-16 18:33:03 -0800334void JdwpState::UnregisterAll() {
Ian Rogers50b35e22012-10-04 10:09:15 -0700335 MutexLock mu(Thread::Current(), event_list_lock_);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700336
Elliott Hughesf8349362012-06-18 15:00:06 -0700337 JdwpEvent* pEvent = event_list_;
Sebastien Hertz7d955652014-10-22 10:57:10 +0200338 while (pEvent != nullptr) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700339 JdwpEvent* pNextEvent = pEvent->next;
340
Elliott Hughes761928d2011-11-16 18:33:03 -0800341 UnregisterEvent(pEvent);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700342 EventFree(pEvent);
343 pEvent = pNextEvent;
344 }
345
Sebastien Hertz7d955652014-10-22 10:57:10 +0200346 event_list_ = nullptr;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700347}
348
349/*
350 * Allocate a JdwpEvent struct with enough space to hold the specified
351 * number of mod records.
352 */
353JdwpEvent* EventAlloc(int numMods) {
354 JdwpEvent* newEvent;
355 int allocSize = offsetof(JdwpEvent, mods) + numMods * sizeof(newEvent->mods[0]);
356 newEvent = reinterpret_cast<JdwpEvent*>(malloc(allocSize));
357 memset(newEvent, 0, allocSize);
358 return newEvent;
359}
360
361/*
362 * Free a JdwpEvent.
363 *
364 * Do not call this until the event has been removed from the list.
365 */
366void EventFree(JdwpEvent* pEvent) {
Sebastien Hertz7d955652014-10-22 10:57:10 +0200367 if (pEvent == nullptr) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700368 return;
369 }
370
371 /* make sure it was removed from the list */
Sebastien Hertz7d955652014-10-22 10:57:10 +0200372 CHECK(pEvent->prev == nullptr);
373 CHECK(pEvent->next == nullptr);
Elliott Hughesf8349362012-06-18 15:00:06 -0700374 /* want to check state->event_list_ != pEvent */
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700375
376 /*
377 * Free any hairy bits in the mods.
378 */
379 for (int i = 0; i < pEvent->modCount; i++) {
380 if (pEvent->mods[i].modKind == MK_CLASS_MATCH) {
381 free(pEvent->mods[i].classMatch.classPattern);
Sebastien Hertz7d955652014-10-22 10:57:10 +0200382 pEvent->mods[i].classMatch.classPattern = nullptr;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700383 }
384 if (pEvent->mods[i].modKind == MK_CLASS_EXCLUDE) {
385 free(pEvent->mods[i].classExclude.classPattern);
Sebastien Hertz7d955652014-10-22 10:57:10 +0200386 pEvent->mods[i].classExclude.classPattern = nullptr;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700387 }
388 }
389
390 free(pEvent);
391}
392
393/*
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700394 * Run through the list and remove any entries with an expired "count" mod
Sebastien Hertz7d955652014-10-22 10:57:10 +0200395 * from the event list.
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700396 */
Sebastien Hertz7d955652014-10-22 10:57:10 +0200397void JdwpState::CleanupMatchList(const std::vector<JdwpEvent*>& match_list) {
398 for (JdwpEvent* pEvent : match_list) {
399 for (int i = 0; i < pEvent->modCount; ++i) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700400 if (pEvent->mods[i].modKind == MK_COUNT && pEvent->mods[i].count.count == 0) {
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200401 VLOG(jdwp) << StringPrintf("##### Removing expired event (requestId=%#" PRIx32 ")",
402 pEvent->requestId);
Elliott Hughes761928d2011-11-16 18:33:03 -0800403 UnregisterEvent(pEvent);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700404 EventFree(pEvent);
405 break;
406 }
407 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700408 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700409}
410
411/*
412 * Match a string against a "restricted regular expression", which is just
413 * a string that may start or end with '*' (e.g. "*.Foo" or "java.*").
414 *
415 * ("Restricted name globbing" might have been a better term.)
416 */
Elliott Hughes761928d2011-11-16 18:33:03 -0800417static bool PatternMatch(const char* pattern, const std::string& target) {
Elliott Hughesa2155262011-11-16 16:26:58 -0800418 size_t patLen = strlen(pattern);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700419 if (pattern[0] == '*') {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700420 patLen--;
Elliott Hughesa2155262011-11-16 16:26:58 -0800421 if (target.size() < patLen) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700422 return false;
423 }
Elliott Hughesa2155262011-11-16 16:26:58 -0800424 return strcmp(pattern+1, target.c_str() + (target.size()-patLen)) == 0;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700425 } else if (pattern[patLen-1] == '*') {
Elliott Hughesa2155262011-11-16 16:26:58 -0800426 return strncmp(pattern, target.c_str(), patLen-1) == 0;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700427 } else {
Elliott Hughesa2155262011-11-16 16:26:58 -0800428 return strcmp(pattern, target.c_str()) == 0;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700429 }
430}
431
432/*
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700433 * See if the event's mods match up with the contents of "basket".
434 *
435 * If we find a Count mod before rejecting an event, we decrement it. We
436 * need to do this even if later mods cause us to ignore the event.
437 */
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200438static bool ModsMatch(JdwpEvent* pEvent, const ModBasket& basket)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700439 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700440 JdwpEventMod* pMod = pEvent->mods;
441
442 for (int i = pEvent->modCount; i > 0; i--, pMod++) {
443 switch (pMod->modKind) {
444 case MK_COUNT:
445 CHECK_GT(pMod->count.count, 0);
446 pMod->count.count--;
Sebastien Hertz43207792014-04-15 16:03:27 +0200447 if (pMod->count.count > 0) {
448 return false;
449 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700450 break;
451 case MK_CONDITIONAL:
452 CHECK(false); // should not be getting these
453 break;
454 case MK_THREAD_ONLY:
Sebastien Hertz6995c602014-09-09 12:10:13 +0200455 if (!Dbg::MatchThread(pMod->threadOnly.threadId, basket.thread)) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700456 return false;
457 }
458 break;
459 case MK_CLASS_ONLY:
Sebastien Hertz6995c602014-09-09 12:10:13 +0200460 if (!Dbg::MatchType(basket.locationClass, pMod->classOnly.refTypeId)) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700461 return false;
462 }
463 break;
464 case MK_CLASS_MATCH:
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200465 if (!PatternMatch(pMod->classMatch.classPattern, basket.className)) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700466 return false;
467 }
468 break;
469 case MK_CLASS_EXCLUDE:
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200470 if (PatternMatch(pMod->classMatch.classPattern, basket.className)) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700471 return false;
472 }
473 break;
474 case MK_LOCATION_ONLY:
Sebastien Hertz6995c602014-09-09 12:10:13 +0200475 if (!Dbg::MatchLocation(pMod->locationOnly.loc, *basket.pLoc)) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700476 return false;
477 }
478 break;
479 case MK_EXCEPTION_ONLY:
Sebastien Hertz6995c602014-09-09 12:10:13 +0200480 if (pMod->exceptionOnly.refTypeId != 0 &&
481 !Dbg::MatchType(basket.exceptionClass, pMod->exceptionOnly.refTypeId)) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700482 return false;
483 }
Sebastien Hertz6995c602014-09-09 12:10:13 +0200484 if ((basket.caught && !pMod->exceptionOnly.caught) ||
485 (!basket.caught && !pMod->exceptionOnly.uncaught)) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700486 return false;
487 }
488 break;
489 case MK_FIELD_ONLY:
Sebastien Hertz6995c602014-09-09 12:10:13 +0200490 if (!Dbg::MatchField(pMod->fieldOnly.refTypeId, pMod->fieldOnly.fieldId, basket.field)) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700491 return false;
492 }
493 break;
494 case MK_STEP:
Sebastien Hertz6995c602014-09-09 12:10:13 +0200495 if (!Dbg::MatchThread(pMod->step.threadId, basket.thread)) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700496 return false;
497 }
498 break;
499 case MK_INSTANCE_ONLY:
Sebastien Hertz6995c602014-09-09 12:10:13 +0200500 if (!Dbg::MatchInstance(pMod->instanceOnly.objectId, basket.thisPtr)) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700501 return false;
502 }
503 break;
504 default:
Elliott Hughes7b3cdfc2011-12-08 21:28:17 -0800505 LOG(FATAL) << "unknown mod kind " << pMod->modKind;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700506 break;
507 }
508 }
509 return true;
510}
511
512/*
Sebastien Hertz7d955652014-10-22 10:57:10 +0200513 * Find all events of type "event_kind" with mods that match up with the
514 * rest of the arguments while holding the event list lock. This method
515 * is used by FindMatchingEvents below.
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700516 *
Sebastien Hertz7d955652014-10-22 10:57:10 +0200517 * Found events are appended to "match_list" so this may be called multiple times for grouped
518 * events.
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700519 *
520 * DO NOT call this multiple times for the same eventKind, as Count mods are
521 * decremented during the scan.
522 */
Sebastien Hertz7d955652014-10-22 10:57:10 +0200523void JdwpState::FindMatchingEventsLocked(JdwpEventKind event_kind, const ModBasket& basket,
524 std::vector<JdwpEvent*>* match_list) {
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200525 for (JdwpEvent* pEvent = event_list_; pEvent != nullptr; pEvent = pEvent->next) {
Sebastien Hertz7d955652014-10-22 10:57:10 +0200526 if (pEvent->eventKind == event_kind && ModsMatch(pEvent, basket)) {
527 match_list->push_back(pEvent);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700528 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700529 }
530}
531
532/*
Sebastien Hertz7d955652014-10-22 10:57:10 +0200533 * Find all events of type "event_kind" with mods that match up with the
534 * rest of the arguments and return true if at least one event matches,
535 * false otherwise.
536 *
537 * Found events are appended to "match_list" so this may be called multiple
538 * times for grouped events.
539 *
540 * DO NOT call this multiple times for the same eventKind, as Count mods are
541 * decremented during the scan.
542 */
543bool JdwpState::FindMatchingEvents(JdwpEventKind event_kind, const ModBasket& basket,
544 std::vector<JdwpEvent*>* match_list) {
545 MutexLock mu(Thread::Current(), event_list_lock_);
546 match_list->reserve(event_list_size_);
547 FindMatchingEventsLocked(event_kind, basket, match_list);
548 return !match_list->empty();
549}
550
551/*
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700552 * Scan through the list of matches and determine the most severe
553 * suspension policy.
554 */
Sebastien Hertz7d955652014-10-22 10:57:10 +0200555static JdwpSuspendPolicy ScanSuspendPolicy(const std::vector<JdwpEvent*>& match_list) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700556 JdwpSuspendPolicy policy = SP_NONE;
557
Sebastien Hertz7d955652014-10-22 10:57:10 +0200558 for (JdwpEvent* pEvent : match_list) {
559 if (pEvent->suspend_policy > policy) {
560 policy = pEvent->suspend_policy;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700561 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700562 }
563
564 return policy;
565}
566
567/*
568 * Three possibilities:
569 * SP_NONE - do nothing
570 * SP_EVENT_THREAD - suspend ourselves
571 * SP_ALL - suspend everybody except JDWP support thread
572 */
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700573void JdwpState::SuspendByPolicy(JdwpSuspendPolicy suspend_policy, JDWP::ObjectId thread_self_id) {
Elliott Hughesf8349362012-06-18 15:00:06 -0700574 VLOG(jdwp) << "SuspendByPolicy(" << suspend_policy << ")";
575 if (suspend_policy == SP_NONE) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700576 return;
577 }
578
Elliott Hughesf8349362012-06-18 15:00:06 -0700579 if (suspend_policy == SP_ALL) {
Elliott Hughes475fc232011-10-25 15:00:35 -0700580 Dbg::SuspendVM();
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700581 } else {
Elliott Hughesf8349362012-06-18 15:00:06 -0700582 CHECK_EQ(suspend_policy, SP_EVENT_THREAD);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700583 }
584
585 /* this is rare but possible -- see CLASS_PREPARE handling */
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700586 if (thread_self_id == debug_thread_id_) {
Elliott Hughes761928d2011-11-16 18:33:03 -0800587 LOG(INFO) << "NOTE: SuspendByPolicy not suspending JDWP thread";
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700588 return;
589 }
590
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700591 while (true) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700592 Dbg::SuspendSelf();
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700593
594 /*
595 * The JDWP thread has told us (and possibly all other threads) to
596 * resume. See if it has left anything in our DebugInvokeReq mailbox.
597 */
Sebastien Hertz1558b572015-02-25 15:05:59 +0100598 DebugInvokeReq* const pReq = Dbg::GetInvokeReq();
599 if (pReq == nullptr) {
Elliott Hughes761928d2011-11-16 18:33:03 -0800600 /*LOGD("SuspendByPolicy: no invoke needed");*/
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700601 break;
602 }
603
604 /* grab this before posting/suspending again */
Sebastien Hertz2bf93f42015-01-09 18:44:05 +0100605 AcquireJdwpTokenForEvent(thread_self_id);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700606
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700607 Dbg::ExecuteMethod(pReq);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700608 }
609}
610
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700611void JdwpState::SendRequestAndPossiblySuspend(ExpandBuf* pReq, JdwpSuspendPolicy suspend_policy,
612 ObjectId threadId) {
Sebastien Hertz7d955652014-10-22 10:57:10 +0200613 Thread* const self = Thread::Current();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700614 self->AssertThreadSuspensionIsAllowable();
Sebastien Hertz7d955652014-10-22 10:57:10 +0200615 CHECK(pReq != nullptr);
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700616 /* send request and possibly suspend ourselves */
Sebastien Hertz7d955652014-10-22 10:57:10 +0200617 JDWP::ObjectId thread_self_id = Dbg::GetThreadSelfId();
618 self->TransitionFromRunnableToSuspended(kWaitingForDebuggerSend);
619 if (suspend_policy != SP_NONE) {
Sebastien Hertz2bf93f42015-01-09 18:44:05 +0100620 AcquireJdwpTokenForEvent(threadId);
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700621 }
Sebastien Hertz7d955652014-10-22 10:57:10 +0200622 EventFinish(pReq);
Sebastien Hertz813b9602015-02-24 14:56:59 +0100623 {
624 // Before suspending, we change our state to kSuspended so the debugger sees us as RUNNING.
625 ScopedThreadStateChange stsc(self, kSuspended);
626 SuspendByPolicy(suspend_policy, thread_self_id);
627 }
Sebastien Hertz7d955652014-10-22 10:57:10 +0200628 self->TransitionFromSuspendedToRunnable();
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700629}
630
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700631/*
632 * Determine if there is a method invocation in progress in the current
633 * thread.
634 *
Elliott Hughes475fc232011-10-25 15:00:35 -0700635 * We look at the "invoke_needed" flag in the per-thread DebugInvokeReq
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700636 * state. If set, we're in the process of invoking a method.
637 */
Elliott Hughes761928d2011-11-16 18:33:03 -0800638bool JdwpState::InvokeInProgress() {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700639 DebugInvokeReq* pReq = Dbg::GetInvokeReq();
Sebastien Hertz1558b572015-02-25 15:05:59 +0100640 return pReq != nullptr;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700641}
642
Sebastien Hertz2bf93f42015-01-09 18:44:05 +0100643void JdwpState::AcquireJdwpTokenForCommand() {
644 CHECK_EQ(Thread::Current(), GetDebugThread()) << "Expected debugger thread";
645 SetWaitForJdwpToken(debug_thread_id_);
646}
647
648void JdwpState::ReleaseJdwpTokenForCommand() {
649 CHECK_EQ(Thread::Current(), GetDebugThread()) << "Expected debugger thread";
650 ClearWaitForJdwpToken();
651}
652
653void JdwpState::AcquireJdwpTokenForEvent(ObjectId threadId) {
654 CHECK_NE(Thread::Current(), GetDebugThread()) << "Expected event thread";
655 CHECK_NE(debug_thread_id_, threadId) << "Not expected debug thread";
656 SetWaitForJdwpToken(threadId);
657}
658
659void JdwpState::ReleaseJdwpTokenForEvent() {
660 CHECK_NE(Thread::Current(), GetDebugThread()) << "Expected event thread";
661 ClearWaitForJdwpToken();
662}
663
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700664/*
665 * We need the JDWP thread to hold off on doing stuff while we post an
666 * event and then suspend ourselves.
667 *
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700668 * This could go to sleep waiting for another thread, so it's important
669 * that the thread be marked as VMWAIT before calling here.
670 */
Sebastien Hertz2bf93f42015-01-09 18:44:05 +0100671void JdwpState::SetWaitForJdwpToken(ObjectId threadId) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700672 bool waited = false;
Sebastien Hertz2bf93f42015-01-09 18:44:05 +0100673 Thread* const self = Thread::Current();
674 CHECK_NE(threadId, 0u);
675 CHECK_NE(self->GetState(), kRunnable);
676 Locks::mutator_lock_->AssertNotHeld(self);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700677
678 /* this is held for very brief periods; contention is unlikely */
Sebastien Hertz2bf93f42015-01-09 18:44:05 +0100679 MutexLock mu(self, jdwp_token_lock_);
680
681 CHECK_NE(jdwp_token_owner_thread_id_, threadId) << "Thread is already holding event thread lock";
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700682
683 /*
684 * If another thread is already doing stuff, wait for it. This can
685 * go to sleep indefinitely.
686 */
Sebastien Hertz2bf93f42015-01-09 18:44:05 +0100687 while (jdwp_token_owner_thread_id_ != 0) {
Ian Rogersd9e4e0c2014-01-23 20:11:40 -0800688 VLOG(jdwp) << StringPrintf("event in progress (%#" PRIx64 "), %#" PRIx64 " sleeping",
Sebastien Hertz2bf93f42015-01-09 18:44:05 +0100689 jdwp_token_owner_thread_id_, threadId);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700690 waited = true;
Sebastien Hertz2bf93f42015-01-09 18:44:05 +0100691 jdwp_token_cond_.Wait(self);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700692 }
693
Sebastien Hertz2bf93f42015-01-09 18:44:05 +0100694 if (waited || threadId != debug_thread_id_) {
Ian Rogersd9e4e0c2014-01-23 20:11:40 -0800695 VLOG(jdwp) << StringPrintf("event token grabbed (%#" PRIx64 ")", threadId);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700696 }
Sebastien Hertz2bf93f42015-01-09 18:44:05 +0100697 jdwp_token_owner_thread_id_ = threadId;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700698}
699
700/*
701 * Clear the threadId and signal anybody waiting.
702 */
Sebastien Hertz2bf93f42015-01-09 18:44:05 +0100703void JdwpState::ClearWaitForJdwpToken() {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700704 /*
705 * Grab the mutex. Don't try to go in/out of VMWAIT mode, as this
Sebastien Hertz2bf93f42015-01-09 18:44:05 +0100706 * function is called by Dbg::SuspendSelf(), and the transition back
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700707 * to RUNNING would confuse it.
708 */
Sebastien Hertz2bf93f42015-01-09 18:44:05 +0100709 Thread* const self = Thread::Current();
710 MutexLock mu(self, jdwp_token_lock_);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700711
Sebastien Hertz2bf93f42015-01-09 18:44:05 +0100712 CHECK_NE(jdwp_token_owner_thread_id_, 0U);
713 VLOG(jdwp) << StringPrintf("cleared event token (%#" PRIx64 ")", jdwp_token_owner_thread_id_);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700714
Sebastien Hertz2bf93f42015-01-09 18:44:05 +0100715 jdwp_token_owner_thread_id_ = 0;
716 jdwp_token_cond_.Signal(self);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700717}
718
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700719/*
720 * Prep an event. Allocates storage for the message and leaves space for
721 * the header.
722 */
723static ExpandBuf* eventPrep() {
724 ExpandBuf* pReq = expandBufAlloc();
725 expandBufAddSpace(pReq, kJDWPHeaderLen);
726 return pReq;
727}
728
729/*
730 * Write the header into the buffer and send the packet off to the debugger.
731 *
732 * Takes ownership of "pReq" (currently discards it).
733 */
Elliott Hughes761928d2011-11-16 18:33:03 -0800734void JdwpState::EventFinish(ExpandBuf* pReq) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700735 uint8_t* buf = expandBufGetBuffer(pReq);
736
Elliott Hughesf7c3b662011-10-27 12:04:56 -0700737 Set4BE(buf, expandBufGetLength(pReq));
Sebastien Hertz7d955652014-10-22 10:57:10 +0200738 Set4BE(buf + 4, NextRequestSerial());
739 Set1(buf + 8, 0); /* flags */
740 Set1(buf + 9, kJdwpEventCommandSet);
741 Set1(buf + 10, kJdwpCompositeCommand);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700742
Elliott Hughes761928d2011-11-16 18:33:03 -0800743 SendRequest(pReq);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700744
745 expandBufFree(pReq);
746}
747
748
749/*
750 * Tell the debugger that we have finished initializing. This is always
751 * sent, even if the debugger hasn't requested it.
752 *
753 * This should be sent "before the main thread is started and before
754 * any application code has been executed". The thread ID in the message
755 * must be for the main thread.
756 */
Sebastien Hertz7d955652014-10-22 10:57:10 +0200757void JdwpState::PostVMStart() {
758 JdwpSuspendPolicy suspend_policy = (options_->suspend) ? SP_ALL : SP_NONE;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700759 ObjectId threadId = Dbg::GetThreadSelfId();
760
Sebastien Hertz7d955652014-10-22 10:57:10 +0200761 VLOG(jdwp) << "EVENT: " << EK_VM_START;
762 VLOG(jdwp) << " suspend_policy=" << suspend_policy;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700763
Elliott Hughes761928d2011-11-16 18:33:03 -0800764 ExpandBuf* pReq = eventPrep();
Sebastien Hertz7d955652014-10-22 10:57:10 +0200765 expandBufAdd1(pReq, suspend_policy);
766 expandBufAdd4BE(pReq, 1);
767 expandBufAdd1(pReq, EK_VM_START);
768 expandBufAdd4BE(pReq, 0); /* requestId */
769 expandBufAddObjectId(pReq, threadId);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700770
Sebastien Hertz138dbfc2013-12-04 18:15:25 +0100771 Dbg::ManageDeoptimization();
772
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700773 /* send request and possibly suspend ourselves */
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700774 SendRequestAndPossiblySuspend(pReq, suspend_policy, threadId);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700775}
776
Sebastien Hertz7d955652014-10-22 10:57:10 +0200777static void LogMatchingEventsAndThread(const std::vector<JdwpEvent*> match_list,
Sebastien Hertz6995c602014-09-09 12:10:13 +0200778 ObjectId thread_id)
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200779 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Sebastien Hertz7d955652014-10-22 10:57:10 +0200780 for (size_t i = 0, e = match_list.size(); i < e; ++i) {
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200781 JdwpEvent* pEvent = match_list[i];
782 VLOG(jdwp) << "EVENT #" << i << ": " << pEvent->eventKind
783 << StringPrintf(" (requestId=%#" PRIx32 ")", pEvent->requestId);
784 }
785 std::string thread_name;
Sebastien Hertz6995c602014-09-09 12:10:13 +0200786 JdwpError error = Dbg::GetThreadName(thread_id, &thread_name);
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200787 if (error != JDWP::ERR_NONE) {
788 thread_name = "<unknown>";
789 }
Sebastien Hertz6995c602014-09-09 12:10:13 +0200790 VLOG(jdwp) << StringPrintf(" thread=%#" PRIx64, thread_id) << " " << thread_name;
791}
792
793static void SetJdwpLocationFromEventLocation(const JDWP::EventLocation* event_location,
794 JDWP::JdwpLocation* jdwp_location)
795 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
796 DCHECK(event_location != nullptr);
797 DCHECK(jdwp_location != nullptr);
798 Dbg::SetJdwpLocation(jdwp_location, event_location->method, event_location->dex_pc);
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200799}
800
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700801/*
802 * A location of interest has been reached. This handles:
803 * Breakpoint
804 * SingleStep
805 * MethodEntry
806 * MethodExit
807 * These four types must be grouped together in a single response. The
808 * "eventFlags" indicates the type of event(s) that have happened.
809 *
810 * Valid mods:
811 * Count, ThreadOnly, ClassOnly, ClassMatch, ClassExclude, InstanceOnly
812 * LocationOnly (for breakpoint/step only)
813 * Step (for step only)
814 *
815 * Interesting test cases:
816 * - Put a breakpoint on a native method. Eclipse creates METHOD_ENTRY
817 * and METHOD_EXIT events with a ClassOnly mod on the method's class.
818 * - Use "run to line". Eclipse creates a BREAKPOINT with Count=1.
819 * - Single-step to a line with a breakpoint. Should get a single
820 * event message with both events in it.
821 */
Sebastien Hertz7d955652014-10-22 10:57:10 +0200822void JdwpState::PostLocationEvent(const EventLocation* pLoc, mirror::Object* thisPtr,
Sebastien Hertz6995c602014-09-09 12:10:13 +0200823 int eventFlags, const JValue* returnValue) {
824 DCHECK(pLoc != nullptr);
825 DCHECK(pLoc->method != nullptr);
826 DCHECK_EQ(pLoc->method->IsStatic(), thisPtr == nullptr);
827
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700828 ModBasket basket;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700829 basket.pLoc = pLoc;
Sebastien Hertz6995c602014-09-09 12:10:13 +0200830 basket.locationClass = pLoc->method->GetDeclaringClass();
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700831 basket.thisPtr = thisPtr;
Sebastien Hertz6995c602014-09-09 12:10:13 +0200832 basket.thread = Thread::Current();
833 basket.className = Dbg::GetClassName(basket.locationClass);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700834
835 /*
836 * On rare occasions we may need to execute interpreted code in the VM
837 * while handling a request from the debugger. Don't fire breakpoints
838 * while doing so. (I don't think we currently do this at all, so
839 * this is mostly paranoia.)
840 */
Sebastien Hertz6995c602014-09-09 12:10:13 +0200841 if (basket.thread == GetDebugThread()) {
Elliott Hughes4dd9b4d2011-12-12 18:29:24 -0800842 VLOG(jdwp) << "Ignoring location event in JDWP thread";
Sebastien Hertz7d955652014-10-22 10:57:10 +0200843 return;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700844 }
845
846 /*
847 * The debugger variable display tab may invoke the interpreter to format
848 * complex objects. We want to ignore breakpoints and method entry/exit
849 * traps while working on behalf of the debugger.
850 *
851 * If we don't ignore them, the VM will get hung up, because we'll
852 * suspend on a breakpoint while the debugger is still waiting for its
853 * method invocation to complete.
854 */
Elliott Hughes761928d2011-11-16 18:33:03 -0800855 if (InvokeInProgress()) {
Elliott Hughes4dd9b4d2011-12-12 18:29:24 -0800856 VLOG(jdwp) << "Not checking breakpoints during invoke (" << basket.className << ")";
Sebastien Hertz7d955652014-10-22 10:57:10 +0200857 return;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700858 }
859
Sebastien Hertz7d955652014-10-22 10:57:10 +0200860 std::vector<JdwpEvent*> match_list;
Elliott Hughes761928d2011-11-16 18:33:03 -0800861 {
Sebastien Hertz7d955652014-10-22 10:57:10 +0200862 // We use the locked version because we have multiple possible match events.
863 MutexLock mu(Thread::Current(), event_list_lock_);
864 match_list.reserve(event_list_size_);
865 if ((eventFlags & Dbg::kBreakpoint) != 0) {
866 FindMatchingEventsLocked(EK_BREAKPOINT, basket, &match_list);
Elliott Hughes761928d2011-11-16 18:33:03 -0800867 }
Sebastien Hertz7d955652014-10-22 10:57:10 +0200868 if ((eventFlags & Dbg::kSingleStep) != 0) {
869 FindMatchingEventsLocked(EK_SINGLE_STEP, basket, &match_list);
Elliott Hughes761928d2011-11-16 18:33:03 -0800870 }
Sebastien Hertz7d955652014-10-22 10:57:10 +0200871 if ((eventFlags & Dbg::kMethodEntry) != 0) {
872 FindMatchingEventsLocked(EK_METHOD_ENTRY, basket, &match_list);
Sebastien Hertz6995c602014-09-09 12:10:13 +0200873 }
Sebastien Hertz7d955652014-10-22 10:57:10 +0200874 if ((eventFlags & Dbg::kMethodExit) != 0) {
875 FindMatchingEventsLocked(EK_METHOD_EXIT, basket, &match_list);
876 FindMatchingEventsLocked(EK_METHOD_EXIT_WITH_RETURN_VALUE, basket, &match_list);
877 }
878 }
879 if (match_list.empty()) {
880 // No matching event.
881 return;
882 }
883 JdwpSuspendPolicy suspend_policy = ScanSuspendPolicy(match_list);
884
885 ObjectId thread_id = Dbg::GetThreadId(basket.thread);
886 JDWP::JdwpLocation jdwp_location;
887 SetJdwpLocationFromEventLocation(pLoc, &jdwp_location);
888
889 if (VLOG_IS_ON(jdwp)) {
890 LogMatchingEventsAndThread(match_list, thread_id);
891 VLOG(jdwp) << " location=" << jdwp_location;
892 VLOG(jdwp) << " suspend_policy=" << suspend_policy;
893 }
894
895 ExpandBuf* pReq = eventPrep();
896 expandBufAdd1(pReq, suspend_policy);
897 expandBufAdd4BE(pReq, match_list.size());
898
899 for (const JdwpEvent* pEvent : match_list) {
900 expandBufAdd1(pReq, pEvent->eventKind);
901 expandBufAdd4BE(pReq, pEvent->requestId);
902 expandBufAddObjectId(pReq, thread_id);
903 expandBufAddLocation(pReq, jdwp_location);
904 if (pEvent->eventKind == EK_METHOD_EXIT_WITH_RETURN_VALUE) {
905 Dbg::OutputMethodReturnValue(jdwp_location.method_id, returnValue, pReq);
906 }
907 }
908
909 {
910 MutexLock mu(Thread::Current(), event_list_lock_);
911 CleanupMatchList(match_list);
Elliott Hughes761928d2011-11-16 18:33:03 -0800912 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700913
Sebastien Hertz138dbfc2013-12-04 18:15:25 +0100914 Dbg::ManageDeoptimization();
915
Sebastien Hertz6995c602014-09-09 12:10:13 +0200916 SendRequestAndPossiblySuspend(pReq, suspend_policy, thread_id);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700917}
918
Mathieu Chartierc7853442015-03-27 14:35:38 -0700919void JdwpState::PostFieldEvent(const EventLocation* pLoc, ArtField* field,
Sebastien Hertz6995c602014-09-09 12:10:13 +0200920 mirror::Object* this_object, const JValue* fieldValue,
921 bool is_modification) {
922 DCHECK(pLoc != nullptr);
923 DCHECK(field != nullptr);
924 DCHECK_EQ(fieldValue != nullptr, is_modification);
925 DCHECK_EQ(field->IsStatic(), this_object == nullptr);
926
Sebastien Hertz3f52eaf2014-04-04 17:50:18 +0200927 ModBasket basket;
928 basket.pLoc = pLoc;
Sebastien Hertz6995c602014-09-09 12:10:13 +0200929 basket.locationClass = pLoc->method->GetDeclaringClass();
930 basket.thisPtr = this_object;
931 basket.thread = Thread::Current();
932 basket.className = Dbg::GetClassName(basket.locationClass);
933 basket.field = field;
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200934
Sebastien Hertz3f52eaf2014-04-04 17:50:18 +0200935 if (InvokeInProgress()) {
936 VLOG(jdwp) << "Not posting field event during invoke";
Sebastien Hertz7d955652014-10-22 10:57:10 +0200937 return;
Sebastien Hertz3f52eaf2014-04-04 17:50:18 +0200938 }
939
Sebastien Hertz7d955652014-10-22 10:57:10 +0200940 std::vector<JdwpEvent*> match_list;
941 const JdwpEventKind match_kind = (is_modification) ? EK_FIELD_MODIFICATION : EK_FIELD_ACCESS;
942 if (!FindMatchingEvents(match_kind, basket, &match_list)) {
943 // No matching event.
944 return;
945 }
946
947 JdwpSuspendPolicy suspend_policy = ScanSuspendPolicy(match_list);
948 ObjectId thread_id = Dbg::GetThreadId(basket.thread);
949 ObjectRegistry* registry = Dbg::GetObjectRegistry();
950 ObjectId instance_id = registry->Add(basket.thisPtr);
951 RefTypeId field_type_id = registry->AddRefType(field->GetDeclaringClass());
952 FieldId field_id = Dbg::ToFieldId(field);
953 JDWP::JdwpLocation jdwp_location;
954 SetJdwpLocationFromEventLocation(pLoc, &jdwp_location);
955
956 if (VLOG_IS_ON(jdwp)) {
957 LogMatchingEventsAndThread(match_list, thread_id);
958 VLOG(jdwp) << " location=" << jdwp_location;
959 VLOG(jdwp) << StringPrintf(" this=%#" PRIx64, instance_id);
960 VLOG(jdwp) << StringPrintf(" type=%#" PRIx64, field_type_id) << " "
961 << Dbg::GetClassName(field_id);
Mathieu Chartierd3ed9a32015-04-10 14:23:35 -0700962 VLOG(jdwp) << StringPrintf(" field=%#" PRIx64, field_id) << " "
Sebastien Hertz7d955652014-10-22 10:57:10 +0200963 << Dbg::GetFieldName(field_id);
964 VLOG(jdwp) << " suspend_policy=" << suspend_policy;
965 }
966
967 ExpandBuf* pReq = eventPrep();
968 expandBufAdd1(pReq, suspend_policy);
969 expandBufAdd4BE(pReq, match_list.size());
970
971 // Get field's reference type tag.
972 JDWP::JdwpTypeTag type_tag = Dbg::GetTypeTag(field->GetDeclaringClass());
973
974 // Get instance type tag.
975 uint8_t tag;
Sebastien Hertz3f52eaf2014-04-04 17:50:18 +0200976 {
Sebastien Hertz7d955652014-10-22 10:57:10 +0200977 ScopedObjectAccessUnchecked soa(Thread::Current());
978 tag = Dbg::TagFromObject(soa, basket.thisPtr);
979 }
980
981 for (const JdwpEvent* pEvent : match_list) {
982 expandBufAdd1(pReq, pEvent->eventKind);
983 expandBufAdd4BE(pReq, pEvent->requestId);
984 expandBufAddObjectId(pReq, thread_id);
985 expandBufAddLocation(pReq, jdwp_location);
986 expandBufAdd1(pReq, type_tag);
987 expandBufAddRefTypeId(pReq, field_type_id);
988 expandBufAddFieldId(pReq, field_id);
989 expandBufAdd1(pReq, tag);
990 expandBufAddObjectId(pReq, instance_id);
991 if (is_modification) {
992 Dbg::OutputFieldValue(field_id, fieldValue, pReq);
Sebastien Hertz3f52eaf2014-04-04 17:50:18 +0200993 }
Sebastien Hertz7d955652014-10-22 10:57:10 +0200994 }
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200995
Sebastien Hertz7d955652014-10-22 10:57:10 +0200996 {
997 MutexLock mu(Thread::Current(), event_list_lock_);
998 CleanupMatchList(match_list);
Sebastien Hertz3f52eaf2014-04-04 17:50:18 +0200999 }
1000
1001 Dbg::ManageDeoptimization();
1002
Sebastien Hertz6995c602014-09-09 12:10:13 +02001003 SendRequestAndPossiblySuspend(pReq, suspend_policy, thread_id);
Sebastien Hertz3f52eaf2014-04-04 17:50:18 +02001004}
1005
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001006/*
1007 * A thread is starting or stopping.
1008 *
1009 * Valid mods:
1010 * Count, ThreadOnly
1011 */
Sebastien Hertz7d955652014-10-22 10:57:10 +02001012void JdwpState::PostThreadChange(Thread* thread, bool start) {
Sebastien Hertz6995c602014-09-09 12:10:13 +02001013 CHECK_EQ(thread, Thread::Current());
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001014
1015 /*
1016 * I don't think this can happen.
1017 */
Elliott Hughes761928d2011-11-16 18:33:03 -08001018 if (InvokeInProgress()) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001019 LOG(WARNING) << "Not posting thread change during invoke";
Sebastien Hertz7d955652014-10-22 10:57:10 +02001020 return;
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001021 }
1022
Sebastien Hertz107e7572014-12-18 11:13:15 +01001023 // We need the java.lang.Thread object associated to the starting/ending
1024 // thread to get its JDWP id. Therefore we can't report event if there
1025 // is no Java peer. This happens when the runtime shuts down and re-attaches
1026 // the current thread without creating a Java peer.
1027 if (thread->GetPeer() == nullptr) {
1028 return;
1029 }
1030
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001031 ModBasket basket;
Sebastien Hertz6995c602014-09-09 12:10:13 +02001032 basket.thread = thread;
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001033
Sebastien Hertz7d955652014-10-22 10:57:10 +02001034 std::vector<JdwpEvent*> match_list;
1035 const JdwpEventKind match_kind = (start) ? EK_THREAD_START : EK_THREAD_DEATH;
1036 if (!FindMatchingEvents(match_kind, basket, &match_list)) {
1037 // No matching event.
1038 return;
1039 }
1040
1041 JdwpSuspendPolicy suspend_policy = ScanSuspendPolicy(match_list);
1042 ObjectId thread_id = Dbg::GetThreadId(basket.thread);
1043
1044 if (VLOG_IS_ON(jdwp)) {
1045 LogMatchingEventsAndThread(match_list, thread_id);
1046 VLOG(jdwp) << " suspend_policy=" << suspend_policy;
1047 }
1048
1049 ExpandBuf* pReq = eventPrep();
1050 expandBufAdd1(pReq, suspend_policy);
1051 expandBufAdd4BE(pReq, match_list.size());
1052
1053 for (const JdwpEvent* pEvent : match_list) {
1054 expandBufAdd1(pReq, pEvent->eventKind);
1055 expandBufAdd4BE(pReq, pEvent->requestId);
1056 expandBufAdd8BE(pReq, thread_id);
1057 }
1058
Elliott Hughes234ab152011-10-26 14:02:26 -07001059 {
Sebastien Hertz7d955652014-10-22 10:57:10 +02001060 MutexLock mu(Thread::Current(), event_list_lock_);
1061 CleanupMatchList(match_list);
Elliott Hughes234ab152011-10-26 14:02:26 -07001062 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001063
Sebastien Hertz138dbfc2013-12-04 18:15:25 +01001064 Dbg::ManageDeoptimization();
1065
Sebastien Hertz6995c602014-09-09 12:10:13 +02001066 SendRequestAndPossiblySuspend(pReq, suspend_policy, thread_id);
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001067}
1068
1069/*
1070 * Send a polite "VM is dying" message to the debugger.
1071 *
1072 * Skips the usual "event token" stuff.
1073 */
Elliott Hughes376a7a02011-10-24 18:35:55 -07001074bool JdwpState::PostVMDeath() {
Elliott Hughes4dd9b4d2011-12-12 18:29:24 -08001075 VLOG(jdwp) << "EVENT: " << EK_VM_DEATH;
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001076
1077 ExpandBuf* pReq = eventPrep();
1078 expandBufAdd1(pReq, SP_NONE);
1079 expandBufAdd4BE(pReq, 1);
1080
1081 expandBufAdd1(pReq, EK_VM_DEATH);
1082 expandBufAdd4BE(pReq, 0);
Elliott Hughes761928d2011-11-16 18:33:03 -08001083 EventFinish(pReq);
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001084 return true;
1085}
1086
1087/*
1088 * An exception has been thrown. It may or may not have been caught.
1089 *
1090 * Valid mods:
1091 * Count, ThreadOnly, ClassOnly, ClassMatch, ClassExclude, LocationOnly,
1092 * ExceptionOnly, InstanceOnly
1093 *
1094 * The "exceptionId" has not been added to the GC-visible object registry,
1095 * because there's a pretty good chance that we're not going to send it
1096 * up the debugger.
1097 */
Sebastien Hertz7d955652014-10-22 10:57:10 +02001098void JdwpState::PostException(const EventLocation* pThrowLoc, mirror::Throwable* exception_object,
Sebastien Hertz6995c602014-09-09 12:10:13 +02001099 const EventLocation* pCatchLoc, mirror::Object* thisPtr) {
1100 DCHECK(exception_object != nullptr);
1101 DCHECK(pThrowLoc != nullptr);
1102 DCHECK(pCatchLoc != nullptr);
Sebastien Hertza9aa0ff2014-09-19 12:07:51 +02001103 if (pThrowLoc->method != nullptr) {
1104 DCHECK_EQ(pThrowLoc->method->IsStatic(), thisPtr == nullptr);
1105 } else {
1106 VLOG(jdwp) << "Unexpected: exception event with empty throw location";
1107 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001108
Sebastien Hertz6995c602014-09-09 12:10:13 +02001109 ModBasket basket;
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001110 basket.pLoc = pThrowLoc;
Sebastien Hertza9aa0ff2014-09-19 12:07:51 +02001111 if (pThrowLoc->method != nullptr) {
1112 basket.locationClass = pThrowLoc->method->GetDeclaringClass();
1113 } else {
1114 basket.locationClass = nullptr;
1115 }
Sebastien Hertz6995c602014-09-09 12:10:13 +02001116 basket.thread = Thread::Current();
1117 basket.className = Dbg::GetClassName(basket.locationClass);
1118 basket.exceptionClass = exception_object->GetClass();
1119 basket.caught = (pCatchLoc->method != 0);
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001120 basket.thisPtr = thisPtr;
1121
1122 /* don't try to post an exception caused by the debugger */
Elliott Hughes761928d2011-11-16 18:33:03 -08001123 if (InvokeInProgress()) {
Elliott Hughes4dd9b4d2011-12-12 18:29:24 -08001124 VLOG(jdwp) << "Not posting exception hit during invoke (" << basket.className << ")";
Sebastien Hertz7d955652014-10-22 10:57:10 +02001125 return;
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001126 }
1127
Sebastien Hertz7d955652014-10-22 10:57:10 +02001128 std::vector<JdwpEvent*> match_list;
1129 if (!FindMatchingEvents(EK_EXCEPTION, basket, &match_list)) {
1130 // No matching event.
1131 return;
1132 }
1133
1134 JdwpSuspendPolicy suspend_policy = ScanSuspendPolicy(match_list);
1135 ObjectId thread_id = Dbg::GetThreadId(basket.thread);
1136 ObjectRegistry* registry = Dbg::GetObjectRegistry();
1137 ObjectId exceptionId = registry->Add(exception_object);
1138 JDWP::JdwpLocation jdwp_throw_location;
1139 JDWP::JdwpLocation jdwp_catch_location;
1140 SetJdwpLocationFromEventLocation(pThrowLoc, &jdwp_throw_location);
1141 SetJdwpLocationFromEventLocation(pCatchLoc, &jdwp_catch_location);
1142
1143 if (VLOG_IS_ON(jdwp)) {
1144 std::string exceptionClassName(PrettyDescriptor(exception_object->GetClass()));
1145
1146 LogMatchingEventsAndThread(match_list, thread_id);
1147 VLOG(jdwp) << " throwLocation=" << jdwp_throw_location;
1148 if (jdwp_catch_location.class_id == 0) {
1149 VLOG(jdwp) << " catchLocation=uncaught";
1150 } else {
1151 VLOG(jdwp) << " catchLocation=" << jdwp_catch_location;
1152 }
1153 VLOG(jdwp) << StringPrintf(" exception=%#" PRIx64, exceptionId) << " "
1154 << exceptionClassName;
1155 VLOG(jdwp) << " suspend_policy=" << suspend_policy;
1156 }
1157
1158 ExpandBuf* pReq = eventPrep();
1159 expandBufAdd1(pReq, suspend_policy);
1160 expandBufAdd4BE(pReq, match_list.size());
1161
1162 for (const JdwpEvent* pEvent : match_list) {
1163 expandBufAdd1(pReq, pEvent->eventKind);
1164 expandBufAdd4BE(pReq, pEvent->requestId);
1165 expandBufAddObjectId(pReq, thread_id);
1166 expandBufAddLocation(pReq, jdwp_throw_location);
1167 expandBufAdd1(pReq, JT_OBJECT);
1168 expandBufAddObjectId(pReq, exceptionId);
1169 expandBufAddLocation(pReq, jdwp_catch_location);
1170 }
1171
Elliott Hughes761928d2011-11-16 18:33:03 -08001172 {
Sebastien Hertz7d955652014-10-22 10:57:10 +02001173 MutexLock mu(Thread::Current(), event_list_lock_);
1174 CleanupMatchList(match_list);
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001175 }
1176
Sebastien Hertz138dbfc2013-12-04 18:15:25 +01001177 Dbg::ManageDeoptimization();
1178
Sebastien Hertz6995c602014-09-09 12:10:13 +02001179 SendRequestAndPossiblySuspend(pReq, suspend_policy, thread_id);
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001180}
1181
1182/*
1183 * Announce that a class has been loaded.
1184 *
1185 * Valid mods:
1186 * Count, ThreadOnly, ClassOnly, ClassMatch, ClassExclude
1187 */
Sebastien Hertz7d955652014-10-22 10:57:10 +02001188void JdwpState::PostClassPrepare(mirror::Class* klass) {
Sebastien Hertz6995c602014-09-09 12:10:13 +02001189 DCHECK(klass != nullptr);
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001190
Sebastien Hertz6995c602014-09-09 12:10:13 +02001191 ModBasket basket;
1192 basket.locationClass = klass;
1193 basket.thread = Thread::Current();
1194 basket.className = Dbg::GetClassName(basket.locationClass);
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001195
1196 /* suppress class prep caused by debugger */
Elliott Hughes761928d2011-11-16 18:33:03 -08001197 if (InvokeInProgress()) {
Elliott Hughes4dd9b4d2011-12-12 18:29:24 -08001198 VLOG(jdwp) << "Not posting class prep caused by invoke (" << basket.className << ")";
Sebastien Hertz7d955652014-10-22 10:57:10 +02001199 return;
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001200 }
1201
Sebastien Hertz7d955652014-10-22 10:57:10 +02001202 std::vector<JdwpEvent*> match_list;
1203 if (!FindMatchingEvents(EK_CLASS_PREPARE, basket, &match_list)) {
1204 // No matching event.
1205 return;
1206 }
1207
1208 JdwpSuspendPolicy suspend_policy = ScanSuspendPolicy(match_list);
1209 ObjectId thread_id = Dbg::GetThreadId(basket.thread);
1210 ObjectRegistry* registry = Dbg::GetObjectRegistry();
1211 RefTypeId class_id = registry->AddRefType(basket.locationClass);
1212
1213 // OLD-TODO - we currently always send both "verified" and "prepared" since
1214 // debuggers seem to like that. There might be some advantage to honesty,
1215 // since the class may not yet be verified.
1216 int status = JDWP::CS_VERIFIED | JDWP::CS_PREPARED;
1217 JDWP::JdwpTypeTag tag = Dbg::GetTypeTag(basket.locationClass);
1218 std::string temp;
1219 std::string signature(basket.locationClass->GetDescriptor(&temp));
1220
1221 if (VLOG_IS_ON(jdwp)) {
1222 LogMatchingEventsAndThread(match_list, thread_id);
1223 VLOG(jdwp) << StringPrintf(" type=%#" PRIx64, class_id) << " " << signature;
1224 VLOG(jdwp) << " suspend_policy=" << suspend_policy;
1225 }
1226
1227 if (thread_id == debug_thread_id_) {
1228 /*
1229 * JDWP says that, for a class prep in the debugger thread, we
1230 * should set thread to null and if any threads were supposed
1231 * to be suspended then we suspend all other threads.
1232 */
1233 VLOG(jdwp) << " NOTE: class prepare in debugger thread!";
1234 thread_id = 0;
1235 if (suspend_policy == SP_EVENT_THREAD) {
1236 suspend_policy = SP_ALL;
1237 }
1238 }
1239
1240 ExpandBuf* pReq = eventPrep();
1241 expandBufAdd1(pReq, suspend_policy);
1242 expandBufAdd4BE(pReq, match_list.size());
1243
1244 for (const JdwpEvent* pEvent : match_list) {
1245 expandBufAdd1(pReq, pEvent->eventKind);
1246 expandBufAdd4BE(pReq, pEvent->requestId);
1247 expandBufAddObjectId(pReq, thread_id);
1248 expandBufAdd1(pReq, tag);
1249 expandBufAddRefTypeId(pReq, class_id);
1250 expandBufAddUtf8String(pReq, signature);
1251 expandBufAdd4BE(pReq, status);
1252 }
1253
Elliott Hughes761928d2011-11-16 18:33:03 -08001254 {
Sebastien Hertz7d955652014-10-22 10:57:10 +02001255 MutexLock mu(Thread::Current(), event_list_lock_);
1256 CleanupMatchList(match_list);
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001257 }
1258
Sebastien Hertz138dbfc2013-12-04 18:15:25 +01001259 Dbg::ManageDeoptimization();
1260
Sebastien Hertz6995c602014-09-09 12:10:13 +02001261 SendRequestAndPossiblySuspend(pReq, suspend_policy, thread_id);
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001262}
1263
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001264/*
Mathieu Chartierad466ad2015-01-08 16:28:08 -08001265 * Setup the header for a chunk of DDM data.
1266 */
1267void JdwpState::SetupChunkHeader(uint32_t type, size_t data_len, size_t header_size,
1268 uint8_t* out_header) {
1269 CHECK_EQ(header_size, static_cast<size_t>(kJDWPHeaderLen + 8));
1270 /* form the header (JDWP plus DDMS) */
1271 Set4BE(out_header, header_size + data_len);
1272 Set4BE(out_header + 4, NextRequestSerial());
1273 Set1(out_header + 8, 0); /* flags */
1274 Set1(out_header + 9, kJDWPDdmCmdSet);
1275 Set1(out_header + 10, kJDWPDdmCmd);
1276 Set4BE(out_header + 11, type);
1277 Set4BE(out_header + 15, data_len);
1278}
1279
1280/*
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001281 * Send up a chunk of DDM data.
1282 *
1283 * While this takes the form of a JDWP "event", it doesn't interact with
1284 * other debugger traffic, and can't suspend the VM, so we skip all of
1285 * the fun event token gymnastics.
1286 */
Elliott Hughescccd84f2011-12-05 16:51:54 -08001287void JdwpState::DdmSendChunkV(uint32_t type, const iovec* iov, int iov_count) {
Mathieu Chartierad466ad2015-01-08 16:28:08 -08001288 uint8_t header[kJDWPHeaderLen + 8] = { 0 };
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001289 size_t dataLen = 0;
1290
Sebastien Hertz7d955652014-10-22 10:57:10 +02001291 CHECK(iov != nullptr);
Elliott Hughescccd84f2011-12-05 16:51:54 -08001292 CHECK_GT(iov_count, 0);
1293 CHECK_LT(iov_count, 10);
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001294
1295 /*
1296 * "Wrap" the contents of the iovec with a JDWP/DDMS header. We do
1297 * this by creating a new copy of the vector with space for the header.
1298 */
Brian Carlstromf5293522013-07-19 00:24:00 -07001299 std::vector<iovec> wrapiov;
1300 wrapiov.push_back(iovec());
Elliott Hughescccd84f2011-12-05 16:51:54 -08001301 for (int i = 0; i < iov_count; i++) {
Brian Carlstromf5293522013-07-19 00:24:00 -07001302 wrapiov.push_back(iov[i]);
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001303 dataLen += iov[i].iov_len;
1304 }
1305
Mathieu Chartierad466ad2015-01-08 16:28:08 -08001306 SetupChunkHeader(type, dataLen, sizeof(header), header);
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001307
1308 wrapiov[0].iov_base = header;
1309 wrapiov[0].iov_len = sizeof(header);
1310
Ian Rogers15bf2d32012-08-28 17:33:04 -07001311 // Try to avoid blocking GC during a send, but only safe when not using mutexes at a lower-level
1312 // than mutator for lock ordering reasons.
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001313 Thread* self = Thread::Current();
Ian Rogers62d6c772013-02-27 08:32:07 -08001314 bool safe_to_release_mutator_lock_over_send = !Locks::mutator_lock_->IsExclusiveHeld(self);
1315 if (safe_to_release_mutator_lock_over_send) {
Brian Carlstrom38f85e42013-07-18 14:45:22 -07001316 for (size_t i = 0; i < kMutatorLock; ++i) {
Sebastien Hertz7d955652014-10-22 10:57:10 +02001317 if (self->GetHeldMutex(static_cast<LockLevel>(i)) != nullptr) {
Ian Rogers62d6c772013-02-27 08:32:07 -08001318 safe_to_release_mutator_lock_over_send = false;
1319 break;
1320 }
Ian Rogers15bf2d32012-08-28 17:33:04 -07001321 }
1322 }
1323 if (safe_to_release_mutator_lock_over_send) {
1324 // Change state to waiting to allow GC, ... while we're sending.
1325 self->TransitionFromRunnableToSuspended(kWaitingForDebuggerSend);
Brian Carlstromf5293522013-07-19 00:24:00 -07001326 SendBufferedRequest(type, wrapiov);
Ian Rogers15bf2d32012-08-28 17:33:04 -07001327 self->TransitionFromSuspendedToRunnable();
1328 } else {
1329 // Send and possibly block GC...
Brian Carlstromf5293522013-07-19 00:24:00 -07001330 SendBufferedRequest(type, wrapiov);
Ian Rogers15bf2d32012-08-28 17:33:04 -07001331 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001332}
1333
1334} // namespace JDWP
1335
1336} // namespace art