From 6854eb56e4906849e20f7e1a1017d4bf0cd6631b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9ophile=20Bastian?= Date: Wed, 16 May 2018 16:51:01 +0200 Subject: [PATCH] [BREAKING CHANGE] Unwinding stops at the end This introduces a breaking change: [undefined] was previously represented by 0, and is now represented by `numeric_limits::max()` --- src/CodeGenerator.cpp | 3 ++- stack_walker/stack_walker.cpp | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/CodeGenerator.cpp b/src/CodeGenerator.cpp index c1e2dc6..3fd43e1 100644 --- a/src/CodeGenerator.cpp +++ b/src/CodeGenerator.cpp @@ -3,6 +3,7 @@ #include "settings.hpp" #include +#include using namespace std; @@ -161,7 +162,7 @@ static const char* ctx_of_dw_name(SimpleDwarf::MachineRegister reg) { void CodeGenerator::gen_of_reg(const SimpleDwarf::DwRegister& reg) { switch(reg.type) { case SimpleDwarf::DwRegister::REG_UNDEFINED: - os << "0"; // FIXME do better? + os << std::numeric_limits::max() << "ull"; break; case SimpleDwarf::DwRegister::REG_REGISTER: os << ctx_of_dw_name(reg.reg) diff --git a/stack_walker/stack_walker.cpp b/stack_walker/stack_walker.cpp index 0d8f3ef..f8feece 100644 --- a/stack_walker/stack_walker.cpp +++ b/stack_walker/stack_walker.cpp @@ -224,6 +224,9 @@ bool unwind_context(unwind_context_t& ctx) { uintptr_t tr_pc = ctx.rip - mmap_entry->beg; ctx = fde_func(ctx, tr_pc); + + if(ctx.rbp == 0 || ctx.rip + 1 == 0) + return false; return true; }