diff options
author | Mateusz Moscicki/System (PLT) /SRPOL/Engineer/Samsung Electronics <m.moscicki2@partner.samsung.com> | 2020-10-05 03:33:40 +0200 |
---|---|---|
committer | 이형주/Common Platform Lab(SR)/Staff Engineer/삼성전자 <leee.lee@samsung.com> | 2020-10-05 10:33:40 +0900 |
commit | 66a3b803910b389de38703ce349695a247146f5b (patch) | |
tree | 3bd61ade95c85c87122c41f44acd1e65d9822e84 | |
parent | 333691b8e3d7da54d9b90d5547a55d101db5edb3 (diff) | |
download | coreclr-66a3b803910b389de38703ce349695a247146f5b.tar.gz coreclr-66a3b803910b389de38703ce349695a247146f5b.tar.bz2 coreclr-66a3b803910b389de38703ce349695a247146f5b.zip |
[Tizen] Add method to write coredump of .NET process (#317)tizen_6.0.m2_releasesubmit/tizen_6.0_hotfix/20201103.115101submit/tizen_6.0_hotfix/20201102.192901submit/tizen_6.0/20201029.205501submit/tizen/20201005.013439accepted/tizen/unified/20201005.101320accepted/tizen/6.0/unified/hotfix/20201102.235357accepted/tizen/6.0/unified/20201030.104646accepted/tizen_6.0_unified_hotfix
This method allows to create minimal coredump (as createdump does) of a
process that is in dumping state after crash.
-rw-r--r-- | src/debug/createdump/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/debug/createdump/dnetmemoryenumlib.cpp | 84 | ||||
-rw-r--r-- | src/debug/createdump/dnetmemoryenumlib.h | 6 |
3 files changed, 65 insertions, 26 deletions
diff --git a/src/debug/createdump/CMakeLists.txt b/src/debug/createdump/CMakeLists.txt index 7063b57c93..9d99dc0ef0 100644 --- a/src/debug/createdump/CMakeLists.txt +++ b/src/debug/createdump/CMakeLists.txt @@ -33,6 +33,7 @@ set(DNETMEMORYENUM_SOURCES crashinfo.cpp threadinfo.cpp datatarget.cpp + dumpwriter.cpp ) _add_library(createdump_lib diff --git a/src/debug/createdump/dnetmemoryenumlib.cpp b/src/debug/createdump/dnetmemoryenumlib.cpp index 3e0dc5bb58..1c07881804 100644 --- a/src/debug/createdump/dnetmemoryenumlib.cpp +++ b/src/debug/createdump/dnetmemoryenumlib.cpp @@ -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; +} diff --git a/src/debug/createdump/dnetmemoryenumlib.h b/src/debug/createdump/dnetmemoryenumlib.h index 930d4f33c5..feb5c28178 100644 --- a/src/debug/createdump/dnetmemoryenumlib.h +++ b/src/debug/createdump/dnetmemoryenumlib.h @@ -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(); |