libsnapshot::RemoveAllUpdateState log stack
Bug: 148818798
Test: apply OTA but cancel it in the middle, then
delete /data/misc/update_engine/prefs/*, then
reapply it again (to trigger CancelUpdate()).
Stack is dumped.
Change-Id: I2dfb6b7f15b9d5854d0b81ed8ad260538d21c922
diff --git a/fs_mgr/libsnapshot/Android.bp b/fs_mgr/libsnapshot/Android.bp
index ad48b82..c58101a 100644
--- a/fs_mgr/libsnapshot/Android.bp
+++ b/fs_mgr/libsnapshot/Android.bp
@@ -95,6 +95,16 @@
static_libs: [
"libfs_mgr_binder"
],
+
+ shared_libs: [
+ // TODO(b/148818798): remove when parent bug is fixed
+ "libutilscallstack",
+ ],
+ cflags: [
+ "-g",
+ "-O0",
+ "-DLIBSNAPSHOT_USE_CALLSTACK",
+ ],
}
cc_library_static {
@@ -171,6 +181,9 @@
"libsparse",
"libutils",
"libz",
+
+ // TODO(b/148818798): remove when parent bug is fixed
+ "libutilscallstack",
],
static_libs: [
"libgmock",
@@ -207,6 +220,9 @@
"liblp",
"libprotobuf-cpp-lite",
"libutils",
+
+ // TODO(b/148818798): remove when parent bug is fixed.
+ "libutilscallstack",
],
init_rc: [
"snapshotctl.rc",
diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp
index a6f07fc..63a9302 100644
--- a/fs_mgr/libsnapshot/snapshot.cpp
+++ b/fs_mgr/libsnapshot/snapshot.cpp
@@ -21,6 +21,7 @@
#include <sys/unistd.h>
#include <optional>
+#include <sstream>
#include <thread>
#include <unordered_set>
@@ -37,6 +38,10 @@
#include <libfiemap/image_manager.h>
#include <liblp/liblp.h>
+#ifdef LIBSNAPSHOT_USE_CALLSTACK
+#include <utils/CallStack.h>
+#endif
+
#include <android/snapshot/snapshot.pb.h>
#include "device_info.h"
#include "partition_cow_creator.h"
@@ -197,6 +202,22 @@
}
bool SnapshotManager::RemoveAllUpdateState(LockedFile* lock) {
+ LOG(INFO) << "Removing all update state.";
+
+#ifdef LIBSNAPSHOT_USE_CALLSTACK
+ LOG(WARNING) << "Logging stack; see b/148818798.";
+ // Do not use CallStack's log functions because snapshotctl relies on
+ // android-base/logging to save log to files.
+ // TODO(b/148818798): remove this before we ship.
+ CallStack callstack;
+ callstack.update();
+ auto callstack_str = callstack.toString();
+ LOG(WARNING) << callstack_str.c_str();
+ std::stringstream path;
+ path << "/data/misc/snapshotctl_log/libsnapshot." << Now() << ".log";
+ android::base::WriteStringToFile(callstack_str.c_str(), path.str());
+#endif
+
if (!RemoveAllSnapshots(lock)) {
LOG(ERROR) << "Could not remove all snapshots";
return false;
diff --git a/fs_mgr/libsnapshot/snapshotctl.cpp b/fs_mgr/libsnapshot/snapshotctl.cpp
index a0d0c03..9f23c45 100644
--- a/fs_mgr/libsnapshot/snapshotctl.cpp
+++ b/fs_mgr/libsnapshot/snapshotctl.cpp
@@ -27,6 +27,8 @@
#include <libsnapshot/snapshot.h>
#include "utility.h"
+#include "utility.h"
+
using namespace std::string_literals;
int Usage() {