Loading cmds/dumpstate/Android.bp +7 −0 Original line number Original line Diff line number Diff line Loading @@ -118,6 +118,12 @@ cc_defaults { ], ], } } prebuilt_etc { name: "default_screenshot", src: "res/default_screenshot.png", filename_from_src: true, } cc_binary { cc_binary { name: "dumpstate", name: "dumpstate", defaults: ["dumpstate_defaults"], defaults: ["dumpstate_defaults"], Loading @@ -130,6 +136,7 @@ cc_binary { required: [ required: [ "atrace", "atrace", "bugreport_procdump", "bugreport_procdump", "default_screenshot", "dmabuf_dump", "dmabuf_dump", "ip", "ip", "iptables", "iptables", Loading cmds/dumpstate/dumpstate.cpp +19 −6 Original line number Original line Diff line number Diff line Loading @@ -206,6 +206,9 @@ static const std::string ANR_TRACE_FILE_PREFIX = "trace_"; static const std::string SHUTDOWN_CHECKPOINTS_DIR = "/data/system/shutdown-checkpoints/"; static const std::string SHUTDOWN_CHECKPOINTS_DIR = "/data/system/shutdown-checkpoints/"; static const std::string SHUTDOWN_CHECKPOINTS_FILE_PREFIX = "checkpoints-"; static const std::string SHUTDOWN_CHECKPOINTS_FILE_PREFIX = "checkpoints-"; // File path to default screenshot image, that used when failed to capture the real screenshot. static const std::string DEFAULT_SCREENSHOT_PATH = "/system/etc/default_screenshot.png"; // TODO: temporary variables and functions used during C++ refactoring // TODO: temporary variables and functions used during C++ refactoring #define RETURN_IF_USER_DENIED_CONSENT() \ #define RETURN_IF_USER_DENIED_CONSENT() \ Loading Loading @@ -765,10 +768,14 @@ android::binder::Status Dumpstate::ConsentCallback::onReportApproved() { bool copy_succeeded = android::os::CopyFileToFd(ds.screenshot_path_, bool copy_succeeded = android::os::CopyFileToFd(ds.screenshot_path_, ds.options_->screenshot_fd.get()); ds.options_->screenshot_fd.get()); ds.options_->is_screenshot_copied = copy_succeeded; if (copy_succeeded) { if (copy_succeeded) { android::os::UnlinkAndLogOnError(ds.screenshot_path_); android::os::UnlinkAndLogOnError(ds.screenshot_path_); } else { MYLOGE("Failed to copy screenshot to a permanent file.\n"); copy_succeeded = android::os::CopyFileToFd(DEFAULT_SCREENSHOT_PATH, ds.options_->screenshot_fd.get()); } } ds.options_->is_screenshot_copied = copy_succeeded; return android::binder::Status::ok(); return android::binder::Status::ok(); } } Loading Loading @@ -3442,7 +3449,9 @@ Dumpstate::RunStatus Dumpstate::RunInternal(int32_t calling_uid, // Do an early return if there were errors. We make an exception for consent // Do an early return if there were errors. We make an exception for consent // timing out because it's possible the user got distracted. In this case the // timing out because it's possible the user got distracted. In this case the // bugreport is not shared but made available for manual retrieval. // bugreport is not shared but made available for manual retrieval. MYLOGI("User denied consent. Returning\n"); MYLOGI("Bug report generation failed, this could have been due to" " several reasons such as BR copy failed, user consent was" " not grated etc. Returning\n"); return status; return status; } } if (status == Dumpstate::RunStatus::USER_CONSENT_TIMED_OUT) { if (status == Dumpstate::RunStatus::USER_CONSENT_TIMED_OUT) { Loading Loading @@ -3729,12 +3738,16 @@ Dumpstate::RunStatus Dumpstate::CopyBugreportIfUserConsented(int32_t calling_uid if (options_->do_screenshot && if (options_->do_screenshot && options_->screenshot_fd.get() != -1 && options_->screenshot_fd.get() != -1 && !options_->is_screenshot_copied) { !options_->is_screenshot_copied) { copy_succeeded = android::os::CopyFileToFd(screenshot_path_, bool is_screenshot_copied = android::os::CopyFileToFd(screenshot_path_, options_->screenshot_fd.get()); options_->screenshot_fd.get()); options_->is_screenshot_copied = copy_succeeded; if (is_screenshot_copied) { if (copy_succeeded) { android::os::UnlinkAndLogOnError(screenshot_path_); android::os::UnlinkAndLogOnError(screenshot_path_); } else { MYLOGE("Failed to copy screenshot to a permanent file.\n"); is_screenshot_copied = android::os::CopyFileToFd(DEFAULT_SCREENSHOT_PATH, options_->screenshot_fd.get()); } } options_->is_screenshot_copied = is_screenshot_copied; } } } } return copy_succeeded ? Dumpstate::RunStatus::OK : Dumpstate::RunStatus::ERROR; return copy_succeeded ? Dumpstate::RunStatus::OK : Dumpstate::RunStatus::ERROR; Loading Loading @@ -3825,7 +3838,7 @@ DurationReporter::DurationReporter(const std::string& title, bool logcat_only, b DurationReporter::~DurationReporter() { DurationReporter::~DurationReporter() { if (!title_.empty()) { if (!title_.empty()) { float elapsed = (float)(Nanotime() - started_) / NANOS_PER_SEC; float elapsed = (float)(Nanotime() - started_) / NANOS_PER_SEC; if (elapsed >= .5f || verbose_) { if (elapsed >= 1.0f || verbose_) { MYLOGD("Duration of '%s': %.2fs\n", title_.c_str(), elapsed); MYLOGD("Duration of '%s': %.2fs\n", title_.c_str(), elapsed); } } if (!logcat_only_) { if (!logcat_only_) { Loading cmds/dumpstate/res/default_screenshot.png 0 → 100644 +185 B Loading image diff... Loading
cmds/dumpstate/Android.bp +7 −0 Original line number Original line Diff line number Diff line Loading @@ -118,6 +118,12 @@ cc_defaults { ], ], } } prebuilt_etc { name: "default_screenshot", src: "res/default_screenshot.png", filename_from_src: true, } cc_binary { cc_binary { name: "dumpstate", name: "dumpstate", defaults: ["dumpstate_defaults"], defaults: ["dumpstate_defaults"], Loading @@ -130,6 +136,7 @@ cc_binary { required: [ required: [ "atrace", "atrace", "bugreport_procdump", "bugreport_procdump", "default_screenshot", "dmabuf_dump", "dmabuf_dump", "ip", "ip", "iptables", "iptables", Loading
cmds/dumpstate/dumpstate.cpp +19 −6 Original line number Original line Diff line number Diff line Loading @@ -206,6 +206,9 @@ static const std::string ANR_TRACE_FILE_PREFIX = "trace_"; static const std::string SHUTDOWN_CHECKPOINTS_DIR = "/data/system/shutdown-checkpoints/"; static const std::string SHUTDOWN_CHECKPOINTS_DIR = "/data/system/shutdown-checkpoints/"; static const std::string SHUTDOWN_CHECKPOINTS_FILE_PREFIX = "checkpoints-"; static const std::string SHUTDOWN_CHECKPOINTS_FILE_PREFIX = "checkpoints-"; // File path to default screenshot image, that used when failed to capture the real screenshot. static const std::string DEFAULT_SCREENSHOT_PATH = "/system/etc/default_screenshot.png"; // TODO: temporary variables and functions used during C++ refactoring // TODO: temporary variables and functions used during C++ refactoring #define RETURN_IF_USER_DENIED_CONSENT() \ #define RETURN_IF_USER_DENIED_CONSENT() \ Loading Loading @@ -765,10 +768,14 @@ android::binder::Status Dumpstate::ConsentCallback::onReportApproved() { bool copy_succeeded = android::os::CopyFileToFd(ds.screenshot_path_, bool copy_succeeded = android::os::CopyFileToFd(ds.screenshot_path_, ds.options_->screenshot_fd.get()); ds.options_->screenshot_fd.get()); ds.options_->is_screenshot_copied = copy_succeeded; if (copy_succeeded) { if (copy_succeeded) { android::os::UnlinkAndLogOnError(ds.screenshot_path_); android::os::UnlinkAndLogOnError(ds.screenshot_path_); } else { MYLOGE("Failed to copy screenshot to a permanent file.\n"); copy_succeeded = android::os::CopyFileToFd(DEFAULT_SCREENSHOT_PATH, ds.options_->screenshot_fd.get()); } } ds.options_->is_screenshot_copied = copy_succeeded; return android::binder::Status::ok(); return android::binder::Status::ok(); } } Loading Loading @@ -3442,7 +3449,9 @@ Dumpstate::RunStatus Dumpstate::RunInternal(int32_t calling_uid, // Do an early return if there were errors. We make an exception for consent // Do an early return if there were errors. We make an exception for consent // timing out because it's possible the user got distracted. In this case the // timing out because it's possible the user got distracted. In this case the // bugreport is not shared but made available for manual retrieval. // bugreport is not shared but made available for manual retrieval. MYLOGI("User denied consent. Returning\n"); MYLOGI("Bug report generation failed, this could have been due to" " several reasons such as BR copy failed, user consent was" " not grated etc. Returning\n"); return status; return status; } } if (status == Dumpstate::RunStatus::USER_CONSENT_TIMED_OUT) { if (status == Dumpstate::RunStatus::USER_CONSENT_TIMED_OUT) { Loading Loading @@ -3729,12 +3738,16 @@ Dumpstate::RunStatus Dumpstate::CopyBugreportIfUserConsented(int32_t calling_uid if (options_->do_screenshot && if (options_->do_screenshot && options_->screenshot_fd.get() != -1 && options_->screenshot_fd.get() != -1 && !options_->is_screenshot_copied) { !options_->is_screenshot_copied) { copy_succeeded = android::os::CopyFileToFd(screenshot_path_, bool is_screenshot_copied = android::os::CopyFileToFd(screenshot_path_, options_->screenshot_fd.get()); options_->screenshot_fd.get()); options_->is_screenshot_copied = copy_succeeded; if (is_screenshot_copied) { if (copy_succeeded) { android::os::UnlinkAndLogOnError(screenshot_path_); android::os::UnlinkAndLogOnError(screenshot_path_); } else { MYLOGE("Failed to copy screenshot to a permanent file.\n"); is_screenshot_copied = android::os::CopyFileToFd(DEFAULT_SCREENSHOT_PATH, options_->screenshot_fd.get()); } } options_->is_screenshot_copied = is_screenshot_copied; } } } } return copy_succeeded ? Dumpstate::RunStatus::OK : Dumpstate::RunStatus::ERROR; return copy_succeeded ? Dumpstate::RunStatus::OK : Dumpstate::RunStatus::ERROR; Loading Loading @@ -3825,7 +3838,7 @@ DurationReporter::DurationReporter(const std::string& title, bool logcat_only, b DurationReporter::~DurationReporter() { DurationReporter::~DurationReporter() { if (!title_.empty()) { if (!title_.empty()) { float elapsed = (float)(Nanotime() - started_) / NANOS_PER_SEC; float elapsed = (float)(Nanotime() - started_) / NANOS_PER_SEC; if (elapsed >= .5f || verbose_) { if (elapsed >= 1.0f || verbose_) { MYLOGD("Duration of '%s': %.2fs\n", title_.c_str(), elapsed); MYLOGD("Duration of '%s': %.2fs\n", title_.c_str(), elapsed); } } if (!logcat_only_) { if (!logcat_only_) { Loading