platform_system_core/debuggerd/Android.bp
Kalesh Singh a9ea7e5b8e debuggerd_client: also log errors to the dump file.
Dumping stack in ANR can fail, but error message is only printed
to logcat. To allow easier debugging of such cases we add the
error messages in the ANR file as well.

Also factor out some duplication, inline single-call functions to
their call sites, and make some of the lambdas clearer by only having
implicit state unrelated to their primary purpose in captures but
passing as arguments things they fundamentally need to do their job
(and actually adding some duplication for time_left() which was subtle
enough to fool me into thinking that we only needed one call of
set_timeout(), which I've renamed to update_timeout()).

Bug: 191172191
Test: Manual
Change-Id: I39a50ca5b72059bfeff48b010d3be44f19eb32fa
2021-06-29 11:59:14 -07:00

472 lines
10 KiB
Text

package {
default_applicable_licenses: ["Android-Apache-2.0"],
}
cc_defaults {
name: "debuggerd_defaults",
cflags: [
"-Wall",
"-Wextra",
"-Werror",
"-Wno-gcc-compat",
"-Wno-unused-argument",
"-Wno-unused-function",
"-Wno-nullability-completeness",
"-Os",
],
local_include_dirs: ["include"],
}
cc_library_headers {
name: "libdebuggerd_common_headers",
export_include_dirs: ["common/include"],
recovery_available: true,
vendor_ramdisk_available: true,
}
cc_library_shared {
name: "libtombstoned_client",
defaults: ["debuggerd_defaults"],
srcs: [
"tombstoned/tombstoned_client.cpp",
"util.cpp",
],
header_libs: ["libdebuggerd_common_headers"],
static_libs: [
"libasync_safe",
],
shared_libs: [
"libbase",
"libcutils",
],
export_header_lib_headers: ["libdebuggerd_common_headers"],
export_include_dirs: ["tombstoned/include"],
}
// Utility library to talk to tombstoned and get an output fd.
cc_library_static {
name: "libtombstoned_client_static",
defaults: ["debuggerd_defaults"],
recovery_available: true,
vendor_ramdisk_available: true,
srcs: [
"tombstoned/tombstoned_client.cpp",
"util.cpp",
],
header_libs: ["libdebuggerd_common_headers"],
whole_static_libs: [
"libasync_safe",
"libcutils",
"libbase",
],
export_header_lib_headers: ["libdebuggerd_common_headers"],
export_include_dirs: ["tombstoned/include"],
}
// Core implementation, linked into libdebuggerd_handler and the dynamic linker.
cc_library_static {
name: "libdebuggerd_handler_core",
defaults: ["debuggerd_defaults"],
recovery_available: true,
vendor_ramdisk_available: true,
srcs: ["handler/debuggerd_handler.cpp"],
header_libs: [
"libbase_headers",
"libdebuggerd_common_headers",
"bionic_libc_platform_headers",
],
whole_static_libs: [
"libasync_safe",
"libcutils",
"libdebuggerd",
],
export_header_lib_headers: ["libdebuggerd_common_headers"],
export_include_dirs: ["include"],
}
// Implementation with a no-op fallback.
cc_library_static {
name: "libdebuggerd_handler",
defaults: ["debuggerd_defaults"],
srcs: ["handler/debuggerd_fallback_nop.cpp"],
header_libs: ["bionic_libc_platform_headers"],
export_header_lib_headers: ["bionic_libc_platform_headers"],
whole_static_libs: [
"libdebuggerd_handler_core",
],
export_include_dirs: ["include"],
}
// Fallback implementation, for use in the Bionic linker only.
cc_library_static {
name: "libdebuggerd_handler_fallback",
visibility: ["//bionic/linker"],
apex_available: [
"com.android.runtime",
"//apex_available:platform",
],
defaults: ["debuggerd_defaults"],
recovery_available: true,
vendor_ramdisk_available: true,
srcs: [
"handler/debuggerd_fallback.cpp",
],
whole_static_libs: [
"libdebuggerd_handler_core",
"libtombstoned_client_static",
"libasync_safe",
"libbase",
"libdebuggerd",
"libunwindstack_no_dex",
"liblzma",
"libcutils",
],
header_libs: ["bionic_libc_platform_headers"],
export_header_lib_headers: ["bionic_libc_platform_headers"],
export_include_dirs: ["include"],
}
cc_library {
name: "libdebuggerd_client",
defaults: ["debuggerd_defaults"],
srcs: [
"client/debuggerd_client.cpp",
"util.cpp",
],
shared_libs: [
"libbase",
"libcutils",
"libprocinfo",
],
header_libs: [
"libdebuggerd_common_headers",
"bionic_libc_platform_headers",
],
export_header_lib_headers: [
"libdebuggerd_common_headers",
"bionic_libc_platform_headers",
],
export_include_dirs: ["include"],
}
cc_library_static {
name: "libdebuggerd",
defaults: ["debuggerd_defaults"],
recovery_available: true,
vendor_ramdisk_available: true,
srcs: [
"libdebuggerd/backtrace.cpp",
"libdebuggerd/gwp_asan.cpp",
"libdebuggerd/open_files_list.cpp",
"libdebuggerd/scudo.cpp",
"libdebuggerd/tombstone.cpp",
"libdebuggerd/tombstone_proto.cpp",
"libdebuggerd/tombstone_proto_to_text.cpp",
"libdebuggerd/utility.cpp",
],
local_include_dirs: ["libdebuggerd/include"],
export_include_dirs: ["libdebuggerd/include"],
include_dirs: [
// Needed for private/bionic_fdsan.h
"bionic/libc",
// Needed for scudo/interface.h
"external/scudo/standalone/include",
],
header_libs: [
"bionic_libc_platform_headers",
"gwp_asan_headers",
],
static_libs: [
"libdexfile_support", // libunwindstack dependency
"libunwindstack",
"liblzma",
"libbase",
"libcutils",
"liblog",
],
whole_static_libs: [
"libasync_safe",
"gwp_asan_crash_handler",
"libscudo",
"libtombstone_proto",
"libprocinfo",
"libprotobuf-cpp-lite",
],
target: {
recovery: {
exclude_static_libs: [
"libdexfile_support",
],
},
vendor_ramdisk: {
exclude_static_libs: [
"libdexfile_support",
],
},
},
product_variables: {
debuggable: {
cflags: ["-DROOT_POSSIBLE"],
},
},
}
cc_binary {
name: "pbtombstone",
defaults: ["debuggerd_defaults"],
srcs: ["pbtombstone.cpp"],
static_libs: [
"libbase",
"libdebuggerd",
"liblog",
"libprotobuf-cpp-lite",
"libtombstone_proto",
"libunwindstack",
],
}
cc_test_library {
name: "libcrash_test",
defaults: ["debuggerd_defaults"],
srcs: ["crash_test.cpp"],
}
cc_test {
name: "debuggerd_test",
defaults: ["debuggerd_defaults"],
require_root: true,
cflags: ["-Wno-missing-field-initializers"],
srcs: [
"libdebuggerd/test/dump_memory_test.cpp",
"libdebuggerd/test/elf_fake.cpp",
"libdebuggerd/test/log_fake.cpp",
"libdebuggerd/test/open_files_list_test.cpp",
"libdebuggerd/test/tombstone_test.cpp",
],
target: {
android: {
srcs: [
"client/debuggerd_client_test.cpp",
"debuggerd_test.cpp",
],
static_libs: [
"libasync_safe",
"libtombstoned_client_static",
],
},
},
shared_libs: [
"libbase",
"libcutils",
"libdebuggerd_client",
"liblog",
"libnativehelper",
"libunwindstack",
],
static_libs: [
"libdebuggerd",
"libgmock",
"libminijail",
],
header_libs: [
"bionic_libc_platform_headers",
"gwp_asan_headers",
],
include_dirs: [
"external/scudo/standalone/include",
],
local_include_dirs: [
"libdebuggerd",
],
compile_multilib: "both",
multilib: {
lib32: {
stem: "debuggerd_test32",
},
lib64: {
stem: "debuggerd_test64",
},
},
data: [
":libcrash_test",
],
test_suites: ["device-tests"],
}
cc_benchmark {
name: "debuggerd_benchmark",
defaults: ["debuggerd_defaults"],
srcs: ["debuggerd_benchmark.cpp"],
shared_libs: [
"libbase",
"libdebuggerd_client",
],
}
cc_binary {
name: "crash_dump",
srcs: [
"crash_dump.cpp",
"util.cpp",
],
defaults: ["debuggerd_defaults"],
compile_multilib: "both",
multilib: {
lib32: {
suffix: "32",
},
lib64: {
suffix: "64",
},
},
header_libs: [
"bionic_libc_platform_headers",
],
static_libs: [
"libtombstoned_client_static",
"libdebuggerd",
"libcutils",
"libtombstone_proto",
"libprotobuf-cpp-lite",
],
shared_libs: [
"libbase",
"liblog",
"libprocinfo",
"libunwindstack",
],
apex_available: [
"com.android.runtime",
],
}
cc_binary {
name: "debuggerd",
srcs: [
"debuggerd.cpp",
],
defaults: ["debuggerd_defaults"],
shared_libs: [
"libbase",
"libdebuggerd_client",
"liblog",
"libprocinfo",
],
local_include_dirs: ["include"],
}
cc_binary {
name: "tombstoned",
srcs: [
"util.cpp",
"tombstoned/intercept_manager.cpp",
"tombstoned/tombstoned.cpp",
],
defaults: ["debuggerd_defaults"],
header_libs: [
"bionic_libc_platform_headers",
"libdebuggerd_common_headers"
],
static_libs: [
"libbase",
"libcutils",
"libevent",
"liblog",
],
init_rc: ["tombstoned/tombstoned.rc"],
}
prebuilt_etc {
name: "crash_dump.policy",
sub_dir: "seccomp_policy",
filename_from_src: true,
arch: {
arm: {
src: "seccomp_policy/crash_dump.arm.policy",
},
arm64: {
src: "seccomp_policy/crash_dump.arm64.policy",
},
x86: {
src: "seccomp_policy/crash_dump.x86.policy",
},
x86_64: {
src: "seccomp_policy/crash_dump.x86_64.policy",
},
},
required: [
"crash_dump.policy_other",
],
}
// NB -- this installs "the other" architecture. (puts 32 bit config in on 64 bit device)
// or at least that is the intention so that we get both of them populated
prebuilt_etc {
name: "crash_dump.policy_other",
sub_dir: "seccomp_policy",
filename_from_src: true,
arch: {
arm: {
src: "seccomp_policy/crash_dump.arm64.policy",
},
arm64: {
src: "seccomp_policy/crash_dump.arm.policy",
},
x86: {
src: "seccomp_policy/crash_dump.x86_64.policy",
},
x86_64: {
src: "seccomp_policy/crash_dump.x86.policy",
},
},
}