|
4 | 4 | use std::collections::BTreeMap; |
5 | 5 | use std::path::Path; |
6 | 6 |
|
7 | | -use anyhow::{anyhow, bail, Error, Result}; |
| 7 | +use anyhow::{anyhow, Error, Result}; |
8 | 8 | use debuggable_module::debuginfo::{DebugInfo, Function}; |
9 | 9 | use debuggable_module::load_module::LoadModule; |
10 | 10 | use debuggable_module::loader::Loader; |
@@ -132,20 +132,24 @@ impl<'cache, 'data> WindowsRecorder<'cache, 'data> { |
132 | 132 | return Ok(()); |
133 | 133 | } |
134 | 134 |
|
135 | | - let breakpoint = self.breakpoints.remove(id); |
136 | | - |
137 | | - let Some(breakpoint) = breakpoint else { |
138 | | - let stack = dbg.get_current_stack()?; |
139 | | - bail!("stopped on dangling breakpoint, debuggee stack:\n{}", stack); |
140 | | - }; |
141 | | - |
142 | | - let coverage = self |
143 | | - .coverage |
144 | | - .modules |
145 | | - .get_mut(&breakpoint.module) |
146 | | - .ok_or_else(|| anyhow!("coverage not initialized for module: {}", breakpoint.module))?; |
147 | | - |
148 | | - coverage.increment(breakpoint.offset); |
| 135 | + match self.breakpoints.remove(id) { |
| 136 | + Some(breakpoint) => { |
| 137 | + let coverage = self |
| 138 | + .coverage |
| 139 | + .modules |
| 140 | + .get_mut(&breakpoint.module) |
| 141 | + .ok_or_else(|| { |
| 142 | + anyhow!("coverage not initialized for module: {}", breakpoint.module) |
| 143 | + })?; |
| 144 | + |
| 145 | + coverage.increment(breakpoint.offset); |
| 146 | + } |
| 147 | + // ASAN can set breakpoints which we don't know about, meaning they're not in `self.breakpoints` |
| 148 | + None => { |
| 149 | + let stack = dbg.get_current_stack()?; |
| 150 | + warn!("stopped on dangling breakpoint, debuggee stack:\n{}", stack); |
| 151 | + } |
| 152 | + } |
149 | 153 |
|
150 | 154 | Ok(()) |
151 | 155 | } |
|
0 commit comments