[Tizen] Use PTRACE_GETREGSET for any arch when creating dump
authorSwift Kim <swift.kim@samsung.com>
Mon, 18 Nov 2019 07:38:56 +0000 (16:38 +0900)
committerGleb Balykov <g.balykov@samsung.com>
Wed, 25 Mar 2020 12:29:41 +0000 (15:29 +0300)
Also ignore ptrace NT_FPREGSET failures for arm processes on aarch64
kernels. Fixes #25707.

src/debug/createdump/threadinfo.cpp

index 8af7647..685f9e6 100644 (file)
@@ -198,7 +198,6 @@ ThreadInfo::UnwindThread(CrashInfo& crashInfo, IXCLRDataProcess* pClrDataProcess
 bool 
 ThreadInfo::GetRegistersWithPTrace()
 {
-#if defined(__aarch64__)
     struct iovec gpRegsVec = { &m_gpRegisters, sizeof(m_gpRegisters) };
     if (ptrace((__ptrace_request)PTRACE_GETREGSET, m_tid, NT_PRSTATUS, &gpRegsVec) == -1)
     {
@@ -210,21 +209,15 @@ ThreadInfo::GetRegistersWithPTrace()
     struct iovec fpRegsVec = { &m_fpRegisters, sizeof(m_fpRegisters) };
     if (ptrace((__ptrace_request)PTRACE_GETREGSET, m_tid, NT_FPREGSET, &fpRegsVec) == -1)
     {
+#if defined(__arm__)
+        // Some aarch64 kernels may not support NT_FPREGSET for arm processes. We treat this failure as non-fatal.
+#else
         fprintf(stderr, "ptrace(PTRACE_GETREGSET, %d, NT_FPREGSET) FAILED %d (%s)\n", m_tid, errno, strerror(errno));
         return false;
+#endif
     }
     assert(sizeof(m_fpRegisters) == fpRegsVec.iov_len);
-#else
-    if (ptrace((__ptrace_request)PTRACE_GETREGS, m_tid, nullptr, &m_gpRegisters) == -1)
-    {
-        fprintf(stderr, "ptrace(GETREGS, %d) FAILED %d (%s)\n", m_tid, errno, strerror(errno));
-        return false;
-    }
-    if (ptrace((__ptrace_request)PTRACE_GETFPREGS, m_tid, nullptr, &m_fpRegisters) == -1)
-    {
-        fprintf(stderr, "ptrace(GETFPREGS, %d) FAILED %d (%s)\n", m_tid, errno, strerror(errno));
-        return false;
-    }
+
 #if defined(__i386__)
     if (ptrace((__ptrace_request)PTRACE_GETFPXREGS, m_tid, nullptr, &m_fpxRegisters) == -1)
     {
@@ -243,7 +236,6 @@ ThreadInfo::GetRegistersWithPTrace()
         return false;
     }
 #endif
-#endif
     return true;
 }
 void ThreadInfo::SetRegisters(elf_prstatus *prstatus)