brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.1 KiB · e3938ad Raw
60 lines · cpp
1//===-- WindowsMiniDump.cpp -----------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// This function is separated out from ObjectFilePECOFF.cpp to name avoid name10// collisions with WinAPI preprocessor macros.11 12#include "WindowsMiniDump.h"13#include "lldb/Utility/FileSpec.h"14#include "llvm/Support/ConvertUTF.h"15 16#ifdef _WIN3217#include "lldb/Host/windows/windows.h"18#include <dbghelp.h>19#endif20 21namespace lldb_private {22 23bool SaveMiniDump(const lldb::ProcessSP &process_sp,24                  SaveCoreOptions &core_options, lldb_private::Status &error) {25  if (!process_sp)26    return false;27#ifdef _WIN3228  std::optional<FileSpec> outfileSpec = core_options.GetOutputFile();29  const auto &outfile = outfileSpec.value();30  HANDLE process_handle = ::OpenProcess(31      PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, process_sp->GetID());32  const std::string file_name = outfile.GetPath();33  std::wstring wide_name;34  wide_name.resize(file_name.size() + 1);35  char *result_ptr = reinterpret_cast<char *>(&wide_name[0]);36  const llvm::UTF8 *error_ptr = nullptr;37  if (!llvm::ConvertUTF8toWide(sizeof(wchar_t), file_name, result_ptr,38                               error_ptr)) {39    error = Status::FromErrorString("cannot convert file name");40    return false;41  }42  HANDLE file_handle =43      ::CreateFileW(wide_name.c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL,44                    CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);45  const auto result =46      ::MiniDumpWriteDump(process_handle, process_sp->GetID(), file_handle,47                          MiniDumpWithFullMemoryInfo, NULL, NULL, NULL);48  ::CloseHandle(file_handle);49  ::CloseHandle(process_handle);50  if (!result) {51    error = Status(::GetLastError(), lldb::eErrorTypeWin32);52    return false;53  }54  return true;55#endif56  return false;57}58 59} // namesapce lldb_private60