diff --git a/src/librustc/metadata/tydecode.rs b/src/librustc/metadata/tydecode.rs
index 50c9a4a2a52c7..d2a97566baff6 100644
--- a/src/librustc/metadata/tydecode.rs
+++ b/src/librustc/metadata/tydecode.rs
@@ -23,11 +23,14 @@ use middle::ty;
 use std::rc::Rc;
 use std::str;
 use std::string::String;
+use std::cmp;
 use syntax::abi;
 use syntax::ast;
 use syntax::ast::*;
 use syntax::parse::token;
 
+static DATA_TRUNCATE : uint = 32;
+
 // Compact string representation for ty::t values. API ty_str &
 // parse_from_str. Extra parameters are for converting to/from def_ids in the
 // data buffer. Whatever format you choose should not contain pipe characters.
@@ -123,10 +126,14 @@ pub fn parse_state_from_data<'a, 'tcx>(data: &'a [u8], crate_num: ast::CrateNum,
     }
 }
 
-fn data_log_string(data: &[u8], pos: uint) -> String {
+fn data_log_string(data: &[u8], pos: uint, max: uint) -> String {
     let mut buf = String::new();
+    let end = match max {
+        0u => data.len(),
+        x => cmp::min( pos + x, data.len() )
+    };
     buf.push_str("<<");
-    for i in range(pos, data.len()) {
+    for i in range(pos, end) {
         let c = data[i];
         if c > 0x20 && c <= 0x7F {
             buf.push(c as char);
@@ -134,6 +141,11 @@ fn data_log_string(data: &[u8], pos: uint) -> String {
             buf.push('.');
         }
     }
+    if end < data.len() {
+        buf.push_str(
+            format!( " ({} more bytes)", data.len() - end ).as_slice()
+        );
+    }
     buf.push_str(">>");
     buf
 }
@@ -150,35 +162,35 @@ pub fn parse_ty_closure_data(data: &[u8],
 
 pub fn parse_ty_data(data: &[u8], crate_num: ast::CrateNum, pos: uint, tcx: &ty::ctxt,
                      conv: conv_did) -> ty::t {
-    debug!("parse_ty_data {}", data_log_string(data, pos));
+    debug!("parse_ty_data {}", data_log_string(data, pos, DATA_TRUNCATE));
     let mut st = parse_state_from_data(data, crate_num, pos, tcx);
     parse_ty(&mut st, conv)
 }
 
 pub fn parse_region_data(data: &[u8], crate_num: ast::CrateNum, pos: uint, tcx: &ty::ctxt,
                          conv: conv_did) -> ty::Region {
-    debug!("parse_region_data {}", data_log_string(data, pos));
+    debug!("parse_region_data {}", data_log_string(data, pos, DATA_TRUNCATE));
     let mut st = parse_state_from_data(data, crate_num, pos, tcx);
     parse_region(&mut st, conv)
 }
 
 pub fn parse_bare_fn_ty_data(data: &[u8], crate_num: ast::CrateNum, pos: uint, tcx: &ty::ctxt,
                              conv: conv_did) -> ty::BareFnTy {
-    debug!("parse_bare_fn_ty_data {}", data_log_string(data, pos));
+    debug!("parse_bare_fn_ty_data {}", data_log_string(data, pos, DATA_TRUNCATE));
     let mut st = parse_state_from_data(data, crate_num, pos, tcx);
     parse_bare_fn_ty(&mut st, conv)
 }
 
 pub fn parse_trait_ref_data(data: &[u8], crate_num: ast::CrateNum, pos: uint, tcx: &ty::ctxt,
                             conv: conv_did) -> ty::TraitRef {
-    debug!("parse_trait_ref_data {}", data_log_string(data, pos));
+    debug!("parse_trait_ref_data {}", data_log_string(data, pos, DATA_TRUNCATE));
     let mut st = parse_state_from_data(data, crate_num, pos, tcx);
     parse_trait_ref(&mut st, conv)
 }
 
 pub fn parse_substs_data(data: &[u8], crate_num: ast::CrateNum, pos: uint, tcx: &ty::ctxt,
                          conv: conv_did) -> subst::Substs {
-    debug!("parse_substs_data {}", data_log_string(data, pos));
+    debug!("parse_substs_data {}", data_log_string(data, pos, DATA_TRUNCATE));
     let mut st = parse_state_from_data(data, crate_num, pos, tcx);
     parse_substs(&mut st, conv)
 }