CommonLib
Loading...
Searching...
No Matches
stack_frame_win32.h
Go to the documentation of this file.
1#pragma once
2
3#include <DbgHelp.h>
4#pragma comment(lib, "dbghelp.lib")
5
6#include <sstream>
7#include <string>
8
9#include "diag/stack_frame.h"
10#include "host/common.h"
11
12namespace hedgedev::csl::diag
13{
15 {
16 public:
17 void set_symbol_info(SYMBOL_INFO* in_symbol_info, uint64_t in_displacement)
18 {
19 if (!in_symbol_info)
20 return;
21
22 module_base = reinterpret_cast<void*>(in_symbol_info->ModBase);
23
24 symbol_info.address = reinterpret_cast<void*>(in_symbol_info->Address);
25
26 if (in_symbol_info->NameLen > 0)
27 symbol_info.name = std::string(in_symbol_info->Name, in_symbol_info->NameLen);
28
29 symbol_info.flags = in_symbol_info->Flags;
30 symbol_info.displacement = in_displacement;
31
32 m_has_symbol_info = true;
33 }
34
35 void set_line_info(IMAGEHLP_LINE* in_line_info)
36 {
37 if (!in_line_info)
38 return;
39
40 line_info.source_file_path = in_line_info->FileName;
41 line_info.address = reinterpret_cast<void*>(in_line_info->Address);
42 line_info.row = in_line_info->LineNumber;
43
44 m_has_line_info = true;
45 }
46
47 std::string str() const
48 {
49 std::stringstream result{};
50
51 const auto& module_path = get_module_path();
52
53 if (!module_path.empty())
54 result << module_path.filename().string() << '!';
55
56 if (!symbol_info.name.empty())
57 {
58 result << symbol_info.name;
59
60 if (symbol_info.displacement > 0)
61 result << '+' << ut::string::hex<std::string>(symbol_info.displacement, 2);
62 }
63 else
64 {
65 result << ut::string::hex<std::string>(size_t(program_counter));
66 }
67
68 return result.str();
69 }
70 };
71}
Definition stack_frame_win32.h:15
std::string str() const
Definition stack_frame_win32.h:47
void set_symbol_info(SYMBOL_INFO *in_symbol_info, uint64_t in_displacement)
Definition stack_frame_win32.h:17
void set_line_info(IMAGEHLP_LINE *in_line_info)
Definition stack_frame_win32.h:35
Definition stack_frame.h:11
bool m_has_line_info
Definition stack_frame.h:17
void * module_base
Definition stack_frame.h:21
bool m_has_symbol_info
Definition stack_frame.h:16