e328673a30
The process_vm_read function is much faster than ptrace, but sometimes that will not work on a remote process. Modify the libunwindstack MemoryRemote object to figure out which one it can use. Wrote new unit test to verify this checking behavior. Modify libbacktrace so that the read from libunwind is used instead of using the default ptrace calls. Add some benchmarks to libbacktrace to compare the two different methods. Test: Ran unit tests libbacktrace/libunwindstack/debuggerd. Test: Ran debuggerd -b <SYSTEM_SERVER_PID> Test: Ran debuggerd -b <MEDIACODEC PID> Test: Ran debuggerd -b <RANDOM_PID> Test: Used crasher to create tombstones and verified stack data is Test: dumped properly. Change-Id: If75ca238289532dd8e1de430d569cabb2523380a
240 lines
5.1 KiB
Text
240 lines
5.1 KiB
Text
//
|
|
// Copyright (C) 2014 The Android Open Source Project
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
//
|
|
|
|
cc_defaults {
|
|
name: "libbacktrace_common",
|
|
|
|
cflags: [
|
|
"-Wall",
|
|
"-Werror",
|
|
],
|
|
|
|
// The latest clang (r230699) does not allow SP/PC to be declared in inline asm lists.
|
|
clang_cflags: ["-Wno-inline-asm"],
|
|
|
|
include_dirs: ["external/libunwind/include/tdep"],
|
|
|
|
|
|
target: {
|
|
darwin: {
|
|
enabled: false,
|
|
},
|
|
},
|
|
|
|
multilib: {
|
|
lib32: {
|
|
suffix: "32",
|
|
},
|
|
lib64: {
|
|
suffix: "64",
|
|
},
|
|
}
|
|
}
|
|
|
|
libbacktrace_sources = [
|
|
"Backtrace.cpp",
|
|
"BacktraceCurrent.cpp",
|
|
"BacktracePtrace.cpp",
|
|
"thread_utils.c",
|
|
"ThreadEntry.cpp",
|
|
"UnwindCurrent.cpp",
|
|
"UnwindMap.cpp",
|
|
"UnwindPtrace.cpp",
|
|
"UnwindStack.cpp",
|
|
"UnwindStackMap.cpp",
|
|
]
|
|
|
|
cc_library_headers {
|
|
name: "libbacktrace_headers",
|
|
vendor_available: true,
|
|
export_include_dirs: ["include"],
|
|
}
|
|
|
|
cc_library {
|
|
name: "libbacktrace",
|
|
vendor_available: false,
|
|
vndk: {
|
|
enabled: true,
|
|
support_system_process: true,
|
|
},
|
|
defaults: ["libbacktrace_common"],
|
|
host_supported: true,
|
|
|
|
cflags: [
|
|
"-Wexit-time-destructors",
|
|
],
|
|
|
|
srcs: [
|
|
"BacktraceMap.cpp",
|
|
],
|
|
|
|
export_include_dirs: ["include"],
|
|
|
|
target: {
|
|
darwin: {
|
|
enabled: true,
|
|
},
|
|
linux: {
|
|
srcs: libbacktrace_sources,
|
|
|
|
shared_libs: [
|
|
"libbase",
|
|
"liblog",
|
|
"libunwind",
|
|
"libunwindstack",
|
|
],
|
|
|
|
static_libs: ["libcutils"],
|
|
},
|
|
android: {
|
|
static_libs: ["libasync_safe"],
|
|
},
|
|
},
|
|
whole_static_libs: ["libdemangle"],
|
|
}
|
|
|
|
cc_library_shared {
|
|
name: "libbacktrace_test",
|
|
defaults: ["libbacktrace_common"],
|
|
host_supported: true,
|
|
strip: {
|
|
none: true,
|
|
},
|
|
cflags: ["-O0"],
|
|
srcs: ["backtrace_testlib.cpp"],
|
|
|
|
target: {
|
|
linux: {
|
|
shared_libs: [
|
|
"libunwind",
|
|
"libunwindstack",
|
|
],
|
|
},
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------------------
|
|
// The libbacktrace_offline static library.
|
|
//-------------------------------------------------------------------------
|
|
cc_library_static {
|
|
name: "libbacktrace_offline",
|
|
defaults: ["libbacktrace_common"],
|
|
host_supported: true,
|
|
srcs: ["BacktraceOffline.cpp"],
|
|
|
|
cflags: [
|
|
"-D__STDC_CONSTANT_MACROS",
|
|
"-D__STDC_LIMIT_MACROS",
|
|
"-D__STDC_FORMAT_MACROS",
|
|
],
|
|
|
|
header_libs: ["llvm-headers"],
|
|
|
|
// Use shared libraries so their headers get included during build.
|
|
shared_libs = [
|
|
"libbase",
|
|
"libunwind",
|
|
"libunwindstack",
|
|
"libziparchive",
|
|
],
|
|
}
|
|
|
|
//-------------------------------------------------------------------------
|
|
// The backtrace_test executable.
|
|
//-------------------------------------------------------------------------
|
|
cc_test {
|
|
name: "backtrace_test",
|
|
defaults: ["libbacktrace_common"],
|
|
host_supported: true,
|
|
srcs: [
|
|
"backtrace_offline_test.cpp",
|
|
"backtrace_test.cpp",
|
|
"GetPss.cpp",
|
|
"thread_utils.c",
|
|
],
|
|
|
|
cflags: [
|
|
"-fno-builtin",
|
|
"-O0",
|
|
"-g",
|
|
],
|
|
|
|
shared_libs: [
|
|
"libbacktrace_test",
|
|
"libbacktrace",
|
|
"libbase",
|
|
"libcutils",
|
|
"liblog",
|
|
"libunwind",
|
|
"libunwindstack",
|
|
],
|
|
|
|
group_static_libs: true,
|
|
|
|
// Statically link LLVMlibraries to remove dependency on llvm shared library.
|
|
static_libs = [
|
|
"libbacktrace_offline",
|
|
"libLLVMObject",
|
|
"libLLVMBitReader",
|
|
"libLLVMMC",
|
|
"libLLVMMCParser",
|
|
"libLLVMCore",
|
|
"libLLVMSupport",
|
|
|
|
"libziparchive",
|
|
"libz",
|
|
],
|
|
|
|
header_libs: ["llvm-headers"],
|
|
|
|
target: {
|
|
android: {
|
|
cflags: ["-DENABLE_PSS_TESTS"],
|
|
shared_libs: [
|
|
"libutils",
|
|
],
|
|
},
|
|
linux_glibc: {
|
|
host_ldlibs: [
|
|
"-lncurses",
|
|
],
|
|
static_libs: ["libutils"],
|
|
},
|
|
},
|
|
|
|
data: [
|
|
"testdata/arm/*",
|
|
"testdata/arm64/*",
|
|
"testdata/x86/*",
|
|
"testdata/x86_64/*",
|
|
],
|
|
}
|
|
|
|
cc_benchmark {
|
|
name: "backtrace_benchmarks",
|
|
defaults: ["libbacktrace_common"],
|
|
|
|
srcs: [
|
|
"backtrace_benchmarks.cpp",
|
|
"backtrace_read_benchmarks.cpp",
|
|
],
|
|
|
|
shared_libs: [
|
|
"libbacktrace",
|
|
"libbase",
|
|
"libunwindstack",
|
|
],
|
|
}
|