blob: 8e2545b23e831479af0a7d04e216580b6ea990fe [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_DEVELOPER_DEBUG_ZXDB_SYMBOLS_SYSTEM_SYMBOLS_H_
#define SRC_DEVELOPER_DEBUG_ZXDB_SYMBOLS_SYSTEM_SYMBOLS_H_
#include <map>
#include <memory>
#include "lib/fit/function.h"
#include "src/developer/debug/zxdb/common/err.h"
#include "src/developer/debug/zxdb/symbols/build_id_index.h"
#include "src/developer/debug/zxdb/symbols/debug_symbol_file_type.h"
#include "src/lib/fxl/macros.h"
#include "src/lib/fxl/memory/ref_counted.h"
#include "src/lib/fxl/memory/weak_ptr.h"
namespace zxdb {
class ModuleSymbols;
// Tracks a global view of all ModuleSymbols objects. Since each object is independent of load
// address, we can share these between processes that load the same binary.
//
// This is an internal object but since there is no public API, there is no "Impl" split.
class SystemSymbols {
public:
// What kind of downloading should be attempted for missing symbols.
enum DownloadType {
kNone,
kSymbols,
kBinary,
};
class DownloadHandler {
public:
virtual void RequestDownload(const std::string& build_id, DebugSymbolFileType file_type,
bool quiet) = 0;
};
explicit SystemSymbols(DownloadHandler* download_handler);
~SystemSymbols();
BuildIDIndex& build_id_index() { return build_id_index_; }
// Whether to create index on ModuleSymbols. The index is used during symbol name to address
// lookups. If you don't need this feature, disabling it will accelerate the loading time.
void set_create_index(bool val) { create_index_ = val; }
// Set to true to fallback for symbol searching by looking for absolute module paths on the
// local system
void set_enable_local_fallback(bool enable) { enable_local_fallback_ = enable; }
// Injects a ModuleSymbols object for the given build ID. Used for testing. Normally the test
// would provide a dummy implementation for ModuleSymbols.
void InjectModuleForTesting(const std::string& build_id, ModuleSymbols* module);
// Retrieves the symbols for the module with the given name and build ID. If the module's symbols
// have already been loaded, just puts an owning reference into the given out param. If not, the
// symbols will be loaded.
//
// The build ID will be used if a match is found in the index. The name will only be used if
// local_fallback_ is set, in which case if the build ID is not found, the local filesystem will
// be checked for the module name. The name can be empty to disable this behavior.
//
// Missing symbols is not counted as an error, so *module will be empty even on success in this
// case. Errors will be from things like corrupted symbols. If a download is requested, downloads
// will be kicked off for any missing debug files in this case.
//
// This function uses the build_id for loading symbols. The name is only used for generating
// informational messages.
Err GetModule(const std::string& name, const std::string& build_id,
fxl::RefPtr<ModuleSymbols>* module, DownloadType download_type = kSymbols);
private:
// Saves the given module in the modules_ map and registers for its deletion.
void SaveModule(const std::string& build_id, ModuleSymbols* module);
DownloadHandler* download_handler_;
BuildIDIndex build_id_index_;
// Index from module build ID to a non-owning ModuleSymbols pointer. The ModuleSymbols will notify
// us when it's being deleted so the pointers stay up-to-date.
std::map<std::string, ModuleSymbols*> modules_;
bool create_index_ = true;
bool enable_local_fallback_ = false;
fxl::WeakPtrFactory<SystemSymbols> weak_factory_;
FXL_DISALLOW_COPY_AND_ASSIGN(SystemSymbols);
};
} // namespace zxdb
#endif // SRC_DEVELOPER_DEBUG_ZXDB_SYMBOLS_SYSTEM_SYMBOLS_H_