diff options
author | Sebastien Hertz <shertz@google.com> | 2014-03-11 15:26:35 +0100 |
---|---|---|
committer | Sebastien Hertz <shertz@google.com> | 2014-03-17 09:15:31 +0100 |
commit | cb19ebf7609f74b223bd86c94f721498795f9bba (patch) | |
tree | 0db31e4f83046b3d8159d4ba28d9298ff94e06c3 /runtime/jdwp | |
parent | f17ce4c5e3b6882aa8849d1ed82df4238c436da2 (diff) | |
download | art-cb19ebf7609f74b223bd86c94f721498795f9bba.zip art-cb19ebf7609f74b223bd86c94f721498795f9bba.tar.gz art-cb19ebf7609f74b223bd86c94f721498795f9bba.tar.bz2 |
Fix debugger crash in native method frames.
The main crash happens when we try to read (StackFrame::GetValues) or write
(StackFrame::SetValues) values in native frames. We use the method's vmap to
know where Dalvik registers live but native methods don't have vmap. The fix
is to reply with the OPAQUE_FRAME error which indicates local values are not
accessible in the frame.
We prevent from dereferencing null code item which causes some crashes too.
This happens when we compute the line table (Method::LineTable) and variable
table (Method::VariableTable) of methods without code: native, proxy and
abstract methods. We do not expect to encounter abstract methods though. We
take care of these kinds of method when mangling/demangling local value slots.
We also fix the location's pc of native and proxy frames where it must be -1
(as 8-byte value). We'll use this property to detect such frames in the JDWP
tests.
Bug: 13366758
Change-Id: I78e3263fbf2681b5573571c846390d52b9193849
Diffstat (limited to 'runtime/jdwp')
-rw-r--r-- | runtime/jdwp/jdwp_handler.cc | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/runtime/jdwp/jdwp_handler.cc b/runtime/jdwp/jdwp_handler.cc index 4b170ba..5f21098 100644 --- a/runtime/jdwp/jdwp_handler.cc +++ b/runtime/jdwp/jdwp_handler.cc @@ -1409,7 +1409,10 @@ static JdwpError SF_GetValues(JdwpState*, Request& request, ExpandBuf* pReply) size_t width = Dbg::GetTagWidth(reqSigByte); uint8_t* ptr = expandBufAddSpace(pReply, width+1); - Dbg::GetLocalValue(thread_id, frame_id, slot, reqSigByte, ptr, width); + JdwpError error = Dbg::GetLocalValue(thread_id, frame_id, slot, reqSigByte, ptr, width); + if (error != ERR_NONE) { + return error; + } } return ERR_NONE; @@ -1431,7 +1434,10 @@ static JdwpError SF_SetValues(JdwpState*, Request& request, ExpandBuf*) uint64_t value = request.ReadValue(width); VLOG(jdwp) << " --> slot " << slot << " " << sigByte << " " << value; - Dbg::SetLocalValue(thread_id, frame_id, slot, sigByte, value, width); + JdwpError error = Dbg::SetLocalValue(thread_id, frame_id, slot, sigByte, value, width); + if (error != ERR_NONE) { + return error; + } } return ERR_NONE; |