Index: source/Plugins/Process/Utility/RegisterContextLLDB.cpp
===================================================================
--- source/Plugins/Process/Utility/RegisterContextLLDB.cpp	(revision 183410)
+++ source/Plugins/Process/Utility/RegisterContextLLDB.cpp	(working copy)
@@ -17,6 +17,7 @@
 #include "lldb/Core/RegisterValue.h"
 #include "lldb/Core/Value.h"
 #include "lldb/Expression/DWARFExpression.h"
+#include "lldb/Symbol/DWARFCallFrameInfo.h"
 #include "lldb/Symbol/FuncUnwinders.h"
 #include "lldb/Symbol/Function.h"
 #include "lldb/Symbol/ObjectFile.h"
@@ -201,17 +202,14 @@
     }
 
 
-    addr_t cfa_regval;
+    addr_t cfa_regval = LLDB_INVALID_ADDRESS;
     if (!ReadGPRValue (row_register_kind, active_row->GetCFARegister(), cfa_regval))
     {
         m_frame_type = eNotAValidFrame;
         return;
     }
-    else
-    {
-    }
+
     cfa_offset = active_row->GetCFAOffset ();
-
     m_cfa = cfa_regval + cfa_offset;
 
     UnwindLogMsg ("cfa_regval = 0x%16.16" PRIx64 " (cfa_regval = 0x%16.16" PRIx64 ", cfa_offset = %i)", m_cfa, cfa_regval, cfa_offset);
@@ -322,7 +320,7 @@
             m_all_registers_available = false;
             m_current_offset = -1;
             m_current_offset_backed_up_one = -1;
-            addr_t cfa_regval;
+            addr_t cfa_regval = LLDB_INVALID_ADDRESS;
             int row_register_kind = m_full_unwind_plan_sp->GetRegisterKind ();
             UnwindPlan::RowSP row = m_full_unwind_plan_sp->GetRowForFunctionOffset(0);
             if (row.get())
@@ -429,7 +427,11 @@
         m_current_offset = m_current_pc.GetOffset() - m_start_pc.GetOffset();
         m_current_offset_backed_up_one = m_current_offset;
         if (decr_pc_and_recompute_addr_range && m_current_offset_backed_up_one > 0)
+        {
             m_current_offset_backed_up_one--;
+            if (m_sym_ctx_valid)
+                m_current_pc.SetOffset(m_current_pc.GetOffset() - 1);
+        }
     }
     else
     {
@@ -496,15 +498,15 @@
         return;
     }
 
-    addr_t cfa_regval;
+    addr_t cfa_regval = LLDB_INVALID_ADDRESS;
     if (!ReadGPRValue (row_register_kind, active_row->GetCFARegister(), cfa_regval))
     {
         UnwindLogMsg ("failed to get cfa reg %d/%d", row_register_kind, active_row->GetCFARegister());
         m_frame_type = eNotAValidFrame;
         return;
     }
+
     cfa_offset = active_row->GetCFAOffset ();
-
     m_cfa = cfa_regval + cfa_offset;
 
     UnwindLogMsg ("cfa_regval = 0x%16.16" PRIx64 " (cfa_regval = 0x%16.16" PRIx64 ", cfa_offset = %i)", m_cfa, cfa_regval, cfa_offset);
@@ -677,9 +679,24 @@
         func_unwinders_sp = pc_module_sp->GetObjectFile()->GetUnwindTable().GetFuncUnwindersContainingAddress (m_current_pc, m_sym_ctx);
     }
 
-    // No FuncUnwinders available for this pc, try using architectural default unwind.
+    // No FuncUnwinders available for this pc, try using the eh_frame information relative to the current PC,
+    // and finally fall back on the architectural default unwind.
     if (!func_unwinders_sp)
     {
+        DWARFCallFrameInfo *eh_frame = pc_module_sp && pc_module_sp->GetObjectFile() ? 
+            pc_module_sp->GetObjectFile()->GetUnwindTable().GetEHFrameInfo() : nullptr;
+
+        if (eh_frame && m_current_pc.IsValid())
+        {
+            unwind_plan_sp.reset (new UnwindPlan (lldb::eRegisterKindGeneric));
+            if (eh_frame->GetUnwindPlan (m_current_pc, *unwind_plan_sp))
+            {
+                m_frame_type = eSkipFrame; // no symbol context, but we can use eh_frame to get back on track.
+                return unwind_plan_sp;
+            }
+            else
+                unwind_plan_sp.reset();
+        }
         m_frame_type = eNormalFrame;
         return arch_default_unwind_plan_sp;
     }
@@ -1249,7 +1266,7 @@
                 }
                 m_registers.clear();
                 m_full_unwind_plan_sp = arch_default_unwind_plan_sp;
-                addr_t cfa_regval;
+                addr_t cfa_regval = LLDB_INVALID_ADDRESS;
                 if (ReadGPRValue (arch_default_unwind_plan_sp->GetRegisterKind(), active_row->GetCFARegister(), cfa_regval))
                 {
                     m_cfa = cfa_regval + active_row->GetCFAOffset ();
Index: test/functionalities/inferior-assert/TestInferiorAssert.py
===================================================================
--- test/functionalities/inferior-assert/TestInferiorAssert.py	(revision 183410)
+++ test/functionalities/inferior-assert/TestInferiorAssert.py	(working copy)
@@ -15,8 +15,6 @@
         self.buildDsym()
         self.inferior_asserting()
 
-    @skipIfGcc # avoid an xpass on the buildbots where libc was not built with -fomit-frame-pointer
-    @expectedFailureLinux # llvm.org/pr15671 - backtrace does not include the assert site
     def test_inferior_asserting_dwarf(self):
         """Test that lldb reliably catches the inferior asserting (command)."""
         self.buildDwarf()
@@ -45,8 +43,6 @@
         self.buildDsym()
         self.inferior_asserting_expr()
 
-    @skipIfGcc # avoid an xpass on the buildbots where libc was not built with -fomit-frame-pointer
-    @expectedFailureLinux # llvm.org/pr15671 - backtrace does not include the assert site
     def test_inferior_asserting_expr(self):
         """Test that the lldb expression interpreter can read from the inferior after asserting (command)."""
         self.buildDwarf()
@@ -58,8 +54,6 @@
         self.buildDsym()
         self.inferior_asserting_step()
 
-    @skipIfGcc # avoid an xpass on the buildbots where libc was not built with -fomit-frame-pointer
-    @expectedFailureLinux # llvm.org/pr15671 - backtrace does not include the assert site
     def test_inferior_asserting_step(self):
         """Test that lldb functions correctly after stepping through a call to assert()."""
         self.buildDwarf()
