[Tizen] Add method to write coredump of .NET process (#317) accepted/tizen_6.0_unified_hotfix accepted/tizen/6.0/unified/20201030.104646 accepted/tizen/6.0/unified/hotfix/20201102.235357 accepted/tizen/unified/20201005.101320 submit/tizen/20201005.013439 submit/tizen_6.0/20201029.205501 submit/tizen_6.0_hotfix/20201102.192901 submit/tizen_6.0_hotfix/20201103.115101 tizen_6.0.m2_release
authorMateusz Moscicki/System (PLT) /SRPOL/Engineer/Samsung Electronics <m.moscicki2@partner.samsung.com>
Mon, 5 Oct 2020 01:33:40 +0000 (03:33 +0200)
committer이형주/Common Platform Lab(SR)/Staff Engineer/삼성전자 <leee.lee@samsung.com>
Mon, 5 Oct 2020 01:33:40 +0000 (10:33 +0900)
This method allows to create minimal coredump (as createdump does) of a
process that is in dumping state after crash.

src/debug/createdump/CMakeLists.txt
src/debug/createdump/dnetmemoryenumlib.cpp
src/debug/createdump/dnetmemoryenumlib.h

index 7063b57..9d99dc0 100644 (file)
@@ -33,6 +33,7 @@ set(DNETMEMORYENUM_SOURCES
     crashinfo.cpp
     threadinfo.cpp
     datatarget.cpp
+    dumpwriter.cpp
 )
 
 _add_library(createdump_lib
index 3e0dc5b..1c07881 100644 (file)
@@ -46,23 +46,9 @@ get_regions(CrashInfo *crashInfo)
     return reg_vec;
 }
 
-
-extern "C" DLLEXPORT int
-DotNetMemoryEnumInit()
-{
-    int exitCode = PAL_InitializeDLL();
-    return exitCode;
-}
-
-extern "C" DLLEXPORT void
-DotNetMemoryEnumFinish()
-{
-    PAL_TerminateEx(0);
-}
-
-extern "C" DLLEXPORT int
-DotNetMemoryEnumRegions(pid_t pid, elf_prstatus **statuses, int statuses_count,
-                        DUMP_TYPE minidump_type, SimpleMemoryRegion **regions)
+int
+prepare_crash_info(pid_t pid, elf_prstatus **statuses, int statuses_count,
+                        DUMP_TYPE minidump_type, ReleaseHolder<CrashInfo> &crash_info)
 {
     g_diagnostics = true;
 
@@ -91,19 +77,16 @@ DotNetMemoryEnumRegions(pid_t pid, elf_prstatus **statuses, int statuses_count,
     if (pid != 0)
     {
         ReleaseHolder<DumpDataTarget> dataTarget = new DumpDataTarget(pid);
-        ReleaseHolder<CrashInfo> crashInfo = new CrashInfo(pid, dataTarget, true);
+        crash_info = new CrashInfo(pid, dataTarget, true);
 
-        if (dataTarget->Initialize(crashInfo))
+        if (dataTarget->Initialize(crash_info))
         {
-            if (!crashInfo->EnumerateAndSuspendThreads(false))
+            if (!crash_info->EnumerateAndSuspendThreads(false))
             {
                 return REGERR_ENUMERATION_ERROR;
             }
-            crashInfo->SetThreadsRegisters(stats);
-            crashInfo->GatherCrashInfo(minidumpType, false);
-            sm_regions = get_regions(crashInfo);
-            *regions = sm_regions.data();
-            exitCode = sm_regions.size();
+            crash_info->SetThreadsRegisters(stats);
+            crash_info->GatherCrashInfo(minidumpType, false);
         }
         else
         {
@@ -116,3 +99,54 @@ DotNetMemoryEnumRegions(pid_t pid, elf_prstatus **statuses, int statuses_count,
     }
     return exitCode;
 }
+
+extern "C" DLLEXPORT int
+DotNetMemoryEnumInit()
+{
+    int exitCode = PAL_InitializeDLL();
+    return exitCode;
+}
+
+extern "C" DLLEXPORT void
+DotNetMemoryEnumFinish()
+{
+    PAL_TerminateEx(0);
+}
+
+extern "C" DLLEXPORT int
+DotNetMemoryEnumRegions(pid_t pid, elf_prstatus **statuses, int statuses_count,
+                        DUMP_TYPE minidump_type, SimpleMemoryRegion **regions)
+{
+    ReleaseHolder<CrashInfo> crashInfo;
+    int exitCode = prepare_crash_info(pid, statuses, statuses_count, minidump_type, crashInfo);
+
+    if (exitCode != REGERR_OK)
+        return exitCode;
+
+    sm_regions = get_regions(crashInfo);
+    *regions = sm_regions.data();
+    exitCode = sm_regions.size();
+
+    return exitCode;
+}
+
+extern "C" DLLEXPORT int
+DotNetMemoryWriteDump(pid_t pid, elf_prstatus **statuses, int statuses_count,
+                        DUMP_TYPE minidump_type, const char *dump_path)
+{
+    ReleaseHolder<CrashInfo> crashInfo;
+    int exitCode = prepare_crash_info(pid, statuses, statuses_count, minidump_type, crashInfo);
+
+    if (exitCode != REGERR_OK)
+        return exitCode;
+
+    ReleaseHolder<DumpWriter> dumpWriter = new DumpWriter(*crashInfo);
+
+    if (!dumpWriter->OpenDump(dump_path))
+        exitCode = REGERR_OPENDUMP_ERROR;
+
+    if (!dumpWriter->WriteDump())
+        exitCode = REGERR_WRITEDUMP_ERROR;
+
+    return exitCode;
+}
index 930d4f3..feb5c28 100644 (file)
@@ -45,11 +45,15 @@ enum REG_ERR {
     REGERR_OK = 0,
     REGERR_WRONG_PID = -1,
     REGERR_INITIALIZATION_ERROR = -2,
-    REGERR_ENUMERATION_ERROR = -3
+    REGERR_ENUMERATION_ERROR = -3,
+    REGERR_OPENDUMP_ERROR = -4,
+    REGERR_WRITEDUMP_ERROR = -5,
 };
 
 extern "C" DLLEXPORT int DotNetMemoryEnumRegions(pid_t pid, elf_prstatus **statuses, int statuses_count,
                                        DUMP_TYPE minidump_type,  SimpleMemoryRegion **regions);
+extern "C" DLLEXPORT int DotNetMemoryWriteDump(pid_t pid, elf_prstatus **statuses, int statuses_count,
+                                       DUMP_TYPE minidump_type,  const char *dump_path);
 extern "C" DLLEXPORT int DotNetMemoryEnumInit();
 extern "C" DLLEXPORT void DotNetMemoryEnumFinish();