1 //===-- asan_debugging.cc -------------------------------------------------===//
3 // This file is distributed under the University of Illinois Open Source
4 // License. See LICENSE.TXT for details.
6 //===----------------------------------------------------------------------===//
8 // This file is a part of AddressSanitizer, an address sanity checker.
10 // This file contains various functions that are generally useful to call when
11 // using a debugger (LLDB, GDB).
12 //===----------------------------------------------------------------------===//
14 #include "asan_allocator.h"
15 #include "asan_flags.h"
16 #include "asan_internal.h"
17 #include "asan_mapping.h"
18 #include "asan_thread.h"
22 uptr
AsanGetStack(uptr addr
, uptr
*trace
, uptr size
, u32
*thread_id
,
24 AsanChunkView chunk
= FindHeapChunkByAddress(addr
);
25 if (!chunk
.IsValid()) return 0;
29 if (chunk
.AllocTid() == kInvalidTid
) return 0;
30 chunk
.GetAllocStack(&stack
);
31 if (thread_id
) *thread_id
= chunk
.AllocTid();
33 if (chunk
.FreeTid() == kInvalidTid
) return 0;
34 chunk
.GetFreeStack(&stack
);
35 if (thread_id
) *thread_id
= chunk
.FreeTid();
39 if (size
> kStackTraceMax
)
40 size
= kStackTraceMax
;
41 if (size
> stack
.size
)
43 for (uptr i
= 0; i
< size
; i
++)
44 trace
[i
] = StackTrace::GetPreviousInstructionPc(stack
.trace
[i
]);
54 using namespace __asan
;
56 SANITIZER_INTERFACE_ATTRIBUTE
57 uptr
__asan_get_alloc_stack(uptr addr
, uptr
*trace
, uptr size
, u32
*thread_id
) {
58 return AsanGetStack(addr
, trace
, size
, thread_id
, /* alloc_stack */ true);
61 SANITIZER_INTERFACE_ATTRIBUTE
62 uptr
__asan_get_free_stack(uptr addr
, uptr
*trace
, uptr size
, u32
*thread_id
) {
63 return AsanGetStack(addr
, trace
, size
, thread_id
, /* alloc_stack */ false);
66 SANITIZER_INTERFACE_ATTRIBUTE
67 void __asan_get_shadow_mapping(uptr
*shadow_scale
, uptr
*shadow_offset
) {
69 *shadow_scale
= SHADOW_SCALE
;
71 *shadow_offset
= SHADOW_OFFSET
;