This change adds save-core functionality into the ObjectFileELF that enables saving minidump of a stopped process. This change is mainly targeting Linux running on x86_64 machines. Minidump should contain basic information needed to examine state of threads, local variables and stack traces. Full support for other platforms is not so far implemented. API tests are using LLDB's MinidumpParser. This relands commitaafa05e, reverted in1f986f6. Failed tests were fixed. Reviewed By: clayborg Differential Revision: https://reviews.llvm.org/D108233
92 lines
3.9 KiB
C++
92 lines
3.9 KiB
C++
//===-- 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
|