summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2015-06-16 18:49:56 +0100
committerMaxime Coste <frrrwww@gmail.com>2015-06-16 18:49:56 +0100
commit7417c5e9e2f4dbd3ae2c17512835f1d23e1b35fb (patch)
tree8615b293c695746a96f3e4d91240850ac8311ec1 /src
parentd8e2e9e0430b68aea2b91ed364ec0cb6a2e99d7f (diff)
Resolve symbol names in Cygwin Backtrace::desc implementation
Diffstat (limited to 'src')
-rw-r--r--src/Makefile3
-rw-r--r--src/backtrace.cc24
2 files changed, 23 insertions, 4 deletions
diff --git a/src/Makefile b/src/Makefile
index 2945e536..9107794c 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -15,6 +15,9 @@ os := $(shell uname)
ifeq ($(os),Darwin)
LIBS += -lncurses -lboost_regex-mt
+else ifneq (,$(findstring CYGWIN,$(os)))
+ LIBS += -lncursesw -lboost_regex -ldbghelp
+ LDFLAGS += -rdynamic
else
LIBS += -lncursesw -lboost_regex
LDFLAGS += -rdynamic
diff --git a/src/backtrace.cc b/src/backtrace.cc
index 7c195f67..adeb9301 100644
--- a/src/backtrace.cc
+++ b/src/backtrace.cc
@@ -7,6 +7,7 @@
# include <stdlib.h>
#elif defined(__CYGWIN__)
# include <windows.h>
+# include <dbghelp.h>
# include <stdio.h>
#endif
@@ -39,12 +40,27 @@ String Backtrace::desc() const
free(symbols);
return res;
#elif defined(__CYGWIN__)
- String res; res.reserve(num_frames * 20);
+ HANDLE process = GetCurrentProcess();
+
+ static bool symbols_initialized = false;
+ if (not symbols_initialized)
+ {
+ SymInitialize(process, nullptr, true);
+ symbols_initialized = true;
+ }
+
+ alignas(SYMBOL_INFO) char symbol_info_buffer[sizeof(SYMBOL_INFO) + 256];
+ SYMBOL_INFO* symbol_info = reinterpret_cast<SYMBOL_INFO*>(symbol_info_buffer);
+ symbol_info->MaxNameLen = 255;
+ symbol_info->SizeOfStruct = sizeof(SYMBOL_INFO);
+
+ String res; // res.reserve(num_frames * 276);
for (int i = 0; i < num_frames; ++i)
{
- char addr[20];
- snprintf(addr, 20, "0x%p\n", stackframes[i]);
- res += addr;
+ SymFromAddr(process, (DWORD64)stackframes[i], 0, symbol_info);
+ char desc[276];
+ snprintf(desc, 276, "0x%0llx (%s)\n", symbol_info->Address, symbol_info->Name);
+ res += desc;
}
return res;
#else