diff options
Diffstat (limited to 'src/debug/createdump/dnetmemoryenumlib.cpp')
-rw-r--r-- | src/debug/createdump/dnetmemoryenumlib.cpp | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/src/debug/createdump/dnetmemoryenumlib.cpp b/src/debug/createdump/dnetmemoryenumlib.cpp new file mode 100644 index 0000000000..07e48e6787 --- /dev/null +++ b/src/debug/createdump/dnetmemoryenumlib.cpp @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <stdarg.h> +#include <iostream> +#include <vector> +#include "createdump.h" +#include "dnetmemoryenumlib.h" + +bool g_diagnostics = false; + +std::vector<SimpleMemoryRegion> sm_regions; + +static std::vector<SimpleMemoryRegion> +get_regions(CrashInfo *crashInfo) +{ + std::vector<SimpleMemoryRegion> reg_vec; + for (const MemoryRegion& memoryRegion : crashInfo->MemoryRegions()) { + if (memoryRegion.IsBackedByMemory()) { + reg_vec.push_back({memoryRegion.StartAddress(), memoryRegion.Size()}); + } + } + return reg_vec; +} + + +extern "C" int +DotNetMemoryEnumInit() +{ + int exitCode = PAL_InitializeDLL(); + return exitCode; +} + +extern "C" void +DotNetMemoryEnumFinish() +{ + PAL_TerminateEx(0); +} + +extern "C" int +DotNetMemoryEnumRegions(pid_t pid, elf_prstatus **statuses, int statuses_count, + DUMP_TYPE minidump_type, SimpleMemoryRegion **regions) +{ + g_diagnostics = true; + + std::vector<elf_prstatus*> stats; + for (int i = 0; i < statuses_count; i++) { + stats.push_back(statuses[i]); + } + + MINIDUMP_TYPE minidumpType; + + switch (minidump_type) { + case DT_NORMAL: + default: + minidumpType = MiniDumpNormal; + break; + case DT_WITH_PRIV_AND_SHARED_MEM: + minidumpType = MiniDumpWithPrivateReadWriteMemory; + break; + case DT_FULL: + minidumpType = MiniDumpWithFullMemory; + break; + } + + int exitCode = REGERR_OK; + + if (pid != 0) + { + ReleaseHolder<DumpDataTarget> dataTarget = new DumpDataTarget(pid); + ReleaseHolder<CrashInfo> crashInfo = new CrashInfo(pid, dataTarget, true); + + if (dataTarget->Initialize(crashInfo)) + { + if (!crashInfo->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(); + } + else + { + exitCode = REGERR_INITIALIZATION_ERROR; + } + } + else + { + exitCode = REGERR_WRONG_PID; + } + return exitCode; +} |