summaryrefslogtreecommitdiff
path: root/src/debug/createdump/dnetmemoryenumlib.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/debug/createdump/dnetmemoryenumlib.cpp')
-rw-r--r--src/debug/createdump/dnetmemoryenumlib.cpp108
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;
+}