diff options
| author | Tyler Mandry <tmandry@gmail.com> | 2019-11-26 17:56:08 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-11-26 17:56:08 -0600 |
| commit | a0e756bc79ea6482606a75dfdb300fe2fcafa95f (patch) | |
| tree | d64ad57cd8b03b65d629c246bb15f08dfbc8bd9e /src | |
| parent | a49f23e05d8f9510ddc707285fdb72cea4832839 (diff) | |
| parent | 9233a54176441b9d63b3da33814794adb8bf0e5d (diff) | |
| download | rust-a0e756bc79ea6482606a75dfdb300fe2fcafa95f.tar.gz rust-a0e756bc79ea6482606a75dfdb300fe2fcafa95f.zip | |
Rollup merge of #66663 - RalfJung:miri-leaks, r=oli-obk
Miri: print leak report even without tracing Currently, the rustup-installed Miri has no way to actually print a leak report (as `trace!` is compiled out). Make it print that per default instead when there is a leak. r? @oli-obk
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc_mir/interpret/eval_context.rs | 4 | ||||
| -rw-r--r-- | src/librustc_mir/interpret/memory.rs | 27 |
2 files changed, 18 insertions, 13 deletions
diff --git a/src/librustc_mir/interpret/eval_context.rs b/src/librustc_mir/interpret/eval_context.rs index 471227f7403..78e03a555ee 100644 --- a/src/librustc_mir/interpret/eval_context.rs +++ b/src/librustc_mir/interpret/eval_context.rs @@ -705,7 +705,9 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { if let LocalValue::Live(Operand::Indirect(MemPlace { ptr, .. })) = local { trace!("deallocating local"); let ptr = ptr.to_ptr()?; - self.memory.dump_alloc(ptr.alloc_id); + if log_enabled!(::log::Level::Trace) { + self.memory.dump_alloc(ptr.alloc_id); + } self.memory.deallocate_local(ptr)?; }; Ok(()) diff --git a/src/librustc_mir/interpret/memory.rs b/src/librustc_mir/interpret/memory.rs index 842ef915ad2..eccdc5b0326 100644 --- a/src/librustc_mir/interpret/memory.rs +++ b/src/librustc_mir/interpret/memory.rs @@ -635,7 +635,9 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { Ok(()) } - /// For debugging, print an allocation and all allocations it points to, recursively. + /// Print an allocation and all allocations it points to, recursively. + /// This prints directly to stderr, ignoring RUSTC_LOG! It is up to the caller to + /// control for this. pub fn dump_alloc(&self, id: AllocId) { self.dump_allocs(vec![id]); } @@ -674,7 +676,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { } } - trace!( + eprintln!( "{}({} bytes, alignment {}){}", msg, alloc.size.bytes(), @@ -695,15 +697,14 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { write!(msg, "└{0:─^1$}┘ ", target, relocation_width as usize).unwrap(); pos = i + self.pointer_size(); } - trace!("{}", msg); + eprintln!("{}", msg); } } - /// For debugging, print a list of allocations and all allocations they point to, recursively. + /// Print a list of allocations and all allocations they point to, recursively. + /// This prints directly to stderr, ignoring RUSTC_LOG! It is up to the caller to + /// control for this. pub fn dump_allocs(&self, mut allocs: Vec<AllocId>) { - if !log_enabled!(::log::Level::Trace) { - return; - } allocs.sort(); allocs.dedup(); let mut allocs_to_print = VecDeque::from(allocs); @@ -735,13 +736,13 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { ); } Some(GlobalAlloc::Function(func)) => { - trace!("{} {}", msg, func); + eprintln!("{} {}", msg, func); } Some(GlobalAlloc::Static(did)) => { - trace!("{} {:?}", msg, did); + eprintln!("{} {:?}", msg, did); } None => { - trace!("{} (deallocated)", msg); + eprintln!("{} (deallocated)", msg); } } }, @@ -751,12 +752,14 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { } pub fn leak_report(&self) -> usize { - trace!("### LEAK REPORT ###"); let leaks: Vec<_> = self.alloc_map.filter_map_collect(|&id, &(kind, _)| { if kind.may_leak() { None } else { Some(id) } }); let n = leaks.len(); - self.dump_allocs(leaks); + if n > 0 { + eprintln!("### LEAK REPORT ###"); + self.dump_allocs(leaks); + } n } |
