Thank you for the very useful library! Few improvements: - Better header hygiene - Isolate `windows.h` to `.cpp` whenever possible - Use `WIN32_LEAN_AND_MEAN` - Remove unused headers Tested on Windows with ``` cmake .. -DCMAKE_BUILD_TYPE=Debug -GNinja -DCMAKE_EXPORT_COMPILE_COMMANDS=1 -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_CXX_FLAGS="-ftime-trace -Wall -Wextra -Wpedantic -Wno-ignored-attributes" -DCMAKE_COLOR_DIAGNOSTICS=1 -DCPPTRACE_BUILD_TESTING=1 -DCPPTRACE_BUILD_BENCHMARKING=0 ``` There's a lot more that can be improved if you are interested. --------- Co-authored-by: Jeremy Rifkin <51220084+jeremy-rifkin@users.noreply.github.com>
46 lines
1.1 KiB
C++
46 lines
1.1 KiB
C++
#include "platform/platform.hpp"
|
|
|
|
#if IS_WINDOWS
|
|
|
|
#include "platform/dbghelp_syminit_manager.hpp"
|
|
|
|
#include "utils/error.hpp"
|
|
#include "utils/microfmt.hpp"
|
|
|
|
#include <unordered_set>
|
|
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#include <windows.h>
|
|
#include <dbghelp.h>
|
|
|
|
namespace cpptrace {
|
|
namespace detail {
|
|
|
|
dbghelp_syminit_manager::~dbghelp_syminit_manager() {
|
|
for(auto handle : set) {
|
|
if(!SymCleanup(handle)) {
|
|
ASSERT(false, microfmt::format("Cpptrace SymCleanup failed with code {}\n", GetLastError()).c_str());
|
|
}
|
|
}
|
|
}
|
|
|
|
void dbghelp_syminit_manager::init(HANDLE proc) {
|
|
if(set.count(proc) == 0) {
|
|
if(!SymInitialize(proc, NULL, TRUE)) {
|
|
throw internal_error("SymInitialize failed {}", GetLastError());
|
|
}
|
|
set.insert(proc);
|
|
}
|
|
}
|
|
|
|
// Thread-safety: Must only be called from symbols_with_dbghelp while the dbghelp_lock lock is held
|
|
dbghelp_syminit_manager& get_syminit_manager() {
|
|
static dbghelp_syminit_manager syminit_manager;
|
|
return syminit_manager;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
#endif
|