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 ...@@ -2,7 +2,7 @@ Name: Crashpad
Short Name: crashpad Short Name: crashpad
URL: https://crashpad.chromium.org/ URL: https://crashpad.chromium.org/
Version: unknown Version: unknown
Revision: 27322abb7ec40f46020f93b3814c19f77ea2ccfb Revision: bd1aa246ca185519dea0af1c5ca11656c41b0c80
License: Apache 2.0 License: Apache 2.0
License File: crashpad/LICENSE License File: crashpad/LICENSE
Security Critical: yes Security Critical: yes
......
...@@ -23,14 +23,18 @@ config("crashpad_config") { ...@@ -23,14 +23,18 @@ config("crashpad_config") {
if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) { if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) {
test("crashpad_tests") { test("crashpad_tests") {
deps = [ deps = [
"client:client_test",
"handler:handler_test",
"minidump:minidump_test",
"snapshot:snapshot_test",
"test:gmock_main", "test:gmock_main",
"test:test_test", "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) { if (crashpad_is_in_fuchsia) {
...@@ -135,6 +139,9 @@ if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) { ...@@ -135,6 +139,9 @@ if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) {
"client:client_test", "client:client_test",
"test:gmock_main", "test:gmock_main",
] ]
if (crashpad_is_ios) {
deps -= [ "client:client_test" ]
}
} }
test("crashpad_handler_test") { test("crashpad_handler_test") {
...@@ -142,6 +149,9 @@ if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) { ...@@ -142,6 +149,9 @@ if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) {
"handler:handler_test", "handler:handler_test",
"test:gtest_main", "test:gtest_main",
] ]
if (crashpad_is_ios) {
deps -= [ "handler:handler_test" ]
}
} }
test("crashpad_minidump_test") { test("crashpad_minidump_test") {
...@@ -149,6 +159,9 @@ if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) { ...@@ -149,6 +159,9 @@ if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) {
"minidump:minidump_test", "minidump:minidump_test",
"test:gtest_main", "test:gtest_main",
] ]
if (crashpad_is_ios) {
deps -= [ "minidump:minidump_test" ]
}
} }
test("crashpad_snapshot_test") { test("crashpad_snapshot_test") {
...@@ -156,6 +169,9 @@ if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) { ...@@ -156,6 +169,9 @@ if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) {
"snapshot:snapshot_test", "snapshot:snapshot_test",
"test:gtest_main", "test:gtest_main",
] ]
if (crashpad_is_ios) {
deps -= [ "snapshot:snapshot_test" ]
}
} }
test("crashpad_test_test") { test("crashpad_test_test") {
...@@ -170,5 +186,8 @@ if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) { ...@@ -170,5 +186,8 @@ if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) {
"test:gmock_main", "test:gmock_main",
"util:util_test", "util:util_test",
] ]
if (crashpad_is_ios) {
deps -= [ "util:util_test" ]
}
} }
} }
...@@ -33,7 +33,7 @@ deps = { ...@@ -33,7 +33,7 @@ deps = {
'8048ece6c16c91acfe0d36d1d3cc0890ab6e945c', '8048ece6c16c91acfe0d36d1d3cc0890ab6e945c',
'crashpad/third_party/mini_chromium/mini_chromium': 'crashpad/third_party/mini_chromium/mini_chromium':
Var('chromium_git') + '/chromium/mini_chromium@' + Var('chromium_git') + '/chromium/mini_chromium@' +
'2298dbe9d0b3213720ac0e5418ad0013a19aeb5d', 'cdab1e6263ec7f3f61763efc1dac863f8dc07c80',
'crashpad/third_party/libfuzzer/src': 'crashpad/third_party/libfuzzer/src':
Var('chromium_git') + '/chromium/llvm-project/compiler-rt/lib/fuzzer.git@' + Var('chromium_git') + '/chromium/llvm-project/compiler-rt/lib/fuzzer.git@' +
'fda403cf93ecb8792cb1d061564d89a6553ca020', 'fda403cf93ecb8792cb1d061564d89a6553ca020',
......
...@@ -45,7 +45,26 @@ config("crashpad_fuzzer_flags") { ...@@ -45,7 +45,26 @@ config("crashpad_fuzzer_flags") {
"-fsanitize=fuzzer", "-fsanitize=fuzzer",
] ]
ldflags = [ ldflags = [ "-fsanitize=address" ]
"-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() { ...@@ -23,11 +23,10 @@ declare_args() {
} }
} }
assert(crashpad_dependencies == "chromium" || assert(
crashpad_dependencies == "fuchsia" || crashpad_dependencies == "chromium" || crashpad_dependencies == "fuchsia" ||
crashpad_dependencies == "standalone" || crashpad_dependencies == "standalone" ||
crashpad_dependencies == "external" || crashpad_dependencies == "external" || crashpad_dependencies == "dart")
crashpad_dependencies == "dart")
crashpad_is_in_chromium = crashpad_dependencies == "chromium" crashpad_is_in_chromium = crashpad_dependencies == "chromium"
crashpad_is_in_fuchsia = crashpad_dependencies == "fuchsia" crashpad_is_in_fuchsia = crashpad_dependencies == "fuchsia"
...@@ -37,6 +36,7 @@ crashpad_is_standalone = crashpad_dependencies == "standalone" ...@@ -37,6 +36,7 @@ crashpad_is_standalone = crashpad_dependencies == "standalone"
if (crashpad_is_in_chromium) { if (crashpad_is_in_chromium) {
crashpad_is_mac = is_mac crashpad_is_mac = is_mac
crashpad_is_ios = is_ios
crashpad_is_win = is_win crashpad_is_win = is_win
crashpad_is_linux = is_linux crashpad_is_linux = is_linux
crashpad_is_android = is_android crashpad_is_android = is_android
...@@ -57,6 +57,7 @@ if (crashpad_is_in_chromium) { ...@@ -57,6 +57,7 @@ if (crashpad_is_in_chromium) {
import("../third_party/mini_chromium/mini_chromium/build/platform.gni") import("../third_party/mini_chromium/mini_chromium/build/platform.gni")
} }
crashpad_is_mac = mini_chromium_is_mac crashpad_is_mac = mini_chromium_is_mac
crashpad_is_ios = mini_chromium_is_ios
crashpad_is_win = mini_chromium_is_win crashpad_is_win = mini_chromium_is_win
crashpad_is_linux = mini_chromium_is_linux crashpad_is_linux = mini_chromium_is_linux
crashpad_is_android = mini_chromium_is_android crashpad_is_android = mini_chromium_is_android
......
...@@ -43,13 +43,36 @@ static_library("test") { ...@@ -43,13 +43,36 @@ static_library("test") {
"test_paths.h", "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) { if (crashpad_is_posix || crashpad_is_fuchsia) {
sources += [ sources += [
"scoped_guarded_page_posix.cc", "scoped_guarded_page_posix.cc",
"scoped_temp_dir_posix.cc", "scoped_temp_dir_posix.cc",
] ]
if (!crashpad_is_fuchsia) { if (!crashpad_is_fuchsia && !crashpad_is_ios) {
sources += [ sources += [
"multiprocess_exec_posix.cc", "multiprocess_exec_posix.cc",
"multiprocess_posix.cc", "multiprocess_posix.cc",
...@@ -118,6 +141,13 @@ static_library("test") { ...@@ -118,6 +141,13 @@ static_library("test") {
"../util", "../util",
] ]
if (crashpad_is_ios) {
deps -= [
"../compat",
"../util",
]
}
if (crashpad_is_mac) { if (crashpad_is_mac) {
libs = [ "bsm" ] libs = [ "bsm" ]
deps += [ deps += [
...@@ -152,9 +182,18 @@ source_set("test_test") { ...@@ -152,9 +182,18 @@ source_set("test_test") {
"test_paths_test.cc", "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 # TODO(crbug.com/812974): Remove !crashpad_is_fuchsia when Fuchsia is no
# longer treated as a posix platform. # 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" ] sources += [ "multiprocess_posix_test.cc" ]
} }
...@@ -181,16 +220,27 @@ source_set("test_test") { ...@@ -181,16 +220,27 @@ source_set("test_test") {
data_deps = [ data_deps = [
":crashpad_test_test_multiprocess_exec_test_child", ":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") { if (!crashpad_is_ios) {
sources = [ crashpad_executable("crashpad_test_test_multiprocess_exec_test_child") {
"multiprocess_exec_test_child.cc", sources = [
] "multiprocess_exec_test_child.cc",
]
deps = [ deps = [
"../third_party/mini_chromium:base", "../third_party/mini_chromium:base",
] ]
}
} }
static_library("gmock_main") { static_library("gmock_main") {
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
//! \file //! \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 //! \brief Wraps the gtest `ASSERT_DEATH_IF_SUPPORTED()` macro to make
//! assertions about death caused by crashes. //! assertions about death caused by crashes.
...@@ -73,14 +73,14 @@ ...@@ -73,14 +73,14 @@
regex); \ regex); \
} while (false) } while (false)
#else // OS_MACOSX #else // OS_MACOSX && !OS_IOS
#define ASSERT_DEATH_CRASH(statement, regex) \ #define ASSERT_DEATH_CRASH(statement, regex) \
ASSERT_DEATH_IF_SUPPORTED(statement, regex) ASSERT_DEATH_IF_SUPPORTED(statement, regex)
#define EXPECT_DEATH_CRASH(statement, regex) \ #define EXPECT_DEATH_CRASH(statement, regex) \
EXPECT_DEATH_IF_SUPPORTED(statement, regex) EXPECT_DEATH_IF_SUPPORTED(statement, regex)
#endif // OS_MACOSX #endif // OS_MACOSX && !OS_IOS
#if !(!defined(MINI_CHROMIUM_BASE_LOGGING_H_) && \ #if !(!defined(MINI_CHROMIUM_BASE_LOGGING_H_) && \
defined(OFFICIAL_BUILD) && \ defined(OFFICIAL_BUILD) && \
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
namespace { namespace {
#if !defined(OS_IOS)
bool GetChildTestFunctionName(std::string* child_func_name) { bool GetChildTestFunctionName(std::string* child_func_name) {
constexpr size_t arg_length = constexpr size_t arg_length =
sizeof(crashpad::test::internal::kChildTestFunction) - 1; sizeof(crashpad::test::internal::kChildTestFunction) - 1;
...@@ -45,17 +46,20 @@ bool GetChildTestFunctionName(std::string* child_func_name) { ...@@ -45,17 +46,20 @@ bool GetChildTestFunctionName(std::string* child_func_name) {
} }
return false; return false;
} }
#endif // !OS_IOS
} // namespace } // namespace
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
crashpad::test::InitializeMainArguments(argc, argv); crashpad::test::InitializeMainArguments(argc, argv);
#if !defined(OS_IOS)
std::string child_func_name; std::string child_func_name;
if (GetChildTestFunctionName(&child_func_name)) { if (GetChildTestFunctionName(&child_func_name)) {
return crashpad::test::internal::CheckedInvokeMultiprocessChild( return crashpad::test::internal::CheckedInvokeMultiprocessChild(
child_func_name); child_func_name);
} }
#endif // !OS_IOS
#if defined(CRASHPAD_IS_IN_CHROMIUM) #if defined(CRASHPAD_IS_IN_CHROMIUM)
......
...@@ -332,6 +332,7 @@ static_library("util") { ...@@ -332,6 +332,7 @@ static_library("util") {
"linux/traits.h", "linux/traits.h",
"misc/capture_context_linux.S", "misc/capture_context_linux.S",
"misc/paths_linux.cc", "misc/paths_linux.cc",
"misc/time_linux.cc",
"posix/process_info_linux.cc", "posix/process_info_linux.cc",
"process/process_memory_linux.cc", "process/process_memory_linux.cc",
"process/process_memory_linux.h", "process/process_memory_linux.h",
......
...@@ -85,7 +85,8 @@ bool ProcStatReader::SystemCPUTime(timeval* system_time) const { ...@@ -85,7 +85,8 @@ bool ProcStatReader::SystemCPUTime(timeval* system_time) const {
return ReadTimeAtIndex(14, system_time); 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_); INITIALIZATION_STATE_DCHECK_VALID(initialized_);
timeval time_after_boot; timeval time_after_boot;
...@@ -93,24 +94,7 @@ bool ProcStatReader::StartTime(timeval* start_time) const { ...@@ -93,24 +94,7 @@ bool ProcStatReader::StartTime(timeval* start_time) const {
return false; return false;
} }
timespec uptime; timeradd(&boot_time, &time_after_boot, start_time);
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);
return true; return true;
} }
......
...@@ -60,11 +60,12 @@ class ProcStatReader { ...@@ -60,11 +60,12 @@ class ProcStatReader {
//! \brief Determines the target thread’s start time. //! \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. //! \param[out] start_time The time that the thread started.
//! //!
//! \return `true` on success, with \a start_time set. Otherwise, `false` with //! \return `true` on success, with \a start_time set. Otherwise, `false` with
//! a message logged. //! a message logged.
bool StartTime(timeval* start_time) const; bool StartTime(const timeval& boot_time, timeval* start_time) const;
private: private:
bool FindColumn(int index, const char** column) const; bool FindColumn(int index, const char** column) const;
......
...@@ -19,9 +19,9 @@ ...@@ -19,9 +19,9 @@
#include <unistd.h> #include <unistd.h>
#include "base/logging.h" #include "base/logging.h"
#include "build/build_config.h"
#include "gtest/gtest.h" #include "gtest/gtest.h"
#include "test/linux/fake_ptrace_connection.h" #include "test/linux/fake_ptrace_connection.h"
#include "util/misc/time.h"
#include "util/thread/thread.h" #include "util/thread/thread.h"
namespace crashpad { namespace crashpad {
...@@ -35,8 +35,13 @@ TEST(ProcStatReader, Basic) { ...@@ -35,8 +35,13 @@ TEST(ProcStatReader, Basic) {
ProcStatReader stat; ProcStatReader stat;
ASSERT_TRUE(stat.Initialize(&connection, getpid())); 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; timeval start_time;
ASSERT_TRUE(stat.StartTime(&start_time)); ASSERT_TRUE(stat.StartTime(boot_time, &start_time));
time_t now; time_t now;
time(&now); time(&now);
...@@ -57,36 +62,38 @@ pid_t gettid() { ...@@ -57,36 +62,38 @@ pid_t gettid() {
return syscall(SYS_gettid); return syscall(SYS_gettid);
} }
void GetStartTime(timeval* start_time) { void GetStartTime(const timeval& boot_time, timeval* start_time) {
FakePtraceConnection connection; FakePtraceConnection connection;
ASSERT_TRUE(connection.Initialize(getpid())); ASSERT_TRUE(connection.Initialize(getpid()));
ProcStatReader stat; ProcStatReader stat;
ASSERT_TRUE(stat.Initialize(&connection, gettid())); ASSERT_TRUE(stat.Initialize(&connection, gettid()));
ASSERT_TRUE(stat.StartTime(start_time)); ASSERT_TRUE(stat.StartTime(boot_time, start_time));
} }
class StatTimeThread : public Thread { class StatTimeThread : public Thread {
public: 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: private:
void ThreadMain() override { GetStartTime(start_time_); } void ThreadMain() override { GetStartTime(boot_time_, start_time_); }
const timeval& boot_time_;
timeval* start_time_; timeval* start_time_;
}; };
// TODO(https://crbug.com/1016765): Flaky on Linux. TEST(ProcStatReader, Threads) {
#if defined(OS_LINUX) timespec boot_time_ts;
#define MAYBE_Threads DISABLED_Threads ASSERT_TRUE(GetBootTime(&boot_time_ts));
#else timeval boot_time;
#define MAYBE_Threads Threads TimespecToTimeval(boot_time_ts, &boot_time);
#endif
TEST(ProcStatReader, MAYBE_Threads) {
timeval main_time; timeval main_time;
ASSERT_NO_FATAL_FAILURE(GetStartTime(&main_time)); ASSERT_NO_FATAL_FAILURE(GetStartTime(boot_time, &main_time));
timeval thread_time; timeval thread_time;
StatTimeThread thread(&thread_time); StatTimeThread thread(boot_time, &thread_time);
thread.Start(); thread.Start();
ASSERT_NO_FATAL_FAILURE(thread.Join()); ASSERT_NO_FATAL_FAILURE(thread.Join());
...@@ -96,7 +103,7 @@ TEST(ProcStatReader, MAYBE_Threads) { ...@@ -96,7 +103,7 @@ TEST(ProcStatReader, MAYBE_Threads) {
time_t thread_sec, time_t thread_sec,
suseconds_t thread_usec) { suseconds_t thread_usec) {
return (thread_sec > main_sec) || 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_sec,
main_time.tv_usec, main_time.tv_usec,
......
...@@ -69,6 +69,14 @@ void GetTimeOfDay(timeval* tv); ...@@ -69,6 +69,14 @@ void GetTimeOfDay(timeval* tv);
#endif // OS_WIN #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 } // namespace crashpad
#endif // CRASHPAD_UTIL_MISC_TIME_H_ #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 @@ ...@@ -23,6 +23,7 @@
#include "util/file/string_file.h" #include "util/file/string_file.h"
#include "util/linux/proc_stat_reader.h" #include "util/linux/proc_stat_reader.h"
#include "util/misc/lexing.h" #include "util/misc/lexing.h"
#include "util/misc/time.h"
namespace crashpad { namespace crashpad {
...@@ -238,7 +239,13 @@ bool ProcessInfo::StartTime(timeval* start_time) const { ...@@ -238,7 +239,13 @@ bool ProcessInfo::StartTime(timeval* start_time) const {
if (!reader.Initialize(connection_, pid_)) { if (!reader.Initialize(connection_, pid_)) {
return false; 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; return false;
} }
start_time_initialized_.set_valid(); start_time_initialized_.set_valid();
......
...@@ -168,6 +168,7 @@ ...@@ -168,6 +168,7 @@
'misc/symbolic_constants_common.h', 'misc/symbolic_constants_common.h',
'misc/time.cc', 'misc/time.cc',
'misc/time.h', 'misc/time.h',
'misc/time_linux.cc',
'misc/time_win.cc', 'misc/time_win.cc',
'misc/tri_state.h', 'misc/tri_state.h',
'misc/uuid.cc', '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