Enable stack traces on AArch64

Note that `//sandboxed_api/sandbox2:stack_trace_test` may still fail for
unrelated reasons, as we are linking libc statically, which is brittle. A
follow-up change will fix this.

PiperOrigin-RevId: 427175045
Change-Id: Ifb5ec2ac3d60f4bcc9708f26c834c83b75e769d7
This commit is contained in:
Christian Blichmann 2022-02-08 06:23:13 -08:00 committed by Copybara-Service
parent d76a0e959e
commit dc03c38df1
4 changed files with 10 additions and 10 deletions

View File

@ -286,9 +286,6 @@ absl::StatusOr<UnwindResult> StackTracePeer::LaunchLibunwindSandbox(
absl::StatusOr<std::vector<std::string>> GetStackTrace(const Regs* regs, absl::StatusOr<std::vector<std::string>> GetStackTrace(const Regs* regs,
const Mounts& mounts) { const Mounts& mounts) {
if constexpr (sapi::host_cpu::IsArm64()) {
return absl::UnavailableError("Stack traces unavailable on Aarch64");
}
if (absl::GetFlag(FLAGS_sandbox_disable_all_stack_traces)) { if (absl::GetFlag(FLAGS_sandbox_disable_all_stack_traces)) {
return absl::UnavailableError("Stacktraces disabled"); return absl::UnavailableError("Stacktraces disabled");
} }

View File

@ -62,6 +62,7 @@ cc_library(
"//sandboxed_api/util:raw_logging", "//sandboxed_api/util:raw_logging",
"//sandboxed_api/util:status", "//sandboxed_api/util:status",
"//sandboxed_api/util:strerror", "//sandboxed_api/util:strerror",
"@com_google_absl//absl/cleanup",
"@com_google_absl//absl/status:statusor", "@com_google_absl//absl/status:statusor",
"@com_google_absl//absl/strings", "@com_google_absl//absl/strings",
"@org_gnu_libunwind//:unwind-ptrace-wrapped", "@org_gnu_libunwind//:unwind-ptrace-wrapped",

View File

@ -30,6 +30,7 @@ add_library(sandbox2_unwind STATIC
) )
add_library(sandbox2::unwind ALIAS sandbox2_unwind) add_library(sandbox2::unwind ALIAS sandbox2_unwind)
target_link_libraries(sandbox2_unwind PRIVATE target_link_libraries(sandbox2_unwind PRIVATE
absl::cleanup
absl::statusor absl::statusor
absl::strings absl::strings
sandbox2::comms sandbox2::comms

View File

@ -19,11 +19,13 @@
#include <cstddef> #include <cstddef>
#include <cstdint> #include <cstdint>
#include <cstdio> #include <cstdio>
#include <cstdlib>
#include <map> #include <map>
#include <memory> #include <memory>
#include <string> #include <string>
#include <vector> #include <vector>
#include "absl/cleanup/cleanup.h"
#include "absl/status/statusor.h" #include "absl/status/statusor.h"
#include "absl/strings/match.h" #include "absl/strings/match.h"
#include "absl/strings/str_cat.h" #include "absl/strings/str_cat.h"
@ -55,21 +57,20 @@ std::string DemangleSymbol(const std::string& maybe_mangled) {
} }
absl::StatusOr<std::vector<uintptr_t>> RunLibUnwind(pid_t pid, int max_frames) { absl::StatusOr<std::vector<uintptr_t>> RunLibUnwind(pid_t pid, int max_frames) {
unw_cursor_t cursor;
static unw_addr_space_t as = static unw_addr_space_t as =
unw_create_addr_space(&_UPT_accessors, 0 /* byte order */); unw_create_addr_space(&_UPT_accessors, 0 /* byte order */);
if (as == nullptr) { if (as == nullptr) {
return absl::InternalError("unw_create_addr_space() failed"); return absl::InternalError("unw_create_addr_space() failed");
} }
std::unique_ptr<struct UPT_info, void (*)(void*)> ui( void* context = _UPT_create(pid);
reinterpret_cast<struct UPT_info*>(_UPT_create(pid)), _UPT_destroy); if (context == nullptr) {
if (ui == nullptr) {
return absl::InternalError("_UPT_create() failed"); return absl::InternalError("_UPT_create() failed");
} }
absl::Cleanup context_cleanup = [&context] { _UPT_destroy(context); };
int rc = unw_init_remote(&cursor, as, ui.get()); unw_cursor_t cursor;
if (rc < 0) { if (int rc = unw_init_remote(&cursor, as, context); rc < 0) {
// Could be UNW_EINVAL (8), UNW_EUNSPEC (1) or UNW_EBADREG (3). // Could be UNW_EINVAL (8), UNW_EUNSPEC (1) or UNW_EBADREG (3).
return absl::InternalError( return absl::InternalError(
absl::StrCat("unw_init_remote() failed with error ", rc)); absl::StrCat("unw_init_remote() failed with error ", rc));
@ -78,7 +79,7 @@ absl::StatusOr<std::vector<uintptr_t>> RunLibUnwind(pid_t pid, int max_frames) {
std::vector<uintptr_t> ips; std::vector<uintptr_t> ips;
for (int i = 0; i < max_frames; ++i) { for (int i = 0; i < max_frames; ++i) {
unw_word_t ip; unw_word_t ip;
rc = unw_get_reg(&cursor, UNW_REG_IP, &ip); int rc = unw_get_reg(&cursor, UNW_REG_IP, &ip);
if (rc < 0) { if (rc < 0) {
// Could be UNW_EUNSPEC or UNW_EBADREG. // Could be UNW_EUNSPEC or UNW_EBADREG.
SAPI_RAW_LOG(WARNING, "unw_get_reg() failed with error %d", rc); SAPI_RAW_LOG(WARNING, "unw_get_reg() failed with error %d", rc);