Merge "libdebuggerd: store process uptime."
This commit is contained in:
commit
777148f9f2
4 changed files with 33 additions and 1 deletions
|
@ -238,6 +238,7 @@ cc_library_static {
|
|||
"gwp_asan_crash_handler",
|
||||
"libscudo",
|
||||
"libtombstone_proto",
|
||||
"libprocinfo",
|
||||
"libprotobuf-cpp-lite",
|
||||
],
|
||||
|
||||
|
|
|
@ -31,10 +31,12 @@
|
|||
#include <time.h>
|
||||
|
||||
#include <memory>
|
||||
#include <optional>
|
||||
#include <string>
|
||||
|
||||
#include <async_safe/log.h>
|
||||
|
||||
#include <android-base/file.h>
|
||||
#include <android-base/properties.h>
|
||||
#include <android-base/stringprintf.h>
|
||||
#include <android-base/strings.h>
|
||||
|
@ -47,6 +49,7 @@
|
|||
#include <log/logprint.h>
|
||||
#include <private/android_filesystem_config.h>
|
||||
|
||||
#include <procinfo/process.h>
|
||||
#include <unwindstack/Maps.h>
|
||||
#include <unwindstack/Memory.h>
|
||||
#include <unwindstack/Regs.h>
|
||||
|
@ -519,6 +522,14 @@ static void dump_logcat(Tombstone* tombstone, pid_t pid) {
|
|||
dump_log_file(tombstone, "main", pid);
|
||||
}
|
||||
|
||||
static std::optional<uint64_t> read_uptime_secs() {
|
||||
std::string uptime;
|
||||
if (!android::base::ReadFileToString("/proc/uptime", &uptime)) {
|
||||
return {};
|
||||
}
|
||||
return strtoll(uptime.c_str(), nullptr, 10);
|
||||
}
|
||||
|
||||
void engrave_tombstone_proto(Tombstone* tombstone, unwindstack::Unwinder* unwinder,
|
||||
const std::map<pid_t, ThreadInfo>& threads, pid_t target_thread,
|
||||
const ProcessInfo& process_info, const OpenFilesList* open_files) {
|
||||
|
@ -529,6 +540,22 @@ void engrave_tombstone_proto(Tombstone* tombstone, unwindstack::Unwinder* unwind
|
|||
result.set_revision(android::base::GetProperty("ro.revision", "unknown"));
|
||||
result.set_timestamp(get_timestamp());
|
||||
|
||||
std::optional<uint64_t> system_uptime = read_uptime_secs();
|
||||
if (system_uptime) {
|
||||
android::procinfo::ProcessInfo proc_info;
|
||||
std::string error;
|
||||
if (android::procinfo::GetProcessInfo(target_thread, &proc_info, &error)) {
|
||||
uint64_t starttime = proc_info.starttime / sysconf(_SC_CLK_TCK);
|
||||
result.set_process_uptime(*system_uptime - starttime);
|
||||
} else {
|
||||
async_safe_format_log(ANDROID_LOG_ERROR, LOG_TAG, "failed to read process info: %s",
|
||||
error.c_str());
|
||||
}
|
||||
} else {
|
||||
async_safe_format_log(ANDROID_LOG_ERROR, LOG_TAG, "failed to read /proc/uptime: %s",
|
||||
strerror(errno));
|
||||
}
|
||||
|
||||
const ThreadInfo& main_thread = threads.at(target_thread);
|
||||
result.set_pid(main_thread.pid);
|
||||
result.set_tid(main_thread.tid);
|
||||
|
|
|
@ -360,6 +360,7 @@ bool tombstone_proto_to_text(const Tombstone& tombstone, CallbackType callback)
|
|||
CBL("Revision: '%s'", tombstone.revision().c_str());
|
||||
CBL("ABI: '%s'", abi_string(tombstone));
|
||||
CBL("Timestamp: %s", tombstone.timestamp().c_str());
|
||||
CBL("Process uptime: %ds", tombstone.process_uptime());
|
||||
|
||||
// Process header
|
||||
const auto& threads = tombstone.threads();
|
||||
|
|
|
@ -19,6 +19,9 @@ message Tombstone {
|
|||
|
||||
string process_name = 9;
|
||||
|
||||
// Process uptime in seconds.
|
||||
uint32 process_uptime = 20;
|
||||
|
||||
Signal signal_info = 10;
|
||||
string abort_message = 14;
|
||||
repeated Cause causes = 15;
|
||||
|
@ -28,7 +31,7 @@ message Tombstone {
|
|||
repeated LogBuffer log_buffers = 18;
|
||||
repeated FD open_fds = 19;
|
||||
|
||||
reserved 20 to 999;
|
||||
reserved 21 to 999;
|
||||
}
|
||||
|
||||
enum Architecture {
|
||||
|
|
Loading…
Reference in a new issue