blob: 44f713ca9603c47bd4e4348b4fd84d1255903c41 [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
Elliott Hughes07ed66b2012-12-12 18:34:25 -080024#include "base/logging.h"
Elliott Hughese222ee02012-12-13 14:41:43 -080025#include "base/stringprintf.h"
Elliott Hughes07ed66b2012-12-12 18:34:25 -080026#include "debugger.h"
27#include "jdwp/jdwp_constants.h"
28#include "jdwp/jdwp_expand_buf.h"
Elliott Hughes07ed66b2012-12-12 18:34:25 -080029#include "jdwp/jdwp_priv.h"
Sebastien Hertz6995c602014-09-09 12:10:13 +020030#include "jdwp/object_registry.h"
31#include "mirror/art_field-inl.h"
32#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 */
122 mirror::ArtField* field; /* FieldOnly */
123 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) {
128 switch (eventKind) {
129 case EK_METHOD_ENTRY:
130 case EK_METHOD_EXIT:
131 case EK_METHOD_EXIT_WITH_RETURN_VALUE:
132 case EK_SINGLE_STEP:
Sebastien Hertz3f52eaf2014-04-04 17:50:18 +0200133 case EK_FIELD_ACCESS:
134 case EK_FIELD_MODIFICATION:
Sebastien Hertz138dbfc2013-12-04 18:15:25 +0100135 return true;
136 default:
137 return false;
138 }
139}
140
Andreas Gampe277ccbd2014-11-03 21:36:10 -0800141static uint32_t GetInstrumentationEventFor(JdwpEventKind eventKind) {
Sebastien Hertz42cd43f2014-05-13 14:15:41 +0200142 switch (eventKind) {
143 case EK_BREAKPOINT:
144 case EK_SINGLE_STEP:
145 return instrumentation::Instrumentation::kDexPcMoved;
146 case EK_EXCEPTION:
147 case EK_EXCEPTION_CATCH:
148 return instrumentation::Instrumentation::kExceptionCaught;
149 case EK_METHOD_ENTRY:
150 return instrumentation::Instrumentation::kMethodEntered;
151 case EK_METHOD_EXIT:
152 case EK_METHOD_EXIT_WITH_RETURN_VALUE:
153 return instrumentation::Instrumentation::kMethodExited;
154 case EK_FIELD_ACCESS:
155 return instrumentation::Instrumentation::kFieldRead;
156 case EK_FIELD_MODIFICATION:
157 return instrumentation::Instrumentation::kFieldWritten;
158 default:
159 return 0;
160 }
161}
162
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700163/*
164 * Add an event to the list. Ordering is not important.
165 *
166 * If something prevents the event from being registered, e.g. it's a
167 * single-step request on a thread that doesn't exist, the event will
168 * not be added to the list, and an appropriate error will be returned.
169 */
Elliott Hughes761928d2011-11-16 18:33:03 -0800170JdwpError JdwpState::RegisterEvent(JdwpEvent* pEvent) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700171 CHECK(pEvent != NULL);
172 CHECK(pEvent->prev == NULL);
173 CHECK(pEvent->next == NULL);
174
Sebastien Hertz42cd43f2014-05-13 14:15:41 +0200175 {
176 /*
177 * If one or more "break"-type mods are used, register them with
178 * the interpreter.
179 */
180 DeoptimizationRequest req;
181 for (int i = 0; i < pEvent->modCount; i++) {
182 const JdwpEventMod* pMod = &pEvent->mods[i];
183 if (pMod->modKind == MK_LOCATION_ONLY) {
Sebastien Hertz033aabf2014-10-08 13:54:55 +0200184 // Should only concern breakpoint, field access, field modification, step, and exception
185 // events.
186 // However breakpoint requires specific handling. Field access, field modification and step
187 // events need full deoptimization to be reported while exception event is reported during
188 // exception handling.
189 if (pEvent->eventKind == EK_BREAKPOINT) {
190 Dbg::WatchLocation(&pMod->locationOnly.loc, &req);
191 }
Sebastien Hertz42cd43f2014-05-13 14:15:41 +0200192 } else if (pMod->modKind == MK_STEP) {
193 /* should only be for EK_SINGLE_STEP; should only be one */
194 JdwpStepSize size = static_cast<JdwpStepSize>(pMod->step.size);
195 JdwpStepDepth depth = static_cast<JdwpStepDepth>(pMod->step.depth);
196 JdwpError status = Dbg::ConfigureStep(pMod->step.threadId, size, depth);
197 if (status != ERR_NONE) {
198 return status;
199 }
Elliott Hughes2435a572012-02-17 16:07:41 -0800200 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700201 }
Sebastien Hertz42cd43f2014-05-13 14:15:41 +0200202 if (NeedsFullDeoptimization(pEvent->eventKind)) {
Hiroshi Yamauchi0ec17d22014-07-07 13:07:08 -0700203 CHECK_EQ(req.GetKind(), DeoptimizationRequest::kNothing);
204 CHECK(req.Method() == nullptr);
205 req.SetKind(DeoptimizationRequest::kFullDeoptimization);
Sebastien Hertz42cd43f2014-05-13 14:15:41 +0200206 }
207 Dbg::RequestDeoptimization(req);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700208 }
Sebastien Hertz42cd43f2014-05-13 14:15:41 +0200209 uint32_t instrumentation_event = GetInstrumentationEventFor(pEvent->eventKind);
210 if (instrumentation_event != 0) {
211 DeoptimizationRequest req;
Hiroshi Yamauchi0ec17d22014-07-07 13:07:08 -0700212 req.SetKind(DeoptimizationRequest::kRegisterForEvent);
213 req.SetInstrumentationEvent(instrumentation_event);
Sebastien Hertz42cd43f2014-05-13 14:15:41 +0200214 Dbg::RequestDeoptimization(req);
Sebastien Hertz4d25df32014-03-21 17:44:46 +0100215 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700216
Sebastien Hertz138dbfc2013-12-04 18:15:25 +0100217 {
218 /*
219 * Add to list.
220 */
221 MutexLock mu(Thread::Current(), event_list_lock_);
222 if (event_list_ != NULL) {
223 pEvent->next = event_list_;
224 event_list_->prev = pEvent;
225 }
226 event_list_ = pEvent;
227 ++event_list_size_;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700228 }
Sebastien Hertz138dbfc2013-12-04 18:15:25 +0100229
230 Dbg::ManageDeoptimization();
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700231
232 return ERR_NONE;
233}
234
235/*
236 * Remove an event from the list. This will also remove the event from
237 * any optimization tables, e.g. breakpoints.
238 *
239 * Does not free the JdwpEvent.
240 *
241 * Grab the eventLock before calling here.
242 */
Elliott Hughes761928d2011-11-16 18:33:03 -0800243void JdwpState::UnregisterEvent(JdwpEvent* pEvent) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700244 if (pEvent->prev == NULL) {
245 /* head of the list */
Elliott Hughesf8349362012-06-18 15:00:06 -0700246 CHECK(event_list_ == pEvent);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700247
Elliott Hughesf8349362012-06-18 15:00:06 -0700248 event_list_ = pEvent->next;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700249 } else {
250 pEvent->prev->next = pEvent->next;
251 }
252
253 if (pEvent->next != NULL) {
254 pEvent->next->prev = pEvent->prev;
255 pEvent->next = NULL;
256 }
257 pEvent->prev = NULL;
258
Sebastien Hertz42cd43f2014-05-13 14:15:41 +0200259 {
260 /*
261 * Unhook us from the interpreter, if necessary.
262 */
263 DeoptimizationRequest req;
264 for (int i = 0; i < pEvent->modCount; i++) {
265 JdwpEventMod* pMod = &pEvent->mods[i];
266 if (pMod->modKind == MK_LOCATION_ONLY) {
Sebastien Hertz033aabf2014-10-08 13:54:55 +0200267 // Like in RegisterEvent, we need specific handling for breakpoint only.
268 if (pEvent->eventKind == EK_BREAKPOINT) {
269 Dbg::UnwatchLocation(&pMod->locationOnly.loc, &req);
270 }
Sebastien Hertz42cd43f2014-05-13 14:15:41 +0200271 }
272 if (pMod->modKind == MK_STEP) {
273 /* should only be for EK_SINGLE_STEP; should only be one */
274 Dbg::UnconfigureStep(pMod->step.threadId);
275 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700276 }
Sebastien Hertz42cd43f2014-05-13 14:15:41 +0200277 if (pEvent->eventKind == EK_SINGLE_STEP) {
278 // Special case for single-steps where we want to avoid the slow pattern deoptimize/undeoptimize
279 // loop between each single-step. In a IDE, this would happens each time the user click on the
280 // "single-step" button. Here we delay the full undeoptimization to the next resume
281 // (VM.Resume or ThreadReference.Resume) or the end of the debugging session (VM.Dispose or
282 // runtime shutdown).
283 // Therefore, in a singles-stepping sequence, only the first single-step will trigger a full
284 // deoptimization and only the last single-step will trigger a full undeoptimization.
285 Dbg::DelayFullUndeoptimization();
286 } else if (NeedsFullDeoptimization(pEvent->eventKind)) {
Hiroshi Yamauchi0ec17d22014-07-07 13:07:08 -0700287 CHECK_EQ(req.GetKind(), DeoptimizationRequest::kNothing);
288 CHECK(req.Method() == nullptr);
289 req.SetKind(DeoptimizationRequest::kFullUndeoptimization);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700290 }
Sebastien Hertz42cd43f2014-05-13 14:15:41 +0200291 Dbg::RequestDeoptimization(req);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700292 }
Sebastien Hertz42cd43f2014-05-13 14:15:41 +0200293 uint32_t instrumentation_event = GetInstrumentationEventFor(pEvent->eventKind);
294 if (instrumentation_event != 0) {
295 DeoptimizationRequest req;
Hiroshi Yamauchi0ec17d22014-07-07 13:07:08 -0700296 req.SetKind(DeoptimizationRequest::kUnregisterForEvent);
297 req.SetInstrumentationEvent(instrumentation_event);
Sebastien Hertz42cd43f2014-05-13 14:15:41 +0200298 Dbg::RequestDeoptimization(req);
Sebastien Hertz4d25df32014-03-21 17:44:46 +0100299 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700300
Elliott Hughesf8349362012-06-18 15:00:06 -0700301 --event_list_size_;
302 CHECK(event_list_size_ != 0 || event_list_ == NULL);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700303}
304
305/*
306 * Remove the event with the given ID from the list.
307 *
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700308 */
Elliott Hughes761928d2011-11-16 18:33:03 -0800309void JdwpState::UnregisterEventById(uint32_t requestId) {
Sebastien Hertz138dbfc2013-12-04 18:15:25 +0100310 bool found = false;
311 {
312 MutexLock mu(Thread::Current(), event_list_lock_);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700313
Sebastien Hertz138dbfc2013-12-04 18:15:25 +0100314 for (JdwpEvent* pEvent = event_list_; pEvent != nullptr; pEvent = pEvent->next) {
315 if (pEvent->requestId == requestId) {
316 found = true;
317 UnregisterEvent(pEvent);
318 EventFree(pEvent);
319 break; /* there can be only one with a given ID */
320 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700321 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700322 }
323
Sebastien Hertz138dbfc2013-12-04 18:15:25 +0100324 if (found) {
325 Dbg::ManageDeoptimization();
326 } else {
Sebastien Hertzf272af42014-09-18 10:20:42 +0200327 // Failure to find the event isn't really an error. For instance, it looks like Eclipse will
328 // try to be extra careful and will explicitly remove one-off single-step events (using a
329 // 'count' event modifier of 1). So the event may have already been removed as part of the
330 // event notification (see JdwpState::CleanupMatchList).
331 VLOG(jdwp) << StringPrintf("No match when removing event reqId=0x%04x", requestId);
Sebastien Hertz138dbfc2013-12-04 18:15:25 +0100332 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700333}
334
335/*
336 * Remove all entries from the event list.
337 */
Elliott Hughes761928d2011-11-16 18:33:03 -0800338void JdwpState::UnregisterAll() {
Ian Rogers50b35e22012-10-04 10:09:15 -0700339 MutexLock mu(Thread::Current(), event_list_lock_);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700340
Elliott Hughesf8349362012-06-18 15:00:06 -0700341 JdwpEvent* pEvent = event_list_;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700342 while (pEvent != NULL) {
343 JdwpEvent* pNextEvent = pEvent->next;
344
Elliott Hughes761928d2011-11-16 18:33:03 -0800345 UnregisterEvent(pEvent);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700346 EventFree(pEvent);
347 pEvent = pNextEvent;
348 }
349
Elliott Hughesf8349362012-06-18 15:00:06 -0700350 event_list_ = NULL;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700351}
352
353/*
354 * Allocate a JdwpEvent struct with enough space to hold the specified
355 * number of mod records.
356 */
357JdwpEvent* EventAlloc(int numMods) {
358 JdwpEvent* newEvent;
359 int allocSize = offsetof(JdwpEvent, mods) + numMods * sizeof(newEvent->mods[0]);
360 newEvent = reinterpret_cast<JdwpEvent*>(malloc(allocSize));
361 memset(newEvent, 0, allocSize);
362 return newEvent;
363}
364
365/*
366 * Free a JdwpEvent.
367 *
368 * Do not call this until the event has been removed from the list.
369 */
370void EventFree(JdwpEvent* pEvent) {
371 if (pEvent == NULL) {
372 return;
373 }
374
375 /* make sure it was removed from the list */
376 CHECK(pEvent->prev == NULL);
377 CHECK(pEvent->next == NULL);
Elliott Hughesf8349362012-06-18 15:00:06 -0700378 /* want to check state->event_list_ != pEvent */
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700379
380 /*
381 * Free any hairy bits in the mods.
382 */
383 for (int i = 0; i < pEvent->modCount; i++) {
384 if (pEvent->mods[i].modKind == MK_CLASS_MATCH) {
385 free(pEvent->mods[i].classMatch.classPattern);
386 pEvent->mods[i].classMatch.classPattern = NULL;
387 }
388 if (pEvent->mods[i].modKind == MK_CLASS_EXCLUDE) {
389 free(pEvent->mods[i].classExclude.classPattern);
390 pEvent->mods[i].classExclude.classPattern = NULL;
391 }
392 }
393
394 free(pEvent);
395}
396
397/*
398 * Allocate storage for matching events. To keep things simple we
399 * use an array with enough storage for the entire list.
400 *
401 * The state->eventLock should be held before calling.
402 */
Elliott Hughes761928d2011-11-16 18:33:03 -0800403static JdwpEvent** AllocMatchList(size_t event_count) {
404 return new JdwpEvent*[event_count];
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700405}
406
407/*
408 * Run through the list and remove any entries with an expired "count" mod
409 * from the event list, then free the match list.
410 */
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200411void JdwpState::CleanupMatchList(JdwpEvent** match_list, size_t match_count) {
Elliott Hughesf8349362012-06-18 15:00:06 -0700412 JdwpEvent** ppEvent = match_list;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700413
Elliott Hughes2aa2e392012-02-17 17:15:43 -0800414 while (match_count--) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700415 JdwpEvent* pEvent = *ppEvent;
416
417 for (int i = 0; i < pEvent->modCount; i++) {
418 if (pEvent->mods[i].modKind == MK_COUNT && pEvent->mods[i].count.count == 0) {
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200419 VLOG(jdwp) << StringPrintf("##### Removing expired event (requestId=%#" PRIx32 ")",
420 pEvent->requestId);
Elliott Hughes761928d2011-11-16 18:33:03 -0800421 UnregisterEvent(pEvent);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700422 EventFree(pEvent);
423 break;
424 }
425 }
426
427 ppEvent++;
428 }
429
Elliott Hughesf8349362012-06-18 15:00:06 -0700430 delete[] match_list;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700431}
432
433/*
434 * Match a string against a "restricted regular expression", which is just
435 * a string that may start or end with '*' (e.g. "*.Foo" or "java.*").
436 *
437 * ("Restricted name globbing" might have been a better term.)
438 */
Elliott Hughes761928d2011-11-16 18:33:03 -0800439static bool PatternMatch(const char* pattern, const std::string& target) {
Elliott Hughesa2155262011-11-16 16:26:58 -0800440 size_t patLen = strlen(pattern);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700441 if (pattern[0] == '*') {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700442 patLen--;
Elliott Hughesa2155262011-11-16 16:26:58 -0800443 if (target.size() < patLen) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700444 return false;
445 }
Elliott Hughesa2155262011-11-16 16:26:58 -0800446 return strcmp(pattern+1, target.c_str() + (target.size()-patLen)) == 0;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700447 } else if (pattern[patLen-1] == '*') {
Elliott Hughesa2155262011-11-16 16:26:58 -0800448 return strncmp(pattern, target.c_str(), patLen-1) == 0;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700449 } else {
Elliott Hughesa2155262011-11-16 16:26:58 -0800450 return strcmp(pattern, target.c_str()) == 0;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700451 }
452}
453
454/*
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700455 * See if the event's mods match up with the contents of "basket".
456 *
457 * If we find a Count mod before rejecting an event, we decrement it. We
458 * need to do this even if later mods cause us to ignore the event.
459 */
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200460static bool ModsMatch(JdwpEvent* pEvent, const ModBasket& basket)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700461 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700462 JdwpEventMod* pMod = pEvent->mods;
463
464 for (int i = pEvent->modCount; i > 0; i--, pMod++) {
465 switch (pMod->modKind) {
466 case MK_COUNT:
467 CHECK_GT(pMod->count.count, 0);
468 pMod->count.count--;
Sebastien Hertz43207792014-04-15 16:03:27 +0200469 if (pMod->count.count > 0) {
470 return false;
471 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700472 break;
473 case MK_CONDITIONAL:
474 CHECK(false); // should not be getting these
475 break;
476 case MK_THREAD_ONLY:
Sebastien Hertz6995c602014-09-09 12:10:13 +0200477 if (!Dbg::MatchThread(pMod->threadOnly.threadId, basket.thread)) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700478 return false;
479 }
480 break;
481 case MK_CLASS_ONLY:
Sebastien Hertz6995c602014-09-09 12:10:13 +0200482 if (!Dbg::MatchType(basket.locationClass, pMod->classOnly.refTypeId)) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700483 return false;
484 }
485 break;
486 case MK_CLASS_MATCH:
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200487 if (!PatternMatch(pMod->classMatch.classPattern, basket.className)) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700488 return false;
489 }
490 break;
491 case MK_CLASS_EXCLUDE:
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200492 if (PatternMatch(pMod->classMatch.classPattern, basket.className)) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700493 return false;
494 }
495 break;
496 case MK_LOCATION_ONLY:
Sebastien Hertz6995c602014-09-09 12:10:13 +0200497 if (!Dbg::MatchLocation(pMod->locationOnly.loc, *basket.pLoc)) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700498 return false;
499 }
500 break;
501 case MK_EXCEPTION_ONLY:
Sebastien Hertz6995c602014-09-09 12:10:13 +0200502 if (pMod->exceptionOnly.refTypeId != 0 &&
503 !Dbg::MatchType(basket.exceptionClass, pMod->exceptionOnly.refTypeId)) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700504 return false;
505 }
Sebastien Hertz6995c602014-09-09 12:10:13 +0200506 if ((basket.caught && !pMod->exceptionOnly.caught) ||
507 (!basket.caught && !pMod->exceptionOnly.uncaught)) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700508 return false;
509 }
510 break;
511 case MK_FIELD_ONLY:
Sebastien Hertz6995c602014-09-09 12:10:13 +0200512 if (!Dbg::MatchField(pMod->fieldOnly.refTypeId, pMod->fieldOnly.fieldId, basket.field)) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700513 return false;
514 }
515 break;
516 case MK_STEP:
Sebastien Hertz6995c602014-09-09 12:10:13 +0200517 if (!Dbg::MatchThread(pMod->step.threadId, basket.thread)) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700518 return false;
519 }
520 break;
521 case MK_INSTANCE_ONLY:
Sebastien Hertz6995c602014-09-09 12:10:13 +0200522 if (!Dbg::MatchInstance(pMod->instanceOnly.objectId, basket.thisPtr)) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700523 return false;
524 }
525 break;
526 default:
Elliott Hughes7b3cdfc2011-12-08 21:28:17 -0800527 LOG(FATAL) << "unknown mod kind " << pMod->modKind;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700528 break;
529 }
530 }
531 return true;
532}
533
534/*
535 * Find all events of type "eventKind" with mods that match up with the
536 * rest of the arguments.
537 *
Elliott Hughesf8349362012-06-18 15:00:06 -0700538 * Found events are appended to "match_list", and "*pMatchCount" is advanced,
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700539 * so this may be called multiple times for grouped events.
540 *
541 * DO NOT call this multiple times for the same eventKind, as Count mods are
542 * decremented during the scan.
543 */
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200544void JdwpState::FindMatchingEvents(JdwpEventKind eventKind, const ModBasket& basket,
545 JdwpEvent** match_list, size_t* pMatchCount) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700546 /* start after the existing entries */
Elliott Hughesf8349362012-06-18 15:00:06 -0700547 match_list += *pMatchCount;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700548
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200549 for (JdwpEvent* pEvent = event_list_; pEvent != nullptr; pEvent = pEvent->next) {
Elliott Hughes761928d2011-11-16 18:33:03 -0800550 if (pEvent->eventKind == eventKind && ModsMatch(pEvent, basket)) {
Elliott Hughesf8349362012-06-18 15:00:06 -0700551 *match_list++ = pEvent;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700552 (*pMatchCount)++;
553 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700554 }
555}
556
557/*
558 * Scan through the list of matches and determine the most severe
559 * suspension policy.
560 */
Elliott Hughesf8349362012-06-18 15:00:06 -0700561static JdwpSuspendPolicy scanSuspendPolicy(JdwpEvent** match_list, int match_count) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700562 JdwpSuspendPolicy policy = SP_NONE;
563
Elliott Hughes2aa2e392012-02-17 17:15:43 -0800564 while (match_count--) {
Elliott Hughesf8349362012-06-18 15:00:06 -0700565 if ((*match_list)->suspend_policy > policy) {
566 policy = (*match_list)->suspend_policy;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700567 }
Elliott Hughesf8349362012-06-18 15:00:06 -0700568 match_list++;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700569 }
570
571 return policy;
572}
573
574/*
575 * Three possibilities:
576 * SP_NONE - do nothing
577 * SP_EVENT_THREAD - suspend ourselves
578 * SP_ALL - suspend everybody except JDWP support thread
579 */
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700580void JdwpState::SuspendByPolicy(JdwpSuspendPolicy suspend_policy, JDWP::ObjectId thread_self_id) {
Elliott Hughesf8349362012-06-18 15:00:06 -0700581 VLOG(jdwp) << "SuspendByPolicy(" << suspend_policy << ")";
582 if (suspend_policy == SP_NONE) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700583 return;
584 }
585
Elliott Hughesf8349362012-06-18 15:00:06 -0700586 if (suspend_policy == SP_ALL) {
Elliott Hughes475fc232011-10-25 15:00:35 -0700587 Dbg::SuspendVM();
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700588 } else {
Elliott Hughesf8349362012-06-18 15:00:06 -0700589 CHECK_EQ(suspend_policy, SP_EVENT_THREAD);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700590 }
591
592 /* this is rare but possible -- see CLASS_PREPARE handling */
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700593 if (thread_self_id == debug_thread_id_) {
Elliott Hughes761928d2011-11-16 18:33:03 -0800594 LOG(INFO) << "NOTE: SuspendByPolicy not suspending JDWP thread";
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700595 return;
596 }
597
598 DebugInvokeReq* pReq = Dbg::GetInvokeReq();
599 while (true) {
600 pReq->ready = true;
601 Dbg::SuspendSelf();
602 pReq->ready = false;
603
604 /*
605 * The JDWP thread has told us (and possibly all other threads) to
606 * resume. See if it has left anything in our DebugInvokeReq mailbox.
607 */
Sebastien Hertzd38667a2013-11-25 15:43:54 +0100608 if (!pReq->invoke_needed) {
Elliott Hughes761928d2011-11-16 18:33:03 -0800609 /*LOGD("SuspendByPolicy: no invoke needed");*/
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700610 break;
611 }
612
613 /* grab this before posting/suspending again */
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700614 SetWaitForEventThread(thread_self_id);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700615
Elliott Hughesd07986f2011-12-06 18:27:45 -0800616 /* leave pReq->invoke_needed_ raised so we can check reentrancy */
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700617 Dbg::ExecuteMethod(pReq);
618
Elliott Hughes475fc232011-10-25 15:00:35 -0700619 pReq->error = ERR_NONE;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700620 }
621}
622
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700623void JdwpState::SendRequestAndPossiblySuspend(ExpandBuf* pReq, JdwpSuspendPolicy suspend_policy,
624 ObjectId threadId) {
625 Thread* self = Thread::Current();
626 self->AssertThreadSuspensionIsAllowable();
627 /* send request and possibly suspend ourselves */
628 if (pReq != NULL) {
629 JDWP::ObjectId thread_self_id = Dbg::GetThreadSelfId();
630 self->TransitionFromRunnableToSuspended(kWaitingForDebuggerSend);
631 if (suspend_policy != SP_NONE) {
632 SetWaitForEventThread(threadId);
633 }
634 EventFinish(pReq);
635 SuspendByPolicy(suspend_policy, thread_self_id);
636 self->TransitionFromSuspendedToRunnable();
637 }
638}
639
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700640/*
641 * Determine if there is a method invocation in progress in the current
642 * thread.
643 *
Elliott Hughes475fc232011-10-25 15:00:35 -0700644 * We look at the "invoke_needed" flag in the per-thread DebugInvokeReq
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700645 * state. If set, we're in the process of invoking a method.
646 */
Elliott Hughes761928d2011-11-16 18:33:03 -0800647bool JdwpState::InvokeInProgress() {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700648 DebugInvokeReq* pReq = Dbg::GetInvokeReq();
Sebastien Hertzd38667a2013-11-25 15:43:54 +0100649 return pReq->invoke_needed;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700650}
651
652/*
653 * We need the JDWP thread to hold off on doing stuff while we post an
654 * event and then suspend ourselves.
655 *
656 * Call this with a threadId of zero if you just want to wait for the
657 * current thread operation to complete.
658 *
659 * This could go to sleep waiting for another thread, so it's important
660 * that the thread be marked as VMWAIT before calling here.
661 */
Elliott Hughes376a7a02011-10-24 18:35:55 -0700662void JdwpState::SetWaitForEventThread(ObjectId threadId) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700663 bool waited = false;
664
665 /* this is held for very brief periods; contention is unlikely */
Ian Rogers81d425b2012-09-27 16:03:43 -0700666 Thread* self = Thread::Current();
667 MutexLock mu(self, event_thread_lock_);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700668
669 /*
670 * If another thread is already doing stuff, wait for it. This can
671 * go to sleep indefinitely.
672 */
Elliott Hughesa21039c2012-06-21 12:09:25 -0700673 while (event_thread_id_ != 0) {
Ian Rogersd9e4e0c2014-01-23 20:11:40 -0800674 VLOG(jdwp) << StringPrintf("event in progress (%#" PRIx64 "), %#" PRIx64 " sleeping",
675 event_thread_id_, threadId);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700676 waited = true;
Ian Rogersc604d732012-10-14 16:09:54 -0700677 event_thread_cond_.Wait(self);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700678 }
679
680 if (waited || threadId != 0) {
Ian Rogersd9e4e0c2014-01-23 20:11:40 -0800681 VLOG(jdwp) << StringPrintf("event token grabbed (%#" PRIx64 ")", threadId);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700682 }
683 if (threadId != 0) {
Elliott Hughesa21039c2012-06-21 12:09:25 -0700684 event_thread_id_ = threadId;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700685 }
686}
687
688/*
689 * Clear the threadId and signal anybody waiting.
690 */
Elliott Hughes376a7a02011-10-24 18:35:55 -0700691void JdwpState::ClearWaitForEventThread() {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700692 /*
693 * Grab the mutex. Don't try to go in/out of VMWAIT mode, as this
694 * function is called by dvmSuspendSelf(), and the transition back
695 * to RUNNING would confuse it.
696 */
Ian Rogersc604d732012-10-14 16:09:54 -0700697 Thread* self = Thread::Current();
698 MutexLock mu(self, event_thread_lock_);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700699
Elliott Hughesa21039c2012-06-21 12:09:25 -0700700 CHECK_NE(event_thread_id_, 0U);
Ian Rogersd9e4e0c2014-01-23 20:11:40 -0800701 VLOG(jdwp) << StringPrintf("cleared event token (%#" PRIx64 ")", event_thread_id_);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700702
Elliott Hughesa21039c2012-06-21 12:09:25 -0700703 event_thread_id_ = 0;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700704
Ian Rogersc604d732012-10-14 16:09:54 -0700705 event_thread_cond_.Signal(self);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700706}
707
708
709/*
710 * Prep an event. Allocates storage for the message and leaves space for
711 * the header.
712 */
713static ExpandBuf* eventPrep() {
714 ExpandBuf* pReq = expandBufAlloc();
715 expandBufAddSpace(pReq, kJDWPHeaderLen);
716 return pReq;
717}
718
719/*
720 * Write the header into the buffer and send the packet off to the debugger.
721 *
722 * Takes ownership of "pReq" (currently discards it).
723 */
Elliott Hughes761928d2011-11-16 18:33:03 -0800724void JdwpState::EventFinish(ExpandBuf* pReq) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700725 uint8_t* buf = expandBufGetBuffer(pReq);
726
Elliott Hughesf7c3b662011-10-27 12:04:56 -0700727 Set4BE(buf, expandBufGetLength(pReq));
Elliott Hughes761928d2011-11-16 18:33:03 -0800728 Set4BE(buf+4, NextRequestSerial());
Elliott Hughesf7c3b662011-10-27 12:04:56 -0700729 Set1(buf+8, 0); /* flags */
730 Set1(buf+9, kJdwpEventCommandSet);
731 Set1(buf+10, kJdwpCompositeCommand);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700732
Sebastien Hertz99660e12014-02-19 15:04:42 +0100733 // Prevents from interleaving commands and events. Otherwise we could end up in sending an event
734 // before sending the reply of the command being processed and would lead to bad synchronization
735 // between the debugger and the debuggee.
736 WaitForProcessingRequest();
737
Elliott Hughes761928d2011-11-16 18:33:03 -0800738 SendRequest(pReq);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700739
740 expandBufFree(pReq);
741}
742
743
744/*
745 * Tell the debugger that we have finished initializing. This is always
746 * sent, even if the debugger hasn't requested it.
747 *
748 * This should be sent "before the main thread is started and before
749 * any application code has been executed". The thread ID in the message
750 * must be for the main thread.
751 */
Elliott Hughes376a7a02011-10-24 18:35:55 -0700752bool JdwpState::PostVMStart() {
Elliott Hughesf8349362012-06-18 15:00:06 -0700753 JdwpSuspendPolicy suspend_policy;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700754 ObjectId threadId = Dbg::GetThreadSelfId();
755
Elliott Hughes376a7a02011-10-24 18:35:55 -0700756 if (options_->suspend) {
Elliott Hughesf8349362012-06-18 15:00:06 -0700757 suspend_policy = SP_ALL;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700758 } else {
Elliott Hughesf8349362012-06-18 15:00:06 -0700759 suspend_policy = SP_NONE;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700760 }
761
Elliott Hughes761928d2011-11-16 18:33:03 -0800762 ExpandBuf* pReq = eventPrep();
763 {
Brian Carlstrom7934ac22013-07-26 10:54:15 -0700764 MutexLock mu(Thread::Current(), event_list_lock_); // probably don't need this here
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700765
Elliott Hughes4dd9b4d2011-12-12 18:29:24 -0800766 VLOG(jdwp) << "EVENT: " << EK_VM_START;
Elliott Hughesf8349362012-06-18 15:00:06 -0700767 VLOG(jdwp) << " suspend_policy=" << suspend_policy;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700768
Elliott Hughesf8349362012-06-18 15:00:06 -0700769 expandBufAdd1(pReq, suspend_policy);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700770 expandBufAdd4BE(pReq, 1);
771
772 expandBufAdd1(pReq, EK_VM_START);
773 expandBufAdd4BE(pReq, 0); /* requestId */
774 expandBufAdd8BE(pReq, threadId);
775 }
776
Sebastien Hertz138dbfc2013-12-04 18:15:25 +0100777 Dbg::ManageDeoptimization();
778
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700779 /* send request and possibly suspend ourselves */
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700780 SendRequestAndPossiblySuspend(pReq, suspend_policy, threadId);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700781
782 return true;
783}
784
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200785static void LogMatchingEventsAndThread(JdwpEvent** match_list, size_t match_count,
Sebastien Hertz6995c602014-09-09 12:10:13 +0200786 ObjectId thread_id)
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200787 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
788 for (size_t i = 0; i < match_count; ++i) {
789 JdwpEvent* pEvent = match_list[i];
790 VLOG(jdwp) << "EVENT #" << i << ": " << pEvent->eventKind
791 << StringPrintf(" (requestId=%#" PRIx32 ")", pEvent->requestId);
792 }
793 std::string thread_name;
Sebastien Hertz6995c602014-09-09 12:10:13 +0200794 JdwpError error = Dbg::GetThreadName(thread_id, &thread_name);
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200795 if (error != JDWP::ERR_NONE) {
796 thread_name = "<unknown>";
797 }
Sebastien Hertz6995c602014-09-09 12:10:13 +0200798 VLOG(jdwp) << StringPrintf(" thread=%#" PRIx64, thread_id) << " " << thread_name;
799}
800
801static void SetJdwpLocationFromEventLocation(const JDWP::EventLocation* event_location,
802 JDWP::JdwpLocation* jdwp_location)
803 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
804 DCHECK(event_location != nullptr);
805 DCHECK(jdwp_location != nullptr);
806 Dbg::SetJdwpLocation(jdwp_location, event_location->method, event_location->dex_pc);
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200807}
808
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700809/*
810 * A location of interest has been reached. This handles:
811 * Breakpoint
812 * SingleStep
813 * MethodEntry
814 * MethodExit
815 * These four types must be grouped together in a single response. The
816 * "eventFlags" indicates the type of event(s) that have happened.
817 *
818 * Valid mods:
819 * Count, ThreadOnly, ClassOnly, ClassMatch, ClassExclude, InstanceOnly
820 * LocationOnly (for breakpoint/step only)
821 * Step (for step only)
822 *
823 * Interesting test cases:
824 * - Put a breakpoint on a native method. Eclipse creates METHOD_ENTRY
825 * and METHOD_EXIT events with a ClassOnly mod on the method's class.
826 * - Use "run to line". Eclipse creates a BREAKPOINT with Count=1.
827 * - Single-step to a line with a breakpoint. Should get a single
828 * event message with both events in it.
829 */
Sebastien Hertz6995c602014-09-09 12:10:13 +0200830bool JdwpState::PostLocationEvent(const EventLocation* pLoc, mirror::Object* thisPtr,
831 int eventFlags, const JValue* returnValue) {
832 DCHECK(pLoc != nullptr);
833 DCHECK(pLoc->method != nullptr);
834 DCHECK_EQ(pLoc->method->IsStatic(), thisPtr == nullptr);
835
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700836 ModBasket basket;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700837 basket.pLoc = pLoc;
Sebastien Hertz6995c602014-09-09 12:10:13 +0200838 basket.locationClass = pLoc->method->GetDeclaringClass();
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700839 basket.thisPtr = thisPtr;
Sebastien Hertz6995c602014-09-09 12:10:13 +0200840 basket.thread = Thread::Current();
841 basket.className = Dbg::GetClassName(basket.locationClass);
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700842
843 /*
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.)
848 */
Sebastien Hertz6995c602014-09-09 12:10:13 +0200849 if (basket.thread == GetDebugThread()) {
Elliott Hughes4dd9b4d2011-12-12 18:29:24 -0800850 VLOG(jdwp) << "Ignoring location event in JDWP thread";
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700851 return false;
852 }
853
854 /*
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.
858 *
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.
862 */
Elliott Hughes761928d2011-11-16 18:33:03 -0800863 if (InvokeInProgress()) {
Elliott Hughes4dd9b4d2011-12-12 18:29:24 -0800864 VLOG(jdwp) << "Not checking breakpoints during invoke (" << basket.className << ")";
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700865 return false;
866 }
867
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200868 size_t match_count = 0;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700869 ExpandBuf* pReq = NULL;
Elliott Hughesf8349362012-06-18 15:00:06 -0700870 JdwpSuspendPolicy suspend_policy = SP_NONE;
Sebastien Hertz6995c602014-09-09 12:10:13 +0200871 JdwpEvent** match_list = nullptr;
872 ObjectId thread_id = 0;
Elliott Hughes761928d2011-11-16 18:33:03 -0800873 {
Sebastien Hertz6995c602014-09-09 12:10:13 +0200874 {
875 MutexLock mu(Thread::Current(), event_list_lock_);
876 match_list = AllocMatchList(event_list_size_);
877 if ((eventFlags & Dbg::kBreakpoint) != 0) {
878 FindMatchingEvents(EK_BREAKPOINT, basket, match_list, &match_count);
879 }
880 if ((eventFlags & Dbg::kSingleStep) != 0) {
881 FindMatchingEvents(EK_SINGLE_STEP, basket, match_list, &match_count);
882 }
883 if ((eventFlags & Dbg::kMethodEntry) != 0) {
884 FindMatchingEvents(EK_METHOD_ENTRY, basket, match_list, &match_count);
885 }
886 if ((eventFlags & Dbg::kMethodExit) != 0) {
887 FindMatchingEvents(EK_METHOD_EXIT, basket, match_list, &match_count);
888 FindMatchingEvents(EK_METHOD_EXIT_WITH_RETURN_VALUE, basket, match_list, &match_count);
889 }
Elliott Hughes761928d2011-11-16 18:33:03 -0800890 }
Elliott Hughes2aa2e392012-02-17 17:15:43 -0800891 if (match_count != 0) {
Elliott Hughesf8349362012-06-18 15:00:06 -0700892 suspend_policy = scanSuspendPolicy(match_list, match_count);
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200893
Sebastien Hertz6995c602014-09-09 12:10:13 +0200894 thread_id = Dbg::GetThreadId(basket.thread);
895 JDWP::JdwpLocation jdwp_location;
896 SetJdwpLocationFromEventLocation(pLoc, &jdwp_location);
897
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200898 if (VLOG_IS_ON(jdwp)) {
Sebastien Hertz6995c602014-09-09 12:10:13 +0200899 LogMatchingEventsAndThread(match_list, match_count, thread_id);
900 VLOG(jdwp) << " location=" << jdwp_location;
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200901 VLOG(jdwp) << " suspend_policy=" << suspend_policy;
902 }
Elliott Hughes761928d2011-11-16 18:33:03 -0800903
904 pReq = eventPrep();
Elliott Hughesf8349362012-06-18 15:00:06 -0700905 expandBufAdd1(pReq, suspend_policy);
Elliott Hughes2aa2e392012-02-17 17:15:43 -0800906 expandBufAdd4BE(pReq, match_count);
Elliott Hughes761928d2011-11-16 18:33:03 -0800907
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200908 for (size_t i = 0; i < match_count; i++) {
Elliott Hughesf8349362012-06-18 15:00:06 -0700909 expandBufAdd1(pReq, match_list[i]->eventKind);
910 expandBufAdd4BE(pReq, match_list[i]->requestId);
Sebastien Hertz6995c602014-09-09 12:10:13 +0200911 expandBufAdd8BE(pReq, thread_id);
912 expandBufAddLocation(pReq, jdwp_location);
Jeff Hao579b0242013-11-18 13:16:49 -0800913 if (match_list[i]->eventKind == EK_METHOD_EXIT_WITH_RETURN_VALUE) {
Sebastien Hertz6995c602014-09-09 12:10:13 +0200914 Dbg::OutputMethodReturnValue(jdwp_location.method_id, returnValue, pReq);
Jeff Hao579b0242013-11-18 13:16:49 -0800915 }
Elliott Hughes761928d2011-11-16 18:33:03 -0800916 }
917 }
918
Sebastien Hertz6995c602014-09-09 12:10:13 +0200919 {
920 MutexLock mu(Thread::Current(), event_list_lock_);
921 CleanupMatchList(match_list, match_count);
922 }
Elliott Hughes761928d2011-11-16 18:33:03 -0800923 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700924
Sebastien Hertz138dbfc2013-12-04 18:15:25 +0100925 Dbg::ManageDeoptimization();
926
Sebastien Hertz6995c602014-09-09 12:10:13 +0200927 SendRequestAndPossiblySuspend(pReq, suspend_policy, thread_id);
Elliott Hughes2aa2e392012-02-17 17:15:43 -0800928 return match_count != 0;
Elliott Hughes872d4ec2011-10-21 17:07:15 -0700929}
930
Sebastien Hertz6995c602014-09-09 12:10:13 +0200931bool JdwpState::PostFieldEvent(const EventLocation* pLoc, mirror::ArtField* field,
932 mirror::Object* this_object, const JValue* fieldValue,
933 bool is_modification) {
934 DCHECK(pLoc != nullptr);
935 DCHECK(field != nullptr);
936 DCHECK_EQ(fieldValue != nullptr, is_modification);
937 DCHECK_EQ(field->IsStatic(), this_object == nullptr);
938
Sebastien Hertz3f52eaf2014-04-04 17:50:18 +0200939 ModBasket basket;
940 basket.pLoc = pLoc;
Sebastien Hertz6995c602014-09-09 12:10:13 +0200941 basket.locationClass = pLoc->method->GetDeclaringClass();
942 basket.thisPtr = this_object;
943 basket.thread = Thread::Current();
944 basket.className = Dbg::GetClassName(basket.locationClass);
945 basket.field = field;
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200946
Sebastien Hertz3f52eaf2014-04-04 17:50:18 +0200947 if (InvokeInProgress()) {
948 VLOG(jdwp) << "Not posting field event during invoke";
949 return false;
950 }
951
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200952 size_t match_count = 0;
Sebastien Hertz3f52eaf2014-04-04 17:50:18 +0200953 ExpandBuf* pReq = NULL;
954 JdwpSuspendPolicy suspend_policy = SP_NONE;
Sebastien Hertz6995c602014-09-09 12:10:13 +0200955 JdwpEvent** match_list = nullptr;
956 ObjectId thread_id = 0;
Sebastien Hertz3f52eaf2014-04-04 17:50:18 +0200957 {
Sebastien Hertz6995c602014-09-09 12:10:13 +0200958 {
959 MutexLock mu(Thread::Current(), event_list_lock_);
960 match_list = AllocMatchList(event_list_size_);
961 if (is_modification) {
962 FindMatchingEvents(EK_FIELD_MODIFICATION, basket, match_list, &match_count);
963 } else {
964 FindMatchingEvents(EK_FIELD_ACCESS, basket, match_list, &match_count);
965 }
Sebastien Hertz3f52eaf2014-04-04 17:50:18 +0200966 }
967 if (match_count != 0) {
Sebastien Hertz3f52eaf2014-04-04 17:50:18 +0200968 suspend_policy = scanSuspendPolicy(match_list, match_count);
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200969
Sebastien Hertz6995c602014-09-09 12:10:13 +0200970 thread_id = Dbg::GetThreadId(basket.thread);
971 ObjectRegistry* registry = Dbg::GetObjectRegistry();
972 ObjectId instance_id = registry->Add(basket.thisPtr);
973 RefTypeId field_type_id = registry->AddRefType(field->GetDeclaringClass());
974 FieldId field_id = Dbg::ToFieldId(field);
975 JDWP::JdwpLocation jdwp_location;
976 SetJdwpLocationFromEventLocation(pLoc, &jdwp_location);
977
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200978 if (VLOG_IS_ON(jdwp)) {
Sebastien Hertz6995c602014-09-09 12:10:13 +0200979 LogMatchingEventsAndThread(match_list, match_count, thread_id);
980 VLOG(jdwp) << " location=" << jdwp_location;
981 VLOG(jdwp) << StringPrintf(" this=%#" PRIx64, instance_id);
982 VLOG(jdwp) << StringPrintf(" type=%#" PRIx64, field_type_id) << " "
983 << Dbg::GetClassName(field_id);
984 VLOG(jdwp) << StringPrintf(" field=%#" PRIx32, field_id) << " "
985 << Dbg::GetFieldName(field_id);
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +0200986 VLOG(jdwp) << " suspend_policy=" << suspend_policy;
987 }
Sebastien Hertz3f52eaf2014-04-04 17:50:18 +0200988
989 pReq = eventPrep();
990 expandBufAdd1(pReq, suspend_policy);
991 expandBufAdd4BE(pReq, match_count);
992
Sebastien Hertz6995c602014-09-09 12:10:13 +0200993 // Get field's reference type tag.
994 JDWP::JdwpTypeTag type_tag = Dbg::GetTypeTag(field->GetDeclaringClass());
995
996 // Get instance type tag.
997 uint8_t tag;
998 {
999 ScopedObjectAccessUnchecked soa(Thread::Current());
1000 tag = Dbg::TagFromObject(soa, basket.thisPtr);
1001 }
1002
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +02001003 for (size_t i = 0; i < match_count; i++) {
Sebastien Hertz3f52eaf2014-04-04 17:50:18 +02001004 expandBufAdd1(pReq, match_list[i]->eventKind);
1005 expandBufAdd4BE(pReq, match_list[i]->requestId);
Sebastien Hertz6995c602014-09-09 12:10:13 +02001006 expandBufAdd8BE(pReq, thread_id);
1007 expandBufAddLocation(pReq, jdwp_location);
Sebastien Hertz3f52eaf2014-04-04 17:50:18 +02001008 expandBufAdd1(pReq, type_tag);
Sebastien Hertz6995c602014-09-09 12:10:13 +02001009 expandBufAddRefTypeId(pReq, field_type_id);
1010 expandBufAddFieldId(pReq, field_id);
Sebastien Hertz3f52eaf2014-04-04 17:50:18 +02001011 expandBufAdd1(pReq, tag);
Sebastien Hertz6995c602014-09-09 12:10:13 +02001012 expandBufAddObjectId(pReq, instance_id);
Sebastien Hertz3f52eaf2014-04-04 17:50:18 +02001013 if (is_modification) {
Sebastien Hertz6995c602014-09-09 12:10:13 +02001014 Dbg::OutputFieldValue(field_id, fieldValue, pReq);
Sebastien Hertz3f52eaf2014-04-04 17:50:18 +02001015 }
1016 }
1017 }
1018
Sebastien Hertz6995c602014-09-09 12:10:13 +02001019 {
1020 MutexLock mu(Thread::Current(), event_list_lock_);
1021 CleanupMatchList(match_list, match_count);
1022 }
Sebastien Hertz3f52eaf2014-04-04 17:50:18 +02001023 }
1024
1025 Dbg::ManageDeoptimization();
1026
Sebastien Hertz6995c602014-09-09 12:10:13 +02001027 SendRequestAndPossiblySuspend(pReq, suspend_policy, thread_id);
Sebastien Hertz3f52eaf2014-04-04 17:50:18 +02001028 return match_count != 0;
1029}
1030
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001031/*
1032 * A thread is starting or stopping.
1033 *
1034 * Valid mods:
1035 * Count, ThreadOnly
1036 */
Sebastien Hertz6995c602014-09-09 12:10:13 +02001037bool JdwpState::PostThreadChange(Thread* thread, bool start) {
1038 CHECK_EQ(thread, Thread::Current());
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001039
1040 /*
1041 * I don't think this can happen.
1042 */
Elliott Hughes761928d2011-11-16 18:33:03 -08001043 if (InvokeInProgress()) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001044 LOG(WARNING) << "Not posting thread change during invoke";
1045 return false;
1046 }
1047
1048 ModBasket basket;
Sebastien Hertz6995c602014-09-09 12:10:13 +02001049 basket.thread = thread;
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001050
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001051 ExpandBuf* pReq = NULL;
Elliott Hughesf8349362012-06-18 15:00:06 -07001052 JdwpSuspendPolicy suspend_policy = SP_NONE;
Sebastien Hertz6995c602014-09-09 12:10:13 +02001053 JdwpEvent** match_list = nullptr;
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +02001054 size_t match_count = 0;
Sebastien Hertz6995c602014-09-09 12:10:13 +02001055 ObjectId thread_id = 0;
Elliott Hughes234ab152011-10-26 14:02:26 -07001056 {
Sebastien Hertz6995c602014-09-09 12:10:13 +02001057 {
1058 // Don't allow the list to be updated while we scan it.
1059 MutexLock mu(Thread::Current(), event_list_lock_);
1060 match_list = AllocMatchList(event_list_size_);
1061 if (start) {
1062 FindMatchingEvents(EK_THREAD_START, basket, match_list, &match_count);
1063 } else {
1064 FindMatchingEvents(EK_THREAD_DEATH, basket, match_list, &match_count);
1065 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001066 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001067
Elliott Hughes2aa2e392012-02-17 17:15:43 -08001068 if (match_count != 0) {
Elliott Hughesf8349362012-06-18 15:00:06 -07001069 suspend_policy = scanSuspendPolicy(match_list, match_count);
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +02001070
Sebastien Hertz6995c602014-09-09 12:10:13 +02001071 thread_id = Dbg::GetThreadId(basket.thread);
1072
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +02001073 if (VLOG_IS_ON(jdwp)) {
Sebastien Hertz6995c602014-09-09 12:10:13 +02001074 LogMatchingEventsAndThread(match_list, match_count, thread_id);
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +02001075 VLOG(jdwp) << " suspend_policy=" << suspend_policy;
1076 }
Elliott Hughes234ab152011-10-26 14:02:26 -07001077
1078 pReq = eventPrep();
Elliott Hughesf8349362012-06-18 15:00:06 -07001079 expandBufAdd1(pReq, suspend_policy);
Elliott Hughes2aa2e392012-02-17 17:15:43 -08001080 expandBufAdd4BE(pReq, match_count);
Elliott Hughes234ab152011-10-26 14:02:26 -07001081
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +02001082 for (size_t i = 0; i < match_count; i++) {
Elliott Hughesf8349362012-06-18 15:00:06 -07001083 expandBufAdd1(pReq, match_list[i]->eventKind);
1084 expandBufAdd4BE(pReq, match_list[i]->requestId);
Sebastien Hertz6995c602014-09-09 12:10:13 +02001085 expandBufAdd8BE(pReq, thread_id);
Elliott Hughes234ab152011-10-26 14:02:26 -07001086 }
1087 }
1088
Sebastien Hertz6995c602014-09-09 12:10:13 +02001089 {
1090 MutexLock mu(Thread::Current(), event_list_lock_);
1091 CleanupMatchList(match_list, match_count);
1092 }
Elliott Hughes234ab152011-10-26 14:02:26 -07001093 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001094
Sebastien Hertz138dbfc2013-12-04 18:15:25 +01001095 Dbg::ManageDeoptimization();
1096
Sebastien Hertz6995c602014-09-09 12:10:13 +02001097 SendRequestAndPossiblySuspend(pReq, suspend_policy, thread_id);
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001098
Elliott Hughes2aa2e392012-02-17 17:15:43 -08001099 return match_count != 0;
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001100}
1101
1102/*
1103 * Send a polite "VM is dying" message to the debugger.
1104 *
1105 * Skips the usual "event token" stuff.
1106 */
Elliott Hughes376a7a02011-10-24 18:35:55 -07001107bool JdwpState::PostVMDeath() {
Elliott Hughes4dd9b4d2011-12-12 18:29:24 -08001108 VLOG(jdwp) << "EVENT: " << EK_VM_DEATH;
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001109
1110 ExpandBuf* pReq = eventPrep();
1111 expandBufAdd1(pReq, SP_NONE);
1112 expandBufAdd4BE(pReq, 1);
1113
1114 expandBufAdd1(pReq, EK_VM_DEATH);
1115 expandBufAdd4BE(pReq, 0);
Elliott Hughes761928d2011-11-16 18:33:03 -08001116 EventFinish(pReq);
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001117 return true;
1118}
1119
1120/*
1121 * An exception has been thrown. It may or may not have been caught.
1122 *
1123 * Valid mods:
1124 * Count, ThreadOnly, ClassOnly, ClassMatch, ClassExclude, LocationOnly,
1125 * ExceptionOnly, InstanceOnly
1126 *
1127 * The "exceptionId" has not been added to the GC-visible object registry,
1128 * because there's a pretty good chance that we're not going to send it
1129 * up the debugger.
1130 */
Sebastien Hertz6995c602014-09-09 12:10:13 +02001131bool JdwpState::PostException(const EventLocation* pThrowLoc, mirror::Throwable* exception_object,
1132 const EventLocation* pCatchLoc, mirror::Object* thisPtr) {
1133 DCHECK(exception_object != nullptr);
1134 DCHECK(pThrowLoc != nullptr);
1135 DCHECK(pCatchLoc != nullptr);
Sebastien Hertza9aa0ff2014-09-19 12:07:51 +02001136 if (pThrowLoc->method != nullptr) {
1137 DCHECK_EQ(pThrowLoc->method->IsStatic(), thisPtr == nullptr);
1138 } else {
1139 VLOG(jdwp) << "Unexpected: exception event with empty throw location";
1140 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001141
Sebastien Hertz6995c602014-09-09 12:10:13 +02001142 ModBasket basket;
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001143 basket.pLoc = pThrowLoc;
Sebastien Hertza9aa0ff2014-09-19 12:07:51 +02001144 if (pThrowLoc->method != nullptr) {
1145 basket.locationClass = pThrowLoc->method->GetDeclaringClass();
1146 } else {
1147 basket.locationClass = nullptr;
1148 }
Sebastien Hertz6995c602014-09-09 12:10:13 +02001149 basket.thread = Thread::Current();
1150 basket.className = Dbg::GetClassName(basket.locationClass);
1151 basket.exceptionClass = exception_object->GetClass();
1152 basket.caught = (pCatchLoc->method != 0);
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001153 basket.thisPtr = thisPtr;
1154
1155 /* don't try to post an exception caused by the debugger */
Elliott Hughes761928d2011-11-16 18:33:03 -08001156 if (InvokeInProgress()) {
Elliott Hughes4dd9b4d2011-12-12 18:29:24 -08001157 VLOG(jdwp) << "Not posting exception hit during invoke (" << basket.className << ")";
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001158 return false;
1159 }
1160
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +02001161 size_t match_count = 0;
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001162 ExpandBuf* pReq = NULL;
Elliott Hughesf8349362012-06-18 15:00:06 -07001163 JdwpSuspendPolicy suspend_policy = SP_NONE;
Sebastien Hertz6995c602014-09-09 12:10:13 +02001164 JdwpEvent** match_list = nullptr;
1165 ObjectId thread_id = 0;
Elliott Hughes761928d2011-11-16 18:33:03 -08001166 {
Sebastien Hertz6995c602014-09-09 12:10:13 +02001167 {
1168 MutexLock mu(Thread::Current(), event_list_lock_);
1169 match_list = AllocMatchList(event_list_size_);
1170 FindMatchingEvents(EK_EXCEPTION, basket, match_list, &match_count);
1171 }
Elliott Hughes2aa2e392012-02-17 17:15:43 -08001172 if (match_count != 0) {
Elliott Hughesf8349362012-06-18 15:00:06 -07001173 suspend_policy = scanSuspendPolicy(match_list, match_count);
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +02001174
Sebastien Hertz6995c602014-09-09 12:10:13 +02001175 thread_id = Dbg::GetThreadId(basket.thread);
1176 ObjectRegistry* registry = Dbg::GetObjectRegistry();
1177 ObjectId exceptionId = registry->Add(exception_object);
1178 JDWP::JdwpLocation jdwp_throw_location;
1179 JDWP::JdwpLocation jdwp_catch_location;
1180 SetJdwpLocationFromEventLocation(pThrowLoc, &jdwp_throw_location);
1181 SetJdwpLocationFromEventLocation(pCatchLoc, &jdwp_catch_location);
1182
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +02001183 if (VLOG_IS_ON(jdwp)) {
Sebastien Hertz6995c602014-09-09 12:10:13 +02001184 std::string exceptionClassName(PrettyDescriptor(exception_object->GetClass()));
1185
1186 LogMatchingEventsAndThread(match_list, match_count, thread_id);
1187 VLOG(jdwp) << " throwLocation=" << jdwp_throw_location;
1188 if (jdwp_catch_location.class_id == 0) {
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +02001189 VLOG(jdwp) << " catchLocation=uncaught";
1190 } else {
Sebastien Hertz6995c602014-09-09 12:10:13 +02001191 VLOG(jdwp) << " catchLocation=" << jdwp_catch_location;
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +02001192 }
Sebastien Hertz6995c602014-09-09 12:10:13 +02001193 VLOG(jdwp) << StringPrintf(" exception=%#" PRIx64, exceptionId) << " "
1194 << exceptionClassName;
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +02001195 VLOG(jdwp) << " suspend_policy=" << suspend_policy;
1196 }
Elliott Hughes761928d2011-11-16 18:33:03 -08001197
1198 pReq = eventPrep();
Elliott Hughesf8349362012-06-18 15:00:06 -07001199 expandBufAdd1(pReq, suspend_policy);
Elliott Hughes2aa2e392012-02-17 17:15:43 -08001200 expandBufAdd4BE(pReq, match_count);
Elliott Hughes761928d2011-11-16 18:33:03 -08001201
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +02001202 for (size_t i = 0; i < match_count; i++) {
Elliott Hughesf8349362012-06-18 15:00:06 -07001203 expandBufAdd1(pReq, match_list[i]->eventKind);
1204 expandBufAdd4BE(pReq, match_list[i]->requestId);
Sebastien Hertz6995c602014-09-09 12:10:13 +02001205 expandBufAdd8BE(pReq, thread_id);
1206 expandBufAddLocation(pReq, jdwp_throw_location);
Elliott Hughes761928d2011-11-16 18:33:03 -08001207 expandBufAdd1(pReq, JT_OBJECT);
1208 expandBufAdd8BE(pReq, exceptionId);
Sebastien Hertz6995c602014-09-09 12:10:13 +02001209 expandBufAddLocation(pReq, jdwp_catch_location);
Elliott Hughes761928d2011-11-16 18:33:03 -08001210 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001211 }
1212
Sebastien Hertz6995c602014-09-09 12:10:13 +02001213 {
1214 MutexLock mu(Thread::Current(), event_list_lock_);
1215 CleanupMatchList(match_list, match_count);
1216 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001217 }
1218
Sebastien Hertz138dbfc2013-12-04 18:15:25 +01001219 Dbg::ManageDeoptimization();
1220
Sebastien Hertz6995c602014-09-09 12:10:13 +02001221 SendRequestAndPossiblySuspend(pReq, suspend_policy, thread_id);
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001222
Elliott Hughes2aa2e392012-02-17 17:15:43 -08001223 return match_count != 0;
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001224}
1225
1226/*
1227 * Announce that a class has been loaded.
1228 *
1229 * Valid mods:
1230 * Count, ThreadOnly, ClassOnly, ClassMatch, ClassExclude
1231 */
Sebastien Hertz6995c602014-09-09 12:10:13 +02001232bool JdwpState::PostClassPrepare(mirror::Class* klass) {
1233 DCHECK(klass != nullptr);
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001234
Sebastien Hertz6995c602014-09-09 12:10:13 +02001235 ModBasket basket;
1236 basket.locationClass = klass;
1237 basket.thread = Thread::Current();
1238 basket.className = Dbg::GetClassName(basket.locationClass);
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001239
1240 /* suppress class prep caused by debugger */
Elliott Hughes761928d2011-11-16 18:33:03 -08001241 if (InvokeInProgress()) {
Elliott Hughes4dd9b4d2011-12-12 18:29:24 -08001242 VLOG(jdwp) << "Not posting class prep caused by invoke (" << basket.className << ")";
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001243 return false;
1244 }
1245
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001246 ExpandBuf* pReq = NULL;
Elliott Hughesf8349362012-06-18 15:00:06 -07001247 JdwpSuspendPolicy suspend_policy = SP_NONE;
Sebastien Hertz6995c602014-09-09 12:10:13 +02001248 JdwpEvent** match_list = nullptr;
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +02001249 size_t match_count = 0;
Sebastien Hertz6995c602014-09-09 12:10:13 +02001250 ObjectId thread_id = 0;
Elliott Hughes761928d2011-11-16 18:33:03 -08001251 {
Sebastien Hertz6995c602014-09-09 12:10:13 +02001252 {
1253 MutexLock mu(Thread::Current(), event_list_lock_);
1254 match_list = AllocMatchList(event_list_size_);
1255 FindMatchingEvents(EK_CLASS_PREPARE, basket, match_list, &match_count);
1256 }
Elliott Hughes2aa2e392012-02-17 17:15:43 -08001257 if (match_count != 0) {
Elliott Hughesf8349362012-06-18 15:00:06 -07001258 suspend_policy = scanSuspendPolicy(match_list, match_count);
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +02001259
Sebastien Hertz6995c602014-09-09 12:10:13 +02001260 thread_id = Dbg::GetThreadId(basket.thread);
1261 ObjectRegistry* registry = Dbg::GetObjectRegistry();
1262 RefTypeId class_id = registry->AddRefType(basket.locationClass);
1263
1264 // OLD-TODO - we currently always send both "verified" and "prepared" since
1265 // debuggers seem to like that. There might be some advantage to honesty,
1266 // since the class may not yet be verified.
1267 int status = JDWP::CS_VERIFIED | JDWP::CS_PREPARED;
1268 JDWP::JdwpTypeTag tag = Dbg::GetTypeTag(basket.locationClass);
1269 std::string temp;
1270 std::string signature(basket.locationClass->GetDescriptor(&temp));
1271
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +02001272 if (VLOG_IS_ON(jdwp)) {
Sebastien Hertz6995c602014-09-09 12:10:13 +02001273 LogMatchingEventsAndThread(match_list, match_count, thread_id);
1274 VLOG(jdwp) << StringPrintf(" type=%#" PRIx64, class_id) << " " << signature;
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +02001275 VLOG(jdwp) << " suspend_policy=" << suspend_policy;
1276 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001277
Sebastien Hertz6995c602014-09-09 12:10:13 +02001278 if (thread_id == debug_thread_id_) {
Elliott Hughes761928d2011-11-16 18:33:03 -08001279 /*
1280 * JDWP says that, for a class prep in the debugger thread, we
Sebastien Hertz6995c602014-09-09 12:10:13 +02001281 * should set thread to null and if any threads were supposed
Elliott Hughes761928d2011-11-16 18:33:03 -08001282 * to be suspended then we suspend all other threads.
1283 */
Elliott Hughes4dd9b4d2011-12-12 18:29:24 -08001284 VLOG(jdwp) << " NOTE: class prepare in debugger thread!";
Sebastien Hertz6995c602014-09-09 12:10:13 +02001285 thread_id = 0;
Elliott Hughesf8349362012-06-18 15:00:06 -07001286 if (suspend_policy == SP_EVENT_THREAD) {
1287 suspend_policy = SP_ALL;
Elliott Hughes761928d2011-11-16 18:33:03 -08001288 }
1289 }
1290
1291 pReq = eventPrep();
Elliott Hughesf8349362012-06-18 15:00:06 -07001292 expandBufAdd1(pReq, suspend_policy);
Elliott Hughes2aa2e392012-02-17 17:15:43 -08001293 expandBufAdd4BE(pReq, match_count);
Elliott Hughes761928d2011-11-16 18:33:03 -08001294
Sebastien Hertzbca0d3d2014-04-11 16:01:17 +02001295 for (size_t i = 0; i < match_count; i++) {
Elliott Hughesf8349362012-06-18 15:00:06 -07001296 expandBufAdd1(pReq, match_list[i]->eventKind);
1297 expandBufAdd4BE(pReq, match_list[i]->requestId);
Sebastien Hertz6995c602014-09-09 12:10:13 +02001298 expandBufAdd8BE(pReq, thread_id);
Elliott Hughes761928d2011-11-16 18:33:03 -08001299 expandBufAdd1(pReq, tag);
Sebastien Hertz6995c602014-09-09 12:10:13 +02001300 expandBufAdd8BE(pReq, class_id);
Elliott Hughes761928d2011-11-16 18:33:03 -08001301 expandBufAddUtf8String(pReq, signature);
1302 expandBufAdd4BE(pReq, status);
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001303 }
1304 }
Sebastien Hertz6995c602014-09-09 12:10:13 +02001305
1306 {
1307 MutexLock mu(Thread::Current(), event_list_lock_);
1308 CleanupMatchList(match_list, match_count);
1309 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001310 }
1311
Sebastien Hertz138dbfc2013-12-04 18:15:25 +01001312 Dbg::ManageDeoptimization();
1313
Sebastien Hertz6995c602014-09-09 12:10:13 +02001314 SendRequestAndPossiblySuspend(pReq, suspend_policy, thread_id);
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001315
Elliott Hughes2aa2e392012-02-17 17:15:43 -08001316 return match_count != 0;
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001317}
1318
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001319/*
1320 * Send up a chunk of DDM data.
1321 *
1322 * While this takes the form of a JDWP "event", it doesn't interact with
1323 * other debugger traffic, and can't suspend the VM, so we skip all of
1324 * the fun event token gymnastics.
1325 */
Elliott Hughescccd84f2011-12-05 16:51:54 -08001326void JdwpState::DdmSendChunkV(uint32_t type, const iovec* iov, int iov_count) {
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001327 uint8_t header[kJDWPHeaderLen + 8];
1328 size_t dataLen = 0;
1329
1330 CHECK(iov != NULL);
Elliott Hughescccd84f2011-12-05 16:51:54 -08001331 CHECK_GT(iov_count, 0);
1332 CHECK_LT(iov_count, 10);
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001333
1334 /*
1335 * "Wrap" the contents of the iovec with a JDWP/DDMS header. We do
1336 * this by creating a new copy of the vector with space for the header.
1337 */
Brian Carlstromf5293522013-07-19 00:24:00 -07001338 std::vector<iovec> wrapiov;
1339 wrapiov.push_back(iovec());
Elliott Hughescccd84f2011-12-05 16:51:54 -08001340 for (int i = 0; i < iov_count; i++) {
Brian Carlstromf5293522013-07-19 00:24:00 -07001341 wrapiov.push_back(iov[i]);
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001342 dataLen += iov[i].iov_len;
1343 }
1344
1345 /* form the header (JDWP plus DDMS) */
Elliott Hughesf7c3b662011-10-27 12:04:56 -07001346 Set4BE(header, sizeof(header) + dataLen);
1347 Set4BE(header+4, NextRequestSerial());
1348 Set1(header+8, 0); /* flags */
1349 Set1(header+9, kJDWPDdmCmdSet);
1350 Set1(header+10, kJDWPDdmCmd);
1351 Set4BE(header+11, type);
1352 Set4BE(header+15, dataLen);
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001353
1354 wrapiov[0].iov_base = header;
1355 wrapiov[0].iov_len = sizeof(header);
1356
Ian Rogers15bf2d32012-08-28 17:33:04 -07001357 // Try to avoid blocking GC during a send, but only safe when not using mutexes at a lower-level
1358 // than mutator for lock ordering reasons.
Ian Rogers00f7d0e2012-07-19 15:28:27 -07001359 Thread* self = Thread::Current();
Ian Rogers62d6c772013-02-27 08:32:07 -08001360 bool safe_to_release_mutator_lock_over_send = !Locks::mutator_lock_->IsExclusiveHeld(self);
1361 if (safe_to_release_mutator_lock_over_send) {
Brian Carlstrom38f85e42013-07-18 14:45:22 -07001362 for (size_t i = 0; i < kMutatorLock; ++i) {
Ian Rogers62d6c772013-02-27 08:32:07 -08001363 if (self->GetHeldMutex(static_cast<LockLevel>(i)) != NULL) {
1364 safe_to_release_mutator_lock_over_send = false;
1365 break;
1366 }
Ian Rogers15bf2d32012-08-28 17:33:04 -07001367 }
1368 }
1369 if (safe_to_release_mutator_lock_over_send) {
1370 // Change state to waiting to allow GC, ... while we're sending.
1371 self->TransitionFromRunnableToSuspended(kWaitingForDebuggerSend);
Brian Carlstromf5293522013-07-19 00:24:00 -07001372 SendBufferedRequest(type, wrapiov);
Ian Rogers15bf2d32012-08-28 17:33:04 -07001373 self->TransitionFromSuspendedToRunnable();
1374 } else {
1375 // Send and possibly block GC...
Brian Carlstromf5293522013-07-19 00:24:00 -07001376 SendBufferedRequest(type, wrapiov);
Ian Rogers15bf2d32012-08-28 17:33:04 -07001377 }
Elliott Hughes872d4ec2011-10-21 17:07:15 -07001378}
1379
1380} // namespace JDWP
1381
1382} // namespace art