[TSan] More detailed error message on failed sahdow memory madvise

Summary:
Report errno value on failed shadow memory madvise attempt and add a
hint message with the possible workaround.

Reviewers: eugenis

Subscribers: kubamracek, delcypher, #sanitizers, llvm-commits

Differential Revision: https://reviews.llvm.org/D48668

llvm-svn: 335928
This commit is contained in:
Alex Shlyapnikov 2018-06-28 21:38:34 +00:00
parent 4d45645568
commit fb1644835b
1 changed files with 10 additions and 3 deletions

View File

@ -16,6 +16,7 @@
#if SANITIZER_POSIX #if SANITIZER_POSIX
#include "sanitizer_common/sanitizer_common.h" #include "sanitizer_common/sanitizer_common.h"
#include "sanitizer_common/sanitizer_errno.h"
#include "sanitizer_common/sanitizer_libc.h" #include "sanitizer_common/sanitizer_libc.h"
#include "sanitizer_common/sanitizer_procmaps.h" #include "sanitizer_common/sanitizer_procmaps.h"
#include "tsan_platform.h" #include "tsan_platform.h"
@ -24,13 +25,18 @@
namespace __tsan { namespace __tsan {
static const char kShadowMemoryMappingWarning[] = static const char kShadowMemoryMappingWarning[] =
"FATAL: %s can not madvise shadow region [%zx, %zx] with %s\n"; "FATAL: %s can not madvise shadow region [%zx, %zx] with %s (errno: %d)\n";
static const char kShadowMemoryMappingHint[] =
"HINT: if %s is not supported in your environment, you may set "
"TSAN_OPTIONS=%s=0\n";
static void NoHugePagesInShadow(uptr addr, uptr size) { static void NoHugePagesInShadow(uptr addr, uptr size) {
if (common_flags()->no_huge_pages_for_shadow) if (common_flags()->no_huge_pages_for_shadow)
if (!NoHugePagesInRegion(addr, size)) { if (!NoHugePagesInRegion(addr, size)) {
Printf(kShadowMemoryMappingWarning, SanitizerToolName, addr, addr + size, Printf(kShadowMemoryMappingWarning, SanitizerToolName, addr, addr + size,
"MADV_NOHUGEPAGE"); "MADV_NOHUGEPAGE", errno);
Printf(kShadowMemoryMappingHint, "MADV_NOHUGEPAGE",
"no_huge_pages_for_shadow");
Die(); Die();
} }
} }
@ -39,7 +45,8 @@ static void DontDumpShadow(uptr addr, uptr size) {
if (common_flags()->use_madv_dontdump) if (common_flags()->use_madv_dontdump)
if (!DontDumpShadowMemory(addr, size)) { if (!DontDumpShadowMemory(addr, size)) {
Printf(kShadowMemoryMappingWarning, SanitizerToolName, addr, addr + size, Printf(kShadowMemoryMappingWarning, SanitizerToolName, addr, addr + size,
"MADV_DONTDUMP"); "MADV_DONTDUMP", errno);
Printf(kShadowMemoryMappingHint, "MADV_DONTDUMP", "use_madv_dontdump");
Die(); Die();
} }
} }