Add winapi demangling
This commit is contained in:
parent
bdf3e89863
commit
0620197285
@ -37,6 +37,7 @@ option(CPPTRACE_UNWIND_WITH_WINAPI "" OFF)
|
|||||||
option(CPPTRACE_UNWIND_WITH_NOTHING "" OFF)
|
option(CPPTRACE_UNWIND_WITH_NOTHING "" OFF)
|
||||||
|
|
||||||
option(CPPTRACE_DEMANGLE_WITH_CXXABI "" OFF)
|
option(CPPTRACE_DEMANGLE_WITH_CXXABI "" OFF)
|
||||||
|
option(CPPTRACE_DEMANGLE_WITH_WINAPI "" OFF)
|
||||||
option(CPPTRACE_DEMANGLE_WITH_NOTHING "" OFF)
|
option(CPPTRACE_DEMANGLE_WITH_NOTHING "" OFF)
|
||||||
|
|
||||||
set(CPPTRACE_BACKTRACE_PATH "" CACHE STRING "Path to backtrace.h, if the compiler doesn't already know it. Check /usr/lib/gcc/x86_64-linux-gnu/*/include.")
|
set(CPPTRACE_BACKTRACE_PATH "" CACHE STRING "Path to backtrace.h, if the compiler doesn't already know it. Check /usr/lib/gcc/x86_64-linux-gnu/*/include.")
|
||||||
@ -187,12 +188,16 @@ endif()
|
|||||||
if(
|
if(
|
||||||
NOT (
|
NOT (
|
||||||
CPPTRACE_DEMANGLE_WITH_CXXABI OR
|
CPPTRACE_DEMANGLE_WITH_CXXABI OR
|
||||||
|
CPPTRACE_DEMANGLE_WITH_WINAPI OR
|
||||||
CPPTRACE_DEMANGLE_WITH_NOTHING
|
CPPTRACE_DEMANGLE_WITH_NOTHING
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if(HAS_CXXABI)
|
if(HAS_CXXABI)
|
||||||
message(STATUS "Cpptrace auto config: Using cxxabi for symbols")
|
message(STATUS "Cpptrace auto config: Using cxxabi for demangling")
|
||||||
set(CPPTRACE_DEMANGLE_WITH_CXXABI On)
|
set(CPPTRACE_DEMANGLE_WITH_CXXABI On)
|
||||||
|
elseif(WIN32 AND NOT MINGW)
|
||||||
|
message(STATUS "Cpptrace auto config: Using dbghelp for demangling")
|
||||||
|
set(CPPTRACE_DEMANGLE_WITH_WINAPI On)
|
||||||
else()
|
else()
|
||||||
set(CPPTRACE_DEMANGLE_WITH_NOTHING On)
|
set(CPPTRACE_DEMANGLE_WITH_NOTHING On)
|
||||||
endif()
|
endif()
|
||||||
@ -210,6 +215,7 @@ set(
|
|||||||
sources
|
sources
|
||||||
src/cpptrace.cpp
|
src/cpptrace.cpp
|
||||||
src/demangle/demangle_with_cxxabi.cpp
|
src/demangle/demangle_with_cxxabi.cpp
|
||||||
|
src/demangle/demangle_with_winapi.cpp
|
||||||
src/demangle/demangle_with_nothing.cpp
|
src/demangle/demangle_with_nothing.cpp
|
||||||
src/symbols/symbols_with_addr2line.cpp
|
src/symbols/symbols_with_addr2line.cpp
|
||||||
src/symbols/symbols_with_dbghelp.cpp
|
src/symbols/symbols_with_dbghelp.cpp
|
||||||
@ -361,6 +367,11 @@ if(CPPTRACE_DEMANGLE_WITH_CXXABI)
|
|||||||
target_compile_definitions(cpptrace PUBLIC CPPTRACE_DEMANGLE_WITH_CXXABI)
|
target_compile_definitions(cpptrace PUBLIC CPPTRACE_DEMANGLE_WITH_CXXABI)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(CPPTRACE_DEMANGLE_WITH_WINAPI)
|
||||||
|
target_compile_definitions(cpptrace PUBLIC CPPTRACE_DEMANGLE_WITH_WINAPI)
|
||||||
|
target_link_libraries(cpptrace PRIVATE dbghelp)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(CPPTRACE_DEMANGLE_WITH_NOTHING)
|
if(CPPTRACE_DEMANGLE_WITH_NOTHING)
|
||||||
target_compile_definitions(cpptrace PUBLIC CPPTRACE_DEMANGLE_WITH_NOTHING)
|
target_compile_definitions(cpptrace PUBLIC CPPTRACE_DEMANGLE_WITH_NOTHING)
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
10
README.md
10
README.md
@ -416,10 +416,11 @@ search the system path for `addr2line` at runtime. This is not the default to pr
|
|||||||
|
|
||||||
Lastly, depending on other back-ends used a demangler back-end may be needed.
|
Lastly, depending on other back-ends used a demangler back-end may be needed.
|
||||||
|
|
||||||
| Library | CMake config | Platforms | Info |
|
| Library | CMake config | Platforms | Info |
|
||||||
| -------- | -------------------------------- | ------------------- | ---------------------------------------------------------------------------------- |
|
| --------- | -------------------------------- | ------------------- | ---------------------------------------------------------------------------------- |
|
||||||
| cxxabi.h | `CPPTRACE_DEMANGLE_WITH_CXXABI` | Linux, macos, mingw | Should be available everywhere other than [msvc](https://godbolt.org/z/93ca9rcdz). |
|
| cxxabi.h | `CPPTRACE_DEMANGLE_WITH_CXXABI` | Linux, macos, mingw | Should be available everywhere other than [msvc](https://godbolt.org/z/93ca9rcdz). |
|
||||||
| N/A | `CPPTRACE_DEMANGLE_WITH_NOTHING` | all | Don't attempt to do anything beyond what the symbol resolution back-end does. |
|
| dbghelp.h | `CPPTRACE_DEMANGLE_WITH_WINAPI` | Windows | Demangle with `UnDecorateSymbolName`. |
|
||||||
|
| N/A | `CPPTRACE_DEMANGLE_WITH_NOTHING` | all | Don't attempt to do anything beyond what the symbol resolution back-end does. |
|
||||||
|
|
||||||
**More?**
|
**More?**
|
||||||
|
|
||||||
@ -442,6 +443,7 @@ Back-ends:
|
|||||||
- `CPPTRACE_UNWIND_WITH_WINAPI=On/Off`
|
- `CPPTRACE_UNWIND_WITH_WINAPI=On/Off`
|
||||||
- `CPPTRACE_UNWIND_WITH_NOTHING=On/Off`
|
- `CPPTRACE_UNWIND_WITH_NOTHING=On/Off`
|
||||||
- `CPPTRACE_DEMANGLE_WITH_CXXABI=On/Off`
|
- `CPPTRACE_DEMANGLE_WITH_CXXABI=On/Off`
|
||||||
|
- `CPPTRACE_DEMANGLE_WITH_WINAPI=On/Off`
|
||||||
- `CPPTRACE_DEMANGLE_WITH_NOTHING=On/Off`
|
- `CPPTRACE_DEMANGLE_WITH_NOTHING=On/Off`
|
||||||
|
|
||||||
Back-end configuration:
|
Back-end configuration:
|
||||||
|
|||||||
26
src/demangle/demangle_with_winapi.cpp
Normal file
26
src/demangle/demangle_with_winapi.cpp
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
#ifdef CPPTRACE_DEMANGLE_WITH_WINAPI
|
||||||
|
|
||||||
|
#include "demangle.hpp"
|
||||||
|
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
#include <dbghelp.h>
|
||||||
|
|
||||||
|
namespace cpptrace {
|
||||||
|
namespace detail {
|
||||||
|
std::string demangle(const std::string& name) {
|
||||||
|
char buffer[500];
|
||||||
|
auto ret = UnDecorateSymbolName(name.c_str(), buffer, sizeof(buffer) - 1, 0);
|
||||||
|
if(ret == 0) {
|
||||||
|
return name;
|
||||||
|
} else {
|
||||||
|
buffer[ret] = 0; // just in case, ms' docs unclear if null terminator inserted
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
Loading…
Reference in New Issue
Block a user