Commit 63025489 authored by Rohit Rao's avatar Rohit Rao Committed by Commit Bot

Update Crashpad to bd1aa246ca185519dea0af1c5ca11656c41b0c80

6dadd492b890 linux: fix proc stat reader flakiness
bd1aa246ca18 Starts compiling the crashpad_test_test target on iOS

Change-Id: Iad63f52106c16084d0408b425da0a9ef89cb94a9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1904307Reviewed-by: default avatarMark Mentovai <mark@chromium.org>
Commit-Queue: Rohit Rao <rohitrao@chromium.org>
Cr-Commit-Position: refs/heads/master@{#713579}
parent 265431e0
......@@ -2,7 +2,7 @@ Name: Crashpad
Short Name: crashpad
URL: https://crashpad.chromium.org/
Version: unknown
Revision: 27322abb7ec40f46020f93b3814c19f77ea2ccfb
Revision: bd1aa246ca185519dea0af1c5ca11656c41b0c80
License: Apache 2.0
License File: crashpad/LICENSE
Security Critical: yes
......
......@@ -23,14 +23,18 @@ config("crashpad_config") {
if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) {
test("crashpad_tests") {
deps = [
"client:client_test",
"handler:handler_test",
"minidump:minidump_test",
"snapshot:snapshot_test",
"test:gmock_main",
"test:test_test",
"util:util_test",
]
if (!crashpad_is_ios) {
deps += [
"client:client_test",
"handler:handler_test",
"minidump:minidump_test",
"snapshot:snapshot_test",
"util:util_test",
]
}
}
if (crashpad_is_in_fuchsia) {
......@@ -135,6 +139,9 @@ if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) {
"client:client_test",
"test:gmock_main",
]
if (crashpad_is_ios) {
deps -= [ "client:client_test" ]
}
}
test("crashpad_handler_test") {
......@@ -142,6 +149,9 @@ if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) {
"handler:handler_test",
"test:gtest_main",
]
if (crashpad_is_ios) {
deps -= [ "handler:handler_test" ]
}
}
test("crashpad_minidump_test") {
......@@ -149,6 +159,9 @@ if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) {
"minidump:minidump_test",
"test:gtest_main",
]
if (crashpad_is_ios) {
deps -= [ "minidump:minidump_test" ]
}
}
test("crashpad_snapshot_test") {
......@@ -156,6 +169,9 @@ if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) {
"snapshot:snapshot_test",
"test:gtest_main",
]
if (crashpad_is_ios) {
deps -= [ "snapshot:snapshot_test" ]
}
}
test("crashpad_test_test") {
......@@ -170,5 +186,8 @@ if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) {
"test:gmock_main",
"util:util_test",
]
if (crashpad_is_ios) {
deps -= [ "util:util_test" ]
}
}
}
......@@ -33,7 +33,7 @@ deps = {
'8048ece6c16c91acfe0d36d1d3cc0890ab6e945c',
'crashpad/third_party/mini_chromium/mini_chromium':
Var('chromium_git') + '/chromium/mini_chromium@' +
'2298dbe9d0b3213720ac0e5418ad0013a19aeb5d',
'cdab1e6263ec7f3f61763efc1dac863f8dc07c80',
'crashpad/third_party/libfuzzer/src':
Var('chromium_git') + '/chromium/llvm-project/compiler-rt/lib/fuzzer.git@' +
'fda403cf93ecb8792cb1d061564d89a6553ca020',
......
......@@ -45,7 +45,26 @@ config("crashpad_fuzzer_flags") {
"-fsanitize=fuzzer",
]
ldflags = [
"-fsanitize=address",
]
ldflags = [ "-fsanitize=address" ]
}
if (crashpad_is_ios) {
group("ios_enable_arc") {
if (crashpad_is_in_chromium) {
public_configs = [ "//build/config/compiler:enable_arc" ]
} else if (crashpad_is_standalone) {
public_configs =
[ "//third_party/mini_chromium/mini_chromium/build:ios_enable_arc" ]
}
}
group("ios_xctest") {
if (crashpad_is_in_chromium) {
public_configs = [ "//build/config/ios:xctest_config" ]
} else if (crashpad_is_standalone) {
public_configs = [
"//third_party/mini_chromium/mini_chromium/build/ios:xctest_config",
]
}
}
}
......@@ -23,11 +23,10 @@ declare_args() {
}
}
assert(crashpad_dependencies == "chromium" ||
crashpad_dependencies == "fuchsia" ||
crashpad_dependencies == "standalone" ||
crashpad_dependencies == "external" ||
crashpad_dependencies == "dart")
assert(
crashpad_dependencies == "chromium" || crashpad_dependencies == "fuchsia" ||
crashpad_dependencies == "standalone" ||
crashpad_dependencies == "external" || crashpad_dependencies == "dart")
crashpad_is_in_chromium = crashpad_dependencies == "chromium"
crashpad_is_in_fuchsia = crashpad_dependencies == "fuchsia"
......@@ -37,6 +36,7 @@ crashpad_is_standalone = crashpad_dependencies == "standalone"
if (crashpad_is_in_chromium) {
crashpad_is_mac = is_mac
crashpad_is_ios = is_ios
crashpad_is_win = is_win
crashpad_is_linux = is_linux
crashpad_is_android = is_android
......@@ -57,6 +57,7 @@ if (crashpad_is_in_chromium) {
import("../third_party/mini_chromium/mini_chromium/build/platform.gni")
}
crashpad_is_mac = mini_chromium_is_mac
crashpad_is_ios = mini_chromium_is_ios
crashpad_is_win = mini_chromium_is_win
crashpad_is_linux = mini_chromium_is_linux
crashpad_is_android = mini_chromium_is_android
......
......@@ -43,13 +43,36 @@ static_library("test") {
"test_paths.h",
]
if (crashpad_is_ios) {
sources -= [
"errors.cc",
"errors.h",
"file.cc",
"file.h",
"filesystem.cc",
"filesystem.h",
"multiprocess.h",
"multiprocess_exec.cc",
"multiprocess_exec.h",
"process_type.cc",
"process_type.h",
"scoped_guarded_page.h",
"scoped_module_handle.cc",
"scoped_module_handle.h",
"scoped_temp_dir.cc",
"scoped_temp_dir.h",
"test_paths.cc",
"test_paths.h",
]
}
if (crashpad_is_posix || crashpad_is_fuchsia) {
sources += [
"scoped_guarded_page_posix.cc",
"scoped_temp_dir_posix.cc",
]
if (!crashpad_is_fuchsia) {
if (!crashpad_is_fuchsia && !crashpad_is_ios) {
sources += [
"multiprocess_exec_posix.cc",
"multiprocess_posix.cc",
......@@ -118,6 +141,13 @@ static_library("test") {
"../util",
]
if (crashpad_is_ios) {
deps -= [
"../compat",
"../util",
]
}
if (crashpad_is_mac) {
libs = [ "bsm" ]
deps += [
......@@ -152,9 +182,18 @@ source_set("test_test") {
"test_paths_test.cc",
]
if (crashpad_is_ios) {
sources -= [
"multiprocess_exec_test.cc",
"scoped_guarded_page_test.cc",
"scoped_temp_dir_test.cc",
"test_paths_test.cc",
]
}
# TODO(crbug.com/812974): Remove !crashpad_is_fuchsia when Fuchsia is no
# longer treated as a posix platform.
if (crashpad_is_posix && !crashpad_is_fuchsia) {
if (crashpad_is_posix && !crashpad_is_fuchsia && !crashpad_is_ios) {
sources += [ "multiprocess_posix_test.cc" ]
}
......@@ -181,16 +220,27 @@ source_set("test_test") {
data_deps = [
":crashpad_test_test_multiprocess_exec_test_child",
]
if (crashpad_is_ios) {
deps -= [
"../compat",
"../util",
]
data_deps -= [ ":crashpad_test_test_multiprocess_exec_test_child" ]
}
}
crashpad_executable("crashpad_test_test_multiprocess_exec_test_child") {
sources = [
"multiprocess_exec_test_child.cc",
]
if (!crashpad_is_ios) {
crashpad_executable("crashpad_test_test_multiprocess_exec_test_child") {
sources = [
"multiprocess_exec_test_child.cc",
]
deps = [
"../third_party/mini_chromium:base",
]
deps = [
"../third_party/mini_chromium:base",
]
}
}
static_library("gmock_main") {
......
......@@ -25,7 +25,7 @@
//! \file
#if defined(OS_MACOSX) || DOXYGEN
#if (defined(OS_MACOSX) && !defined(OS_IOS)) || DOXYGEN
//! \brief Wraps the gtest `ASSERT_DEATH_IF_SUPPORTED()` macro to make
//! assertions about death caused by crashes.
......@@ -73,14 +73,14 @@
regex); \
} while (false)
#else // OS_MACOSX
#else // OS_MACOSX && !OS_IOS
#define ASSERT_DEATH_CRASH(statement, regex) \
ASSERT_DEATH_IF_SUPPORTED(statement, regex)
#define EXPECT_DEATH_CRASH(statement, regex) \
EXPECT_DEATH_IF_SUPPORTED(statement, regex)
#endif // OS_MACOSX
#endif // OS_MACOSX && !OS_IOS
#if !(!defined(MINI_CHROMIUM_BASE_LOGGING_H_) && \
defined(OFFICIAL_BUILD) && \
......
......@@ -33,6 +33,7 @@
namespace {
#if !defined(OS_IOS)
bool GetChildTestFunctionName(std::string* child_func_name) {
constexpr size_t arg_length =
sizeof(crashpad::test::internal::kChildTestFunction) - 1;
......@@ -45,17 +46,20 @@ bool GetChildTestFunctionName(std::string* child_func_name) {
}
return false;
}
#endif // !OS_IOS
} // namespace
int main(int argc, char* argv[]) {
crashpad::test::InitializeMainArguments(argc, argv);
#if !defined(OS_IOS)
std::string child_func_name;
if (GetChildTestFunctionName(&child_func_name)) {
return crashpad::test::internal::CheckedInvokeMultiprocessChild(
child_func_name);
}
#endif // !OS_IOS
#if defined(CRASHPAD_IS_IN_CHROMIUM)
......
......@@ -332,6 +332,7 @@ static_library("util") {
"linux/traits.h",
"misc/capture_context_linux.S",
"misc/paths_linux.cc",
"misc/time_linux.cc",
"posix/process_info_linux.cc",
"process/process_memory_linux.cc",
"process/process_memory_linux.h",
......
......@@ -85,7 +85,8 @@ bool ProcStatReader::SystemCPUTime(timeval* system_time) const {
return ReadTimeAtIndex(14, system_time);
}
bool ProcStatReader::StartTime(timeval* start_time) const {
bool ProcStatReader::StartTime(const timeval& boot_time,
timeval* start_time) const {
INITIALIZATION_STATE_DCHECK_VALID(initialized_);
timeval time_after_boot;
......@@ -93,24 +94,7 @@ bool ProcStatReader::StartTime(timeval* start_time) const {
return false;
}
timespec uptime;
if (clock_gettime(CLOCK_BOOTTIME, &uptime) != 0) {
PLOG(ERROR) << "clock_gettime";
return false;
}
timespec current_time;
if (clock_gettime(CLOCK_REALTIME, &current_time) != 0) {
PLOG(ERROR) << "clock_gettime";
return false;
}
timespec boot_time_ts;
SubtractTimespec(current_time, uptime, &boot_time_ts);
timeval boot_time_tv;
TimespecToTimeval(boot_time_ts, &boot_time_tv);
timeradd(&boot_time_tv, &time_after_boot, start_time);
timeradd(&boot_time, &time_after_boot, start_time);
return true;
}
......
......@@ -60,11 +60,12 @@ class ProcStatReader {
//! \brief Determines the target thread’s start time.
//!
//! \param[in] boot_time The kernel boot time.
//! \param[out] start_time The time that the thread started.
//!
//! \return `true` on success, with \a start_time set. Otherwise, `false` with
//! a message logged.
bool StartTime(timeval* start_time) const;
bool StartTime(const timeval& boot_time, timeval* start_time) const;
private:
bool FindColumn(int index, const char** column) const;
......
......@@ -19,9 +19,9 @@
#include <unistd.h>
#include "base/logging.h"
#include "build/build_config.h"
#include "gtest/gtest.h"
#include "test/linux/fake_ptrace_connection.h"
#include "util/misc/time.h"
#include "util/thread/thread.h"
namespace crashpad {
......@@ -35,8 +35,13 @@ TEST(ProcStatReader, Basic) {
ProcStatReader stat;
ASSERT_TRUE(stat.Initialize(&connection, getpid()));
timespec boot_time_ts;
ASSERT_TRUE(GetBootTime(&boot_time_ts));
timeval boot_time;
TimespecToTimeval(boot_time_ts, &boot_time);
timeval start_time;
ASSERT_TRUE(stat.StartTime(&start_time));
ASSERT_TRUE(stat.StartTime(boot_time, &start_time));
time_t now;
time(&now);
......@@ -57,36 +62,38 @@ pid_t gettid() {
return syscall(SYS_gettid);
}
void GetStartTime(timeval* start_time) {
void GetStartTime(const timeval& boot_time, timeval* start_time) {
FakePtraceConnection connection;
ASSERT_TRUE(connection.Initialize(getpid()));
ProcStatReader stat;
ASSERT_TRUE(stat.Initialize(&connection, gettid()));
ASSERT_TRUE(stat.StartTime(start_time));
ASSERT_TRUE(stat.StartTime(boot_time, start_time));
}
class StatTimeThread : public Thread {
public:
StatTimeThread(timeval* start_time) : start_time_(start_time) {}
StatTimeThread(const timeval& boot_time, timeval* start_time)
: boot_time_(boot_time), start_time_(start_time) {}
private:
void ThreadMain() override { GetStartTime(start_time_); }
void ThreadMain() override { GetStartTime(boot_time_, start_time_); }
const timeval& boot_time_;
timeval* start_time_;
};
// TODO(https://crbug.com/1016765): Flaky on Linux.
#if defined(OS_LINUX)
#define MAYBE_Threads DISABLED_Threads
#else
#define MAYBE_Threads Threads
#endif
TEST(ProcStatReader, MAYBE_Threads) {
TEST(ProcStatReader, Threads) {
timespec boot_time_ts;
ASSERT_TRUE(GetBootTime(&boot_time_ts));
timeval boot_time;
TimespecToTimeval(boot_time_ts, &boot_time);
timeval main_time;
ASSERT_NO_FATAL_FAILURE(GetStartTime(&main_time));
ASSERT_NO_FATAL_FAILURE(GetStartTime(boot_time, &main_time));
timeval thread_time;
StatTimeThread thread(&thread_time);
StatTimeThread thread(boot_time, &thread_time);
thread.Start();
ASSERT_NO_FATAL_FAILURE(thread.Join());
......@@ -96,7 +103,7 @@ TEST(ProcStatReader, MAYBE_Threads) {
time_t thread_sec,
suseconds_t thread_usec) {
return (thread_sec > main_sec) ||
(thread_sec == main_sec && thread_usec > main_usec);
(thread_sec == main_sec && thread_usec >= main_usec);
},
main_time.tv_sec,
main_time.tv_usec,
......
......@@ -69,6 +69,14 @@ void GetTimeOfDay(timeval* tv);
#endif // OS_WIN
#if defined(OS_LINUX) || defined(OS_ANDROID) || DOXYGEN
//! \brief Get the kernel boot time. Subsequent calls to this function may
//! return different results due to the system clock being changed or
//! imprecision in measuring the boot time.
//! \return `true` on success. Otherwise, `false` with a message logged.
bool GetBootTime(timespec* ts);
#endif // OS_LINUX || OS_ANDROID || DOXYGEN
} // namespace crashpad
#endif // CRASHPAD_UTIL_MISC_TIME_H_
// Copyright 2019 The Crashpad Authors. All rights reserved.
//
// 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.
#include "util/misc/time.h"
#include "base/logging.h"
namespace crashpad {
bool GetBootTime(timespec* boot_time) {
timespec uptime;
if (clock_gettime(CLOCK_BOOTTIME, &uptime) != 0) {
PLOG(ERROR) << "clock_gettime";
return false;
}
timespec current_time;
if (clock_gettime(CLOCK_REALTIME, &current_time) != 0) {
PLOG(ERROR) << "clock_gettime";
return false;
}
SubtractTimespec(current_time, uptime, boot_time);
return true;
}
} // namespace crashpad
......@@ -23,6 +23,7 @@
#include "util/file/string_file.h"
#include "util/linux/proc_stat_reader.h"
#include "util/misc/lexing.h"
#include "util/misc/time.h"
namespace crashpad {
......@@ -238,7 +239,13 @@ bool ProcessInfo::StartTime(timeval* start_time) const {
if (!reader.Initialize(connection_, pid_)) {
return false;
}
if (!reader.StartTime(&start_time_)) {
timespec boot_time_ts;
if (!GetBootTime(&boot_time_ts)) {
return false;
}
timeval boot_time;
TimespecToTimeval(boot_time_ts, &boot_time);
if (!reader.StartTime(boot_time, &start_time_)) {
return false;
}
start_time_initialized_.set_valid();
......
......@@ -168,6 +168,7 @@
'misc/symbolic_constants_common.h',
'misc/time.cc',
'misc/time.h',
'misc/time_linux.cc',
'misc/time_win.cc',
'misc/tri_state.h',
'misc/uuid.cc',
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment