Index: test/functionalities/register/TestRegisters.py
===================================================================
--- test/functionalities/register/TestRegisters.py	(revision 181090)
+++ test/functionalities/register/TestRegisters.py	(working copy)
@@ -2,7 +2,7 @@
 Test the 'register' command.
 """
 
-import os, time
+import os, sys, time
 import re
 import unittest2
 import lldb
@@ -13,6 +13,10 @@
 
     mydir = os.path.join("functionalities", "register")
 
+    def setUp(self):
+        TestBase.setUp(self)
+        self.has_teardown = False
+
     def test_register_commands(self):
         """Test commands related to registers, in particular vector registers."""
         if not self.getArchitecture() in ['i386', 'x86_64']:
@@ -51,6 +55,8 @@
 
     def common_setup(self):
         exe = os.path.join(os.getcwd(), "a.out")
+        self.log_file = exe + ".log"
+
         self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
 
         # Break in main().
@@ -62,10 +68,27 @@
         self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
             substrs = ['stopped', 'stop reason = breakpoint'])
 
+    # platform specific logging of the specified category
+    def log_enable(self, category):
+        self.platform = ""
+        if sys.platform.startswith("darwin"):
+            self.platform = "darwin"
+        if sys.platform.startswith("linux"):
+            self.platform = "linux"
+
+        if self.platform != "":
+            self.runCmd("log enable " + self.platform + " " + str(category) + " registers -v -f " + self.log_file, RUN_SUCCEEDED)
+            if not self.has_teardown:
+                self.has_teardown = True
+                self.addTearDownHook(lambda: os.remove(self.log_file))
+
     def register_commands(self):
         """Test commands related to registers, in particular vector registers."""
         self.common_setup()
 
+        # verify that logging does not assert
+        self.log_enable("registers")
+
         self.expect("register read -a", MISSING_EXPECTED_REGISTERS,
             substrs = ['registers were unavailable'], matching = False)
         self.runCmd("register read xmm0")
Index: source/Plugins/Process/POSIX/RegisterContextLinux_x86_64.cpp
===================================================================
--- source/Plugins/Process/POSIX/RegisterContextLinux_x86_64.cpp	(revision 181090)
+++ source/Plugins/Process/POSIX/RegisterContextLinux_x86_64.cpp	(working copy)
@@ -13,16 +13,16 @@
 #define GPR_OFFSET(regname)                                                 \
     (offsetof(GPR, regname))
 
-// Updates the Linux specific information (offset and size)
+// Update the Linux specific information (offset and size).
 #define UPDATE_GPR_INFO(reg)                                                \
 do {                                                                        \
-    m_register_infos[gpr_##reg].byte_size = sizeof(GPR::reg);               \
-    m_register_infos[gpr_##reg].byte_offset = GPR_OFFSET(reg);              \
+    GetRegisterInfo()[gpr_##reg].byte_size = sizeof(GPR::reg);               \
+    GetRegisterInfo()[gpr_##reg].byte_offset = GPR_OFFSET(reg);              \
 } while(false);
 
 #define UPDATE_I386_GPR_INFO(i386_reg, reg)                                 \
 do {                                                                        \
-    m_register_infos[gpr_##i386_reg].byte_offset = GPR_OFFSET(reg);         \
+    GetRegisterInfo()[gpr_##i386_reg].byte_offset = GPR_OFFSET(reg);         \
 } while(false);
 
 typedef struct _GPR
@@ -81,42 +81,20 @@
     uint64_t fault_address; // Control register CR3.
 };
 
-RegisterInfo *RegisterContextLinux_x86_64::m_register_infos = nullptr;
-
 RegisterContextLinux_x86_64::RegisterContextLinux_x86_64(Thread &thread, uint32_t concrete_frame_idx):
     RegisterContext_x86_64(thread, concrete_frame_idx)
 {
+    // Update the Linux specific register information (offset and size). 
+    if (GetRegisterInfo())
+        UpdateRegisterInfo();
 }
 
-RegisterContextLinux_x86_64::~RegisterContextLinux_x86_64()
-{
-    if (m_register_infos)
-        delete m_register_infos;
-    m_register_infos = nullptr;
-}
-
 size_t
 RegisterContextLinux_x86_64::GetGPRSize()
 {
     return sizeof(GPR);
 }
 
-const RegisterInfo *
-RegisterContextLinux_x86_64::GetRegisterInfo()
-{
-    // Allocate RegisterInfo only once
-    if (m_register_infos == nullptr)
-    {
-        m_register_infos = new RegisterInfo[k_num_registers];
-        // Copy the register information from base class
-        memcpy(m_register_infos, RegisterContext_x86_64::GetRegisterInfo(),
-               sizeof(RegisterInfo) * k_num_registers);
-        // Update the Linux specific register information(offset and size)
-        UpdateRegisterInfo();
-    }
-    return m_register_infos;
-}
-
 void
 RegisterContextLinux_x86_64::UpdateRegisterInfo()
 {
Index: source/Plugins/Process/POSIX/RegisterContextLinux_x86_64.h
===================================================================
--- source/Plugins/Process/POSIX/RegisterContextLinux_x86_64.h	(revision 181090)
+++ source/Plugins/Process/POSIX/RegisterContextLinux_x86_64.h	(working copy)
@@ -19,16 +19,10 @@
 {
 public:
     RegisterContextLinux_x86_64(Thread &thread, uint32_t concrete_frame_idx);
-    virtual ~RegisterContextLinux_x86_64();
 
     size_t GetGPRSize();
 
-protected:
-    virtual const lldb_private::RegisterInfo *
-    GetRegisterInfo();
-
 private:
-    static lldb_private::RegisterInfo *m_register_infos;
     void UpdateRegisterInfo();
 };
 
Index: source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.cpp
===================================================================
--- source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.cpp	(revision 181090)
+++ source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.cpp	(working copy)
@@ -13,16 +13,16 @@
 #define GPR_OFFSET(regname)                                                 \
     (offsetof(GPR, regname))
 
-// Updates the FreeBSD specific information (offset and size)
+// Update the FreeBSD specific information (offset and size).
 #define UPDATE_GPR_INFO(reg)                                                \
 do {                                                                        \
-    m_register_infos[gpr_##reg].byte_size = sizeof(GPR::reg);               \
-    m_register_infos[gpr_##reg].byte_offset = GPR_OFFSET(reg);              \
+    GetRegisterInfo()[gpr_##reg].byte_size = sizeof(GPR::reg);               \
+    GetRegisterInfo()[gpr_##reg].byte_offset = GPR_OFFSET(reg);              \
 } while(false);
 
 #define UPDATE_I386_GPR_INFO(i386_reg, reg)                                 \
 do {                                                                        \
-    m_register_infos[gpr_##i386_reg].byte_offset = GPR_OFFSET(reg);         \
+    GetRegisterInfo()[gpr_##i386_reg].byte_offset = GPR_OFFSET(reg);         \
 } while(false);
 
 typedef struct _GPR
@@ -55,42 +55,20 @@
     uint64_t ss;
 } GPR;
 
-RegisterInfo *RegisterContextFreeBSD_x86_64::m_register_infos = nullptr;
-
 RegisterContextFreeBSD_x86_64::RegisterContextFreeBSD_x86_64(Thread &thread, uint32_t concrete_frame_idx):
     RegisterContext_x86_64(thread, concrete_frame_idx)
 {
+    // Update the FreeBSD specific register information (offset and size). 
+    if (GetRegisterInfo())
+        UpdateRegisterInfo();
 }
 
-RegisterContextFreeBSD_x86_64::~RegisterContextFreeBSD_x86_64()
-{
-    if (m_register_infos)
-        delete m_register_infos;
-    m_register_infos = nullptr;
-}
-
 size_t
 RegisterContextFreeBSD_x86_64::GetGPRSize()
 {
     return sizeof(GPR);
 }
 
-const RegisterInfo *
-RegisterContextFreeBSD_x86_64::GetRegisterInfo()
-{
-    // Allocate RegisterInfo only once
-    if (m_register_infos == nullptr)
-    {
-        m_register_infos = new RegisterInfo[k_num_registers];
-        // Copy the register information from base class
-        memcpy(m_register_infos, RegisterContext_x86_64::GetRegisterInfo(),
-               sizeof(RegisterInfo) * k_num_registers);
-        // Update the FreeBSD specfic register information(offset and size)
-        UpdateRegisterInfo();
-    }
-    return m_register_infos;
-}
-
 void
 RegisterContextFreeBSD_x86_64::UpdateRegisterInfo()
 {
Index: source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.h
===================================================================
--- source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.h	(revision 181090)
+++ source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.h	(working copy)
@@ -19,16 +19,10 @@
 {
 public:
     RegisterContextFreeBSD_x86_64(Thread &thread, uint32_t concrete_frame_idx);
-    virtual ~RegisterContextFreeBSD_x86_64();
 
     size_t GetGPRSize();
 
-protected:
-    virtual const lldb_private::RegisterInfo *
-    GetRegisterInfo();
-
 private:
-    static lldb_private::RegisterInfo *m_register_infos;
     void UpdateRegisterInfo();
 };
 
Index: source/Plugins/Process/POSIX/RegisterContext_x86_64.cpp
===================================================================
--- source/Plugins/Process/POSIX/RegisterContext_x86_64.cpp	(revision 181090)
+++ source/Plugins/Process/POSIX/RegisterContext_x86_64.cpp	(working copy)
@@ -531,7 +531,7 @@
     return num_registers;
 }
 
-const RegisterInfo *
+RegisterInfo *
 RegisterContext_x86_64::GetRegisterInfo()
 {
     return m_register_infos;
Index: source/Plugins/Process/POSIX/RegisterContext_x86_64.h
===================================================================
--- source/Plugins/Process/POSIX/RegisterContext_x86_64.h	(revision 181090)
+++ source/Plugins/Process/POSIX/RegisterContext_x86_64.h	(working copy)
@@ -277,7 +277,7 @@
     virtual bool
     IsRegisterSetAvailable(size_t set_index);
 
-    virtual const lldb_private::RegisterInfo *
+    inline lldb_private::RegisterInfo *
     GetRegisterInfo();
 
 private:
