diff options
Diffstat (limited to 'lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.h')
| -rw-r--r-- | lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.h | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.h b/lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.h new file mode 100644 index 000000000000..f4017fb66384 --- /dev/null +++ b/lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.h @@ -0,0 +1,92 @@ +//===-- MinidumpFileBuilder.h ---------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +/// \file +/// Structure holding data neccessary for minidump file creation. +/// +/// The class MinidumpFileWriter is used to hold the data that will eventually +/// be dumped to the file. +//===----------------------------------------------------------------------===// + +#ifndef LLDB_SOURCE_PLUGINS_OBJECTFILE_MINIDUMP_MINIDUMPFILEBUILDER_H +#define LLDB_SOURCE_PLUGINS_OBJECTFILE_MINIDUMP_MINIDUMPFILEBUILDER_H + +#include <cstddef> + +#include "lldb/Target/Target.h" +#include "lldb/Utility/DataBufferHeap.h" +#include "lldb/Utility/Status.h" + +#include "llvm/Object/Minidump.h" + +// Write std::string to minidump in the UTF16 format(with null termination char) +// with the size(without null termination char) preceding the UTF16 string. +// Empty strings are also printed with zero length and just null termination +// char. +lldb_private::Status WriteString(const std::string &to_write, + lldb_private::DataBufferHeap *buffer); + +/// \class MinidumpFileBuilder +/// Minidump writer for Linux +/// +/// This class provides a Minidump writer that is able to +/// snapshot the current process state. For the whole time, it stores all +/// the data on heap. +class MinidumpFileBuilder { +public: + MinidumpFileBuilder() = default; + + MinidumpFileBuilder(const MinidumpFileBuilder &) = delete; + MinidumpFileBuilder &operator=(const MinidumpFileBuilder &) = delete; + + MinidumpFileBuilder(MinidumpFileBuilder &&other) = default; + MinidumpFileBuilder &operator=(MinidumpFileBuilder &&other) = default; + + ~MinidumpFileBuilder() = default; + + // Add SystemInfo stream, used for storing the most basic information + // about the system, platform etc... + lldb_private::Status AddSystemInfo(const llvm::Triple &target_triple); + // Add ModuleList stream, containing information about all loaded modules + // at the time of saving minidump. + lldb_private::Status AddModuleList(lldb_private::Target &target); + // Add ThreadList stream, containing information about all threads running + // at the moment of core saving. Contains information about thread + // contexts. + lldb_private::Status AddThreadList(const lldb::ProcessSP &process_sp); + // Add Exception stream, this contains information about the exception + // that stopped the process. In case no thread made exception it return + // failed status. + lldb_private::Status AddException(const lldb::ProcessSP &process_sp); + // Add MemoryList stream, containing dumps of important memory segments + lldb_private::Status AddMemoryList(const lldb::ProcessSP &process_sp); + // Add MiscInfo stream, mainly providing ProcessId + void AddMiscInfo(const lldb::ProcessSP &process_sp); + // Add informative files about a Linux process + void AddLinuxFileStreams(const lldb::ProcessSP &process_sp); + // Dump the prepared data into file. In case of the failure data are + // intact. + lldb_private::Status Dump(lldb::FileUP &core_file) const; + // Returns the current number of directories(streams) that have been so far + // created. This number of directories will be dumped when calling Dump() + size_t GetDirectoriesNum() const; + +private: + // Add directory of StreamType pointing to the current end of the prepared + // file with the specified size. + void AddDirectory(llvm::minidump::StreamType type, size_t stream_size); + size_t GetCurrentDataEndOffset() const; + + // Stores directories to later put them at the end of minidump file + std::vector<llvm::minidump::Directory> m_directories; + // Main data buffer consisting of data without the minidump header and + // directories + lldb_private::DataBufferHeap m_data; +}; + +#endif // LLDB_SOURCE_PLUGINS_OBJECTFILE_MINIDUMP_MINIDUMPFILEBUILDER_H |
