summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSim Sun <simsun@fb.com>2022-03-03 22:48:29 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2022-03-03 22:48:29 +0000
commit5fbe373ddec7bcf16902e8f9b1018f5b255a73ea (patch)
tree65d7fd8a5b9f0183014df71e386c5b2aa2e4a6fb
parent95e2cfb8457ddc2d7effd63a1e81e09a879400e3 (diff)
parentf6eeb9e448fd6627638f2f3667ba8609d766f999 (diff)
downloadunwinding-5fbe373ddec7bcf16902e8f9b1018f5b255a73ea.tar.gz
Allow unwinding main thread in ThreadUnwinder. am: 1af21effef am: f6eeb9e448
Original change: https://android-review.googlesource.com/c/platform/system/unwinding/+/2004761 Change-Id: I13a68a5bbf68ec4be9e99f295ef5c44c3a312639
-rw-r--r--libunwindstack/ThreadUnwinder.cpp2
-rw-r--r--libunwindstack/tests/UnwindTest.cpp22
2 files changed, 23 insertions, 1 deletions
diff --git a/libunwindstack/ThreadUnwinder.cpp b/libunwindstack/ThreadUnwinder.cpp
index 9a8a0a6..2bdb910 100644
--- a/libunwindstack/ThreadUnwinder.cpp
+++ b/libunwindstack/ThreadUnwinder.cpp
@@ -149,7 +149,7 @@ void ThreadUnwinder::UnwindWithSignal(int signal, pid_t tid, std::unique_ptr<Reg
const std::vector<std::string>* initial_map_names_to_skip,
const std::vector<std::string>* map_suffixes_to_ignore) {
ClearErrors();
- if (tid == pid_) {
+ if (tid == static_cast<pid_t>(android::base::GetThreadId())) {
last_error_.code = ERROR_UNSUPPORTED;
return;
}
diff --git a/libunwindstack/tests/UnwindTest.cpp b/libunwindstack/tests/UnwindTest.cpp
index 80f931b..2ed1b9b 100644
--- a/libunwindstack/tests/UnwindTest.cpp
+++ b/libunwindstack/tests/UnwindTest.cpp
@@ -570,6 +570,28 @@ TEST_F(UnwindTest, thread_unwind_cur_pid) {
EXPECT_EQ(ERROR_UNSUPPORTED, unwinder.LastErrorCode());
}
+TEST_F(UnwindTest, thread_unwind_cur_thread) {
+ std::thread thread([]() {
+ ThreadUnwinder unwinder(512);
+ ASSERT_TRUE(unwinder.Init());
+ unwinder.UnwindWithSignal(SIGRTMIN, android::base::GetThreadId());
+ EXPECT_EQ(0U, unwinder.NumFrames());
+ EXPECT_EQ(ERROR_UNSUPPORTED, unwinder.LastErrorCode());
+ });
+ thread.join();
+}
+
+TEST_F(UnwindTest, thread_unwind_cur_pid_from_thread) {
+ std::thread thread([]() {
+ ThreadUnwinder unwinder(512);
+ ASSERT_TRUE(unwinder.Init());
+ unwinder.UnwindWithSignal(SIGRTMIN, getpid());
+ EXPECT_NE(0U, unwinder.NumFrames());
+ EXPECT_NE(ERROR_UNSUPPORTED, unwinder.LastErrorCode());
+ });
+ thread.join();
+}
+
static std::thread* CreateUnwindThread(std::atomic_int& tid, ThreadUnwinder& unwinder,
std::atomic_bool& start_unwinding,
std::atomic_int& unwinders) {