blob: 4cf05f03307e52fd1564742e220f98dc60c9307a [file] [log] [blame] [edit]
// Copyright 2022 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.
#include "src/developer/debug/debug_agent/elf_utils.h"
#include <gtest/gtest.h>
#include "src/developer/debug/debug_agent/zircon_process_handle.h"
#include "src/developer/debug/ipc/records.h"
namespace debug_agent {
namespace {
void ValidateModules(const std::vector<debug_ipc::Module>& modules) {
// It should contain at least libc, libsyslog, libfdio, vdso and the main executable.
EXPECT_GT(modules.size(), 5u);
bool has_libc = false;
bool has_syslog = false;
for (const auto& module : modules) {
if (module.name == "libc.so") {
has_libc = true;
EXPECT_FALSE(module.build_id.empty());
}
if (module.name == "libsyslog.so") {
has_syslog = true;
EXPECT_FALSE(module.build_id.empty());
}
}
EXPECT_TRUE(has_libc);
EXPECT_TRUE(has_syslog);
}
TEST(ElfUtils, GetElfModulesForProcess) {
zx::process handle;
zx::process::self()->duplicate(ZX_RIGHT_SAME_RIGHTS, &handle);
ZirconProcessHandle self(std::move(handle));
uintptr_t dl_debug_addr;
ASSERT_EQ(ZX_OK, zx::process::self()->get_property(ZX_PROP_PROCESS_DEBUG_ADDR, &dl_debug_addr,
sizeof(dl_debug_addr)));
ValidateModules(GetElfModulesForProcess(self, dl_debug_addr));
}
TEST(ElfUtils, GetElfModulesForProcessNoDebugAddr) {
zx::process handle;
zx::process::self()->duplicate(ZX_RIGHT_SAME_RIGHTS, &handle);
ZirconProcessHandle self(std::move(handle));
ValidateModules(GetElfModulesForProcess(self, 0));
}
} // namespace
} // namespace debug_agent