Skip to content

Commit

Permalink
Always enable proper symbolize implementation on Windows (#257)
Browse files Browse the repository at this point in the history
  • Loading branch information
rongjiecomputer authored and derekmauro committed Oct 22, 2019
1 parent 2796d50 commit ecc0033
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 17 deletions.
10 changes: 8 additions & 2 deletions absl/debugging/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,14 @@ cc_library(
cc_test(
name = "symbolize_test",
srcs = ["symbolize_test.cc"],
copts = ABSL_TEST_COPTS,
linkopts = ABSL_DEFAULT_LINKOPTS,
copts = ABSL_TEST_COPTS + select({
"//absl:windows": ["/Z7"],
"//conditions:default": [],
}),
linkopts = ABSL_DEFAULT_LINKOPTS + select({
"//absl:windows": ["/DEBUG"],
"//conditions:default": [],
}),
deps = [
":stack_consumption",
":symbolize",
Expand Down
3 changes: 3 additions & 0 deletions absl/debugging/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,9 @@ absl_cc_test(
"symbolize_test.cc"
COPTS
${ABSL_TEST_COPTS}
$<$<BOOL:${MSVC}>:-Z7>
LINKOPTS
$<$<BOOL:${MSVC}>:-DEBUG>
DEPS
absl::stack_consumption
absl::symbolize
Expand Down
9 changes: 3 additions & 6 deletions absl/debugging/symbolize.cc
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,9 @@

#if defined(ABSL_INTERNAL_HAVE_ELF_SYMBOLIZE)
#include "absl/debugging/symbolize_elf.inc"
#elif defined(_WIN32) && defined(_DEBUG)
// The Windows Symbolizer only works in debug mode. Note that _DEBUG
// is the macro that defines whether or not MS C-Runtime debug info is
// available. Note that the PDB files containing the debug info must
// also be available to the program at runtime for the symbolizer to
// work.
#elif defined(_WIN32)
// The Windows Symbolizer only works if PDB files containing the debug info
// are available to the program at runtime.
#include "absl/debugging/symbolize_win32.inc"
#else
#include "absl/debugging/symbolize_unimplemented.inc"
Expand Down
35 changes: 29 additions & 6 deletions absl/debugging/symbolize_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -35,18 +35,41 @@

using testing::Contains;

#ifdef _WIN32
#define ABSL_SYMBOLIZE_TEST_NOINLINE __declspec(noinline)
#else
#define ABSL_SYMBOLIZE_TEST_NOINLINE ABSL_ATTRIBUTE_NOINLINE
#endif

// Functions to symbolize. Use C linkage to avoid mangled names.
extern "C" {
void nonstatic_func() { ABSL_BLOCK_TAIL_CALL_OPTIMIZATION(); }
static void static_func() { ABSL_BLOCK_TAIL_CALL_OPTIMIZATION(); }
ABSL_SYMBOLIZE_TEST_NOINLINE void nonstatic_func() {
// The next line makes this a unique function to prevent the compiler from
// folding identical functions together.
volatile int x = __LINE__;
static_cast<void>(x);
ABSL_BLOCK_TAIL_CALL_OPTIMIZATION();
}

ABSL_SYMBOLIZE_TEST_NOINLINE static void static_func() {
// The next line makes this a unique function to prevent the compiler from
// folding identical functions together.
volatile int x = __LINE__;
static_cast<void>(x);
ABSL_BLOCK_TAIL_CALL_OPTIMIZATION();
}
} // extern "C"

struct Foo {
static void func(int x);
};

// A C++ method that should have a mangled name.
void ABSL_ATTRIBUTE_NOINLINE Foo::func(int) {
ABSL_SYMBOLIZE_TEST_NOINLINE void Foo::func(int) {
// The next line makes this a unique function to prevent the compiler from
// folding identical functions together.
volatile int x = __LINE__;
static_cast<void>(x);
ABSL_BLOCK_TAIL_CALL_OPTIMIZATION();
}

Expand Down Expand Up @@ -449,14 +472,14 @@ void ABSL_ATTRIBUTE_NOINLINE TestWithReturnAddress() {
#endif
}

#elif defined(_WIN32) && defined(_DEBUG)
#elif defined(_WIN32)

TEST(Symbolize, Basics) {
EXPECT_STREQ("nonstatic_func", TrySymbolize((void *)(&nonstatic_func)));

// The name of an internal linkage symbol is not specified; allow either a
// mangled or an unmangled name here.
const char* static_func_symbol = TrySymbolize((void *)(&static_func));
const char *static_func_symbol = TrySymbolize((void *)(&static_func));
ASSERT_TRUE(static_func_symbol != nullptr);
EXPECT_TRUE(strstr(static_func_symbol, "static_func") != nullptr);

Expand All @@ -483,7 +506,7 @@ TEST(Symbolize, Truncation) {
}

TEST(Symbolize, SymbolizeWithDemangling) {
const char* result = TrySymbolize((void *)(&Foo::func));
const char *result = TrySymbolize((void *)(&Foo::func));
ASSERT_TRUE(result != nullptr);
EXPECT_TRUE(strstr(result, "Foo::func") != nullptr) << result;
}
Expand Down
5 changes: 2 additions & 3 deletions absl/debugging/symbolize_win32.inc
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,8 @@ bool Symbolize(const void *pc, char *out, int out_size) {
if (out_size <= 0) {
return false;
}
std::aligned_storage<sizeof(SYMBOL_INFO) + MAX_SYM_NAME,
alignof(SYMBOL_INFO)>::type buf;
SYMBOL_INFO *symbol = reinterpret_cast<SYMBOL_INFO *>(&buf);
alignas(SYMBOL_INFO) char buf[sizeof(SYMBOL_INFO) + MAX_SYM_NAME];
SYMBOL_INFO *symbol = reinterpret_cast<SYMBOL_INFO *>(buf);
symbol->SizeOfStruct = sizeof(SYMBOL_INFO);
symbol->MaxNameLen = MAX_SYM_NAME;
if (!SymFromAddr(process, reinterpret_cast<DWORD64>(pc), nullptr, symbol)) {
Expand Down

0 comments on commit ecc0033

Please sign in to comment.