diff --git a/src/debugger.cc b/src/debugger.cc
index 51e43c1..6d3f80c 100644
--- a/src/debugger.cc
+++ b/src/debugger.cc
@@ -851,11 +851,11 @@
     size_t char_count = (name.get() != NULL) ? name->GetLength() : 0;
     const jchar* chars = name->GetCharArray()->GetData();
 
-    size_t byte_count = char_count*2 + sizeof(uint32_t)*2;
-    std::vector<uint8_t> bytes(byte_count);
+    std::vector<uint8_t> bytes;
     JDWP::Append4BE(bytes, t->GetThinLockId());
     JDWP::AppendUtf16BE(bytes, chars, char_count);
-    Dbg::DdmSendChunk(type, bytes.size(), &bytes[0]);
+    CHECK_EQ(bytes.size(), char_count*2 + sizeof(uint32_t)*2);
+    Dbg::DdmSendChunk(type, bytes);
   }
 }
 
@@ -899,6 +899,10 @@
   Dbg::DdmSendChunkV(type, vec, 1);
 }
 
+void Dbg::DdmSendChunk(uint32_t type, const std::vector<uint8_t>& bytes) {
+  DdmSendChunk(type, bytes.size(), &bytes[0]);
+}
+
 void Dbg::DdmSendChunkV(uint32_t type, const struct iovec* iov, int iovcnt) {
   if (gJdwpState == NULL) {
     LOG(VERBOSE) << "Debugger thread not active, ignoring DDM send: " << type;
@@ -969,7 +973,7 @@
    *     [u4]: current number of objects allocated
    */
   uint8_t heap_count = 1;
-  std::vector<uint8_t> bytes(4 + (heap_count * (4 + 8 + 1 + 4 + 4 + 4 + 4)));
+  std::vector<uint8_t> bytes;
   JDWP::Append4BE(bytes, heap_count);
   JDWP::Append4BE(bytes, 1); // Heap id (bogus; we only have one heap).
   JDWP::Append8BE(bytes, MilliTime());
@@ -978,7 +982,8 @@
   JDWP::Append4BE(bytes, Heap::GetTotalMemory()); // Current heap size in bytes.
   JDWP::Append4BE(bytes, Heap::GetBytesAllocated());
   JDWP::Append4BE(bytes, Heap::GetObjectsAllocated());
-  Dbg::DdmSendChunk(CHUNK_TYPE("HPIF"), bytes.size(), &bytes[0]);
+  CHECK_EQ(bytes.size(), 4U + (heap_count * (4 + 8 + 1 + 4 + 4 + 4 + 4)));
+  Dbg::DdmSendChunk(CHUNK_TYPE("HPIF"), bytes);
 }
 
 enum HpsgSolidity {
diff --git a/src/debugger.h b/src/debugger.h
index 0aa2c83..35ef619 100644
--- a/src/debugger.h
+++ b/src/debugger.h
@@ -238,6 +238,7 @@
   static bool DdmHandlePacket(const uint8_t* buf, int dataLen, uint8_t** pReplyBuf, int* pReplyLen);
   static void DdmConnected();
   static void DdmDisconnected();
+  static void DdmSendChunk(uint32_t type, const std::vector<uint8_t>& bytes);
   static void DdmSendChunk(uint32_t type, size_t len, const uint8_t* buf);
   static void DdmSendChunkV(uint32_t type, const struct iovec* iov, int iovcnt);
 
diff --git a/src/jdwp/jdwp_bits.h b/src/jdwp/jdwp_bits.h
index 5e5b120..faa3960 100644
--- a/src/jdwp/jdwp_bits.h
+++ b/src/jdwp/jdwp_bits.h
@@ -159,13 +159,6 @@
   *dst += sizeof(value);
 }
 
-// @deprecated
-static inline void SetUtf8String(uint8_t* buf, const uint8_t* str) {
-  uint32_t strLen = strlen((const char*)str);
-  Set4BE(buf, strLen);
-  memcpy(buf + sizeof(uint32_t), str, strLen);
-}
-
 }  // namespace JDWP
 
 }  // namespace art
diff --git a/src/jdwp/jdwp_expand_buf.cc b/src/jdwp/jdwp_expand_buf.cc
index 71931e1..f5e24b2 100644
--- a/src/jdwp/jdwp_expand_buf.cc
+++ b/src/jdwp/jdwp_expand_buf.cc
@@ -153,6 +153,12 @@
   pBuf->curLen += sizeof(val);
 }
 
