92
92
// a backtrace or actually symbolizing it.
93
93
94
94
use crate :: env;
95
+ use crate :: ffi:: c_void;
95
96
use crate :: fmt;
96
97
use crate :: sync:: atomic:: { AtomicUsize , Ordering :: SeqCst } ;
97
98
use crate :: sync:: Mutex ;
@@ -144,10 +145,16 @@ fn _assert_send_sync() {
144
145
}
145
146
146
147
struct BacktraceFrame {
147
- frame : backtrace :: Frame ,
148
+ frame : RawFrame ,
148
149
symbols : Vec < BacktraceSymbol > ,
149
150
}
150
151
152
+ enum RawFrame {
153
+ Actual ( backtrace:: Frame ) ,
154
+ #[ cfg( test) ]
155
+ Fake ,
156
+ }
157
+
151
158
struct BacktraceSymbol {
152
159
name : Option < Vec < u8 > > ,
153
160
filename : Option < BytesOrWide > ,
@@ -293,7 +300,10 @@ impl Backtrace {
293
300
let mut actual_start = None ;
294
301
unsafe {
295
302
backtrace:: trace_unsynchronized ( |frame| {
296
- frames. push ( BacktraceFrame { frame : frame. clone ( ) , symbols : Vec :: new ( ) } ) ;
303
+ frames. push ( BacktraceFrame {
304
+ frame : RawFrame :: Actual ( frame. clone ( ) ) ,
305
+ symbols : Vec :: new ( ) ,
306
+ } ) ;
297
307
if frame. symbol_address ( ) as usize == ip && actual_start. is_none ( ) {
298
308
actual_start = Some ( frames. len ( ) ) ;
299
309
}
@@ -393,8 +403,13 @@ impl Capture {
393
403
let _lock = lock ( ) ;
394
404
for frame in self . frames . iter_mut ( ) {
395
405
let symbols = & mut frame. symbols ;
406
+ let frame = match & frame. frame {
407
+ RawFrame :: Actual ( frame) => frame,
408
+ #[ cfg( test) ]
409
+ RawFrame :: Fake => unimplemented ! ( ) ,
410
+ } ;
396
411
unsafe {
397
- backtrace:: resolve_frame_unsynchronized ( & frame . frame , |symbol| {
412
+ backtrace:: resolve_frame_unsynchronized ( frame, |symbol| {
398
413
symbols. push ( BacktraceSymbol {
399
414
name : symbol. name ( ) . map ( |m| m. as_bytes ( ) . to_vec ( ) ) ,
400
415
filename : symbol. filename_raw ( ) . map ( |b| match b {
@@ -408,3 +423,13 @@ impl Capture {
408
423
}
409
424
}
410
425
}
426
+
427
+ impl RawFrame {
428
+ fn ip ( & self ) -> * mut c_void {
429
+ match self {
430
+ RawFrame :: Actual ( frame) => frame. ip ( ) ,
431
+ #[ cfg( test) ]
432
+ RawFrame :: Fake => 1 as * mut c_void ,
433
+ }
434
+ }
435
+ }
0 commit comments