Skip to content

Commit 93ff42c

Browse files
committed
VM (new pixeltower): 堆栈打印
1 parent 566e471 commit 93ff42c

2 files changed

Lines changed: 16 additions & 55 deletions

File tree

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
#ifndef OM_PIXELTOWER_TRACING_HPP
22
#define OM_PIXELTOWER_TRACING_HPP
3-
4-
#include <map>
53
#include <string>
64
namespace openminecraft::vm::pixeltower::v1::tracing
75
{
8-
extern std::map<std::string, void *> registers;
96
void installHandler();
7+
8+
struct OMTracingFrame
9+
{
10+
void *location;
11+
std::string name;
12+
};
1013
} // namespace openminecraft::vm::pixeltower::v1::tracing
1114

1215
#endif

plat/unix/vm/om_pixeltower_tracing.cpp

Lines changed: 10 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,30 @@
11
#include "openminecraft/vm/pixeltower/v1/om_pixeltower_tracing.hpp"
2+
#include "boost/stacktrace/stacktrace.hpp"
23
#include "openminecraft/log/om_log_common.hpp"
34
#include "sys/signal.h"
45
#include <csignal>
56
#include <sys/ucontext.h>
67
#include <unistd.h>
8+
#include <vector>
79

810
namespace openminecraft::vm::pixeltower::v1::tracing
911
{
10-
std::map<std::string, void *> registers;
11-
1212
static void crash_handler(int sig, siginfo_t *info, void *context)
1313
{
1414
ucontext_t *const uc = (ucontext_t *)context;
1515
log::OMLogger l("Crash Handler");
1616
l.info("errno: {}, signo: {}, code: {}, {}", info->si_errno, info->si_signo, info->si_code, getpid());
1717

18-
void *pc = nullptr;
19-
20-
#ifdef __x86_64__
21-
#if defined(__APPLE__)
22-
pc = (void *)uc->uc_mcontext->__ss.__rip;
23-
#define storeReg(n, idx) registers[n] = (void *)uc->uc_mcontext->__ss.__##idx;
24-
storeReg("r8", r8);
25-
storeReg("r9", r9);
26-
storeReg("r10", r10);
27-
storeReg("r11", r11);
28-
storeReg("r12", r12);
29-
storeReg("r13", r13);
30-
storeReg("r14", r14);
31-
storeReg("r15", r15);
32-
storeReg("rdi", rdi);
33-
storeReg("rsi", rsi);
34-
storeReg("rbp", rbp);
35-
storeReg("rbx", rbx);
36-
storeReg("rdx", rdx);
37-
storeReg("rax", rax);
38-
storeReg("rcx", rcx);
39-
storeReg("rsp", rsp);
40-
41-
#elif defined(OM_PLATFORM_BSD)
42-
pc = (void *)uc->uc_mcontext->context_pc;
43-
#else
44-
pc = (void *)uc->uc_mcontext.gregs[REG_RIP];
45-
#define storeReg(n, idx) registers[n] = (void *)uc->uc_mcontext.gregs[REG_##idx];
46-
storeReg("r8", R8);
47-
storeReg("r9", R9);
48-
storeReg("r10", R10);
49-
storeReg("r11", R11);
50-
storeReg("r12", R12);
51-
storeReg("r13", R13);
52-
storeReg("r14", R14);
53-
storeReg("r15", R15);
54-
storeReg("rdi", RDI);
55-
storeReg("rsi", RSI);
56-
storeReg("rbp", RBP);
57-
storeReg("rbx", RBX);
58-
storeReg("rdx", RDX);
59-
storeReg("rax", RAX);
60-
storeReg("rcx", RCX);
61-
storeReg("rsp", RSP);
62-
#endif
63-
#endif
64-
65-
registers["pc"] = pc;
18+
std::vector<OMTracingFrame> frames;
19+
boost::stacktrace::stacktrace s;
20+
for (auto f : s)
21+
{
22+
frames.push_back(OMTracingFrame{(void *)f.address(), f.name()});
23+
}
6624

67-
for (auto regs : registers)
25+
for (auto &ff : frames)
6826
{
69-
l.info("{}: {}", regs.first, regs.second);
27+
l.info("{} @ {}", ff.location, ff.name);
7028
}
7129

7230
raise(SIGKILL);

0 commit comments

Comments
 (0)