+static void SetUtf8String(uint8_t* buf, const uint8_t* str) {
+  uint32_t strLen = strlen((const char*)str);
+  Set4BE(buf, strLen);
+  memcpy(buf + sizeof(uint32_t), str, strLen);
+}
+
 /*
  * Add a UTF8 string as a 4-byte length followed by a non-NULL-terminated
  * string.
diff --git a/src/logging.cc b/src/logging.cc
index bb68442..34e5e8d 100644
--- a/src/logging.cc
+++ b/src/logging.cc
@@ -66,14 +66,14 @@
 /*
  * Print a hex dump in this format:
  *
- * 01234567: 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff  0123456789abcdef\n
+ * 01234567: 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff  0123456789abcdef
  *
  * Does not use printf() or other string-formatting calls.
  */
 void HexDump(const void* address, size_t byte_count, bool show_actual_address) {
   static const char gHexDigit[] = "0123456789abcdef";
   const unsigned char* addr = reinterpret_cast<const unsigned char*>(address);
-  char out[77];           /* exact fit */
+  char out[76];           /* exact fit */
   unsigned int offset;    /* offset to show while printing */
 
   if (show_actual_address) {
@@ -83,7 +83,6 @@
   }
   memset(out, ' ', sizeof(out)-1);
   out[8] = ':';
-  out[sizeof(out)-2] = '\n';
   out[sizeof(out)-1] = '\0';
 
   int gap = (int) offset & 0x0f;
diff --git a/src/org_apache_harmony_dalvik_ddmc_DdmVmInternal.cc b/src/org_apache_harmony_dalvik_ddmc_DdmVmInternal.cc
index 5ea3729..4d20a85 100644
--- a/src/org_apache_harmony_dalvik_ddmc_DdmVmInternal.cc
+++ b/src/org_apache_harmony_dalvik_ddmc_DdmVmInternal.cc
@@ -81,9 +81,6 @@
 static const int kThstHeaderLen = 4;
 
 static void ThreadStatsGetterCallback(Thread* t, void* context) {
-  uint8_t** ptr = reinterpret_cast<uint8_t**>(context);
-  uint8_t* buf = *ptr;
-
   /*
    * Generate the contents of a THST chunk.  The data encompasses all known
    * threads.
@@ -93,7 +90,7 @@
    *  (1b) bytes per entry
    *  (2b) thread count
    * Then, for each thread:
-   *  (4b) threadId
+   *  (4b) thread id
    *  (1b) thread status
    *  (4b) tid
    *  (4b) utime
@@ -108,14 +105,13 @@
   int utime, stime, task_cpu;
   GetTaskStats(t->GetTid(), utime, stime, task_cpu);
 
-  JDWP::Set4BE(buf+0, t->GetThinLockId());
-  JDWP::Set1(buf+4, t->GetState());
-  JDWP::Set4BE(buf+5, t->GetTid());
-  JDWP::Set4BE(buf+9, utime);
-  JDWP::Set4BE(buf+13, stime);
-  JDWP::Set1(buf+17, t->IsDaemon());
-
-  *ptr += kThstBytesPerEntry;
+  std::vector<uint8_t>& bytes = *reinterpret_cast<std::vector<uint8_t>*>(context);
+  JDWP::Append4BE(bytes, t->GetThinLockId());
+  JDWP::Append1BE(bytes, t->GetState());
+  JDWP::Append4BE(bytes, t->GetTid());
+  JDWP::Append4BE(bytes, utime);
+  JDWP::Append4BE(bytes, stime);
+  JDWP::Append1BE(bytes, t->IsDaemon());
 }
 
 static jbyteArray DdmVmInternal_getThreadStats(JNIEnv* env, jclass) {
@@ -124,17 +120,14 @@
     ScopedThreadListLock thread_list_lock;
     ThreadList* thread_list = Runtime::Current()->GetThreadList();
 
-    uint16_t thread_count;
+    uint16_t thread_count = 0;
     thread_list->ForEach(ThreadCountCallback, &thread_count);
 
-    bytes.resize(kThstHeaderLen + thread_count * kThstBytesPerEntry);
+    JDWP::Append1BE(bytes, kThstHeaderLen);
+    JDWP::Append1BE(bytes, kThstBytesPerEntry);
+    JDWP::Append2BE(bytes, thread_count);
 
-    JDWP::Set1(&bytes[0], kThstHeaderLen);
-    JDWP::Set1(&bytes[1], kThstBytesPerEntry);
-    JDWP::Set2BE(&bytes[2], thread_count);
-
-    uint8_t* ptr = &bytes[kThstHeaderLen];
-    thread_list->ForEach(ThreadStatsGetterCallback, &ptr);
+    thread_list->ForEach(ThreadStatsGetterCallback, &bytes);
   }
 
   jbyteArray result = env->NewByteArray(bytes.size());
