1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <sys/mman.h>
18 
19 #include <android-base/strings.h>
20 #include <gtest/gtest.h>
21 
22 #include <cstddef>
23 #include <fstream>
24 #include <memory>
25 #include <sstream>
26 #include <string>
27 
28 #include <unwindstack/Arch.h>
29 #include <unwindstack/Memory.h>
30 #include <unwindstack/RegsArm64.h>
31 #include <unwindstack/Unwinder.h>
32 
33 #include "TestUtils.h"
34 #include "utils/MemoryFake.h"
35 #include "utils/OfflineUnwindUtils.h"
36 
37 // This collection of tests exercises Unwinder::Unwind for offline unwinds.
38 //
39 // See `libunwindstack/utils/OfflineUnwindUtils.h` for more info on offline unwinds
40 // and b/192012600 for additional information regarding offline unwind benchmarks.
41 namespace unwindstack {
42 namespace {
43 
44 class UnwindOfflineTest : public ::testing::Test {
45  public:
GetExpectedSamplesFrameInfo(std::string * expected_frame_info,std::string * error_msg,const std::string & sample_name=OfflineUnwindUtils::kSingleSample)46   bool GetExpectedSamplesFrameInfo(
47       std::string* expected_frame_info, std::string* error_msg,
48       const std::string& sample_name = OfflineUnwindUtils::kSingleSample) {
49     const std::string* a_frame_info_path = offline_utils_.GetFrameInfoFilepath(sample_name);
50     if (a_frame_info_path == nullptr) {
51       std::stringstream err_stream;
52       err_stream << "Unable to get frame info filepath for invalid sample name " << sample_name
53                  << ".\n";
54       *error_msg = err_stream.str();
55       return false;
56     }
57 
58     std::ifstream in(*a_frame_info_path);
59     std::stringstream buffer;
60     buffer << in.rdbuf();
61     *expected_frame_info = buffer.str();
62     return true;
63   }
64 
ConsecutiveUnwindTest(const std::vector<UnwindSampleInfo> & sample_infos)65   void ConsecutiveUnwindTest(const std::vector<UnwindSampleInfo>& sample_infos) {
66     std::string error_msg;
67     if (!offline_utils_.Init(sample_infos, &error_msg)) FAIL() << error_msg;
68 
69     for (const auto& sample_info : sample_infos) {
70       const std::string& sample_name = sample_info.offline_files_dir;
71       // Need to change to sample directory for Unwinder to properly init ELF objects.
72       // See more info at OfflineUnwindUtils::ChangeToSampleDirectory.
73       if (!offline_utils_.ChangeToSampleDirectory(&error_msg, sample_name)) FAIL() << error_msg;
74 
75       Unwinder unwinder =
76           Unwinder(128, offline_utils_.GetMaps(sample_name), offline_utils_.GetRegs(sample_name),
77                    offline_utils_.GetProcessMemory(sample_name));
78       if (sample_info.memory_flag == ProcessMemoryFlag::kIncludeJitMemory) {
79         unwinder.SetJitDebug(offline_utils_.GetJitDebug(sample_name));
80       }
81       unwinder.Unwind();
82 
83       size_t expected_num_frames;
84       if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg, sample_name))
85         FAIL() << error_msg;
86       std::string expected_frame_info;
87       if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg, sample_name))
88         FAIL() << error_msg;
89 
90       std::string actual_frame_info = DumpFrames(unwinder);
91       ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << actual_frame_info;
92 
93       // The old demangler in external/libcxx adds an extra space when closing
94       // multiple sets of template args (e.g. "Foo<Bar<Baz> >"), but the new
95       // libc++ demangler omits it. Replace "> >" with ">>" to work with either
96       // demangler until libc++ is upgraded.
97       // TODO(b/329940638). Remove this workaround and fix the tests.
98       actual_frame_info = android::base::StringReplace(actual_frame_info, "> >", ">>", true);
99       expected_frame_info = android::base::StringReplace(expected_frame_info, "> >", ">>", true);
100 
101       EXPECT_EQ(expected_frame_info, actual_frame_info);
102     }
103   }
104 
105  protected:
TearDown()106   void TearDown() override { offline_utils_.ReturnToCurrentWorkingDirectory(); }
107 
108   OfflineUnwindUtils offline_utils_;
109 };
110 
TEST_F(UnwindOfflineTest,pc_straddle_arm)111 TEST_F(UnwindOfflineTest, pc_straddle_arm) {
112   std::string error_msg;
113   if (!offline_utils_.Init({.offline_files_dir = "straddle_arm/", .arch = ARCH_ARM}, &error_msg))
114     FAIL() << error_msg;
115 
116   Regs* regs = offline_utils_.GetRegs();
117   std::unique_ptr<Regs> regs_copy(regs->Clone());
118   Unwinder unwinder(128, offline_utils_.GetMaps(), regs, offline_utils_.GetProcessMemory());
119   unwinder.Unwind();
120 
121   size_t expected_num_frames;
122   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
123   std::string expected_frame_info;
124   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
125 
126   std::string frame_info(DumpFrames(unwinder));
127   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
128   EXPECT_EQ(expected_frame_info, frame_info);
129   EXPECT_EQ(0xf31ea9f8U, unwinder.frames()[0].pc);
130   EXPECT_EQ(0xe9c866f8U, unwinder.frames()[0].sp);
131   EXPECT_EQ(0xf2da0a1bU, unwinder.frames()[1].pc);
132   EXPECT_EQ(0xe9c86728U, unwinder.frames()[1].sp);
133   EXPECT_EQ(0xf2da1441U, unwinder.frames()[2].pc);
134   EXPECT_EQ(0xe9c86730U, unwinder.frames()[2].sp);
135   EXPECT_EQ(0xf3367147U, unwinder.frames()[3].pc);
136   EXPECT_EQ(0xe9c86778U, unwinder.frames()[3].sp);
137 
138   // Display build ids now.
139   unwinder.SetRegs(regs_copy.get());
140   unwinder.SetDisplayBuildID(true);
141   unwinder.Unwind();
142 
143   frame_info = DumpFrames(unwinder);
144   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
145   EXPECT_EQ(
146       "  #00 pc 0001a9f8  libc.so (abort+64) (BuildId: 2dd0d4ba881322a0edabeed94808048c)\n"
147       "  #01 pc 00006a1b  libbase.so (android::base::DefaultAborter(char const*)+6) (BuildId: "
148       "ed43842c239cac1a618e600ea91c4cbd)\n"
149       "  #02 pc 00007441  libbase.so (android::base::LogMessage::~LogMessage()+748) (BuildId: "
150       "ed43842c239cac1a618e600ea91c4cbd)\n"
151       "  #03 pc 00015147  /does/not/exist/libhidlbase.so\n",
152       frame_info);
153 }
154 
TEST_F(UnwindOfflineTest,pc_in_gnu_debugdata_arm)155 TEST_F(UnwindOfflineTest, pc_in_gnu_debugdata_arm) {
156   std::string error_msg;
157   if (!offline_utils_.Init({.offline_files_dir = "gnu_debugdata_arm/", .arch = ARCH_ARM},
158                            &error_msg))
159     FAIL() << error_msg;
160 
161   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
162                     offline_utils_.GetProcessMemory());
163   unwinder.Unwind();
164 
165   size_t expected_num_frames;
166   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
167   std::string expected_frame_info;
168   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
169 
170   std::string frame_info(DumpFrames(unwinder));
171   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
172   EXPECT_EQ(expected_frame_info, frame_info);
173   EXPECT_EQ(0xf1f6dc49U, unwinder.frames()[0].pc);
174   EXPECT_EQ(0xd8fe6930U, unwinder.frames()[0].sp);
175   EXPECT_EQ(0xf1f6dce5U, unwinder.frames()[1].pc);
176   EXPECT_EQ(0xd8fe6958U, unwinder.frames()[1].sp);
177 }
178 
TEST_F(UnwindOfflineTest,pc_straddle_arm64)179 TEST_F(UnwindOfflineTest, pc_straddle_arm64) {
180   std::string error_msg;
181   if (!offline_utils_.Init({.offline_files_dir = "straddle_arm64/", .arch = ARCH_ARM64},
182                            &error_msg))
183     FAIL() << error_msg;
184 
185   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
186                     offline_utils_.GetProcessMemory());
187   unwinder.Unwind();
188 
189   size_t expected_num_frames;
190   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
191   std::string expected_frame_info;
192   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
193 
194   std::string frame_info(DumpFrames(unwinder));
195   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
196   EXPECT_EQ(expected_frame_info, frame_info);
197   EXPECT_EQ(0x64d09d4fd8U, unwinder.frames()[0].pc);
198   EXPECT_EQ(0x7fe0d84040U, unwinder.frames()[0].sp);
199   EXPECT_EQ(0x64d09d5078U, unwinder.frames()[1].pc);
200   EXPECT_EQ(0x7fe0d84070U, unwinder.frames()[1].sp);
201   EXPECT_EQ(0x64d09d508cU, unwinder.frames()[2].pc);
202   EXPECT_EQ(0x7fe0d84080U, unwinder.frames()[2].sp);
203   EXPECT_EQ(0x64d09d88fcU, unwinder.frames()[3].pc);
204   EXPECT_EQ(0x7fe0d84090U, unwinder.frames()[3].sp);
205   EXPECT_EQ(0x64d09d88d8U, unwinder.frames()[4].pc);
206   EXPECT_EQ(0x7fe0d840f0U, unwinder.frames()[4].sp);
207   EXPECT_EQ(0x64d0a00d70U, unwinder.frames()[5].pc);
208   EXPECT_EQ(0x7fe0d84110U, unwinder.frames()[5].sp);
209 }
210 
TEST_F(UnwindOfflineTest,jit_debug_x86)211 TEST_F(UnwindOfflineTest, jit_debug_x86) {
212   std::string error_msg;
213   if (!offline_utils_.Init({.offline_files_dir = "jit_debug_x86/",
214                             .arch = ARCH_X86,
215                             .memory_flag = ProcessMemoryFlag::kIncludeJitMemory},
216                            &error_msg))
217     FAIL() << error_msg;
218 
219   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
220                     offline_utils_.GetProcessMemory());
221   unwinder.SetJitDebug(offline_utils_.GetJitDebug());
222   unwinder.Unwind();
223 
224   size_t expected_num_frames;
225   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
226   std::string expected_frame_info;
227   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
228 
229   std::string frame_info(DumpFrames(unwinder));
230   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
231   EXPECT_EQ(expected_frame_info, frame_info);
232   EXPECT_EQ(0xeb89bfb8U, unwinder.frames()[0].pc);
233   EXPECT_EQ(0xffeb5280U, unwinder.frames()[0].sp);
234   EXPECT_EQ(0xeb89af00U, unwinder.frames()[1].pc);
235   EXPECT_EQ(0xffeb52a0U, unwinder.frames()[1].sp);
236   EXPECT_EQ(0xec6061a8U, unwinder.frames()[2].pc);
237   EXPECT_EQ(0xffeb5ce0U, unwinder.frames()[2].sp);
238   EXPECT_EQ(0xee75be80U, unwinder.frames()[3].pc);
239   EXPECT_EQ(0xffeb5d30U, unwinder.frames()[3].sp);
240   EXPECT_EQ(0xf728e4d2U, unwinder.frames()[4].pc);
241   EXPECT_EQ(0xffeb5d60U, unwinder.frames()[4].sp);
242   EXPECT_EQ(0xf6d27ab5U, unwinder.frames()[5].pc);
243   EXPECT_EQ(0xffeb5d80U, unwinder.frames()[5].sp);
244   EXPECT_EQ(0xf6f7df0dU, unwinder.frames()[6].pc);
245   EXPECT_EQ(0xffeb5e20U, unwinder.frames()[6].sp);
246   EXPECT_EQ(0xf6f73552U, unwinder.frames()[7].pc);
247   EXPECT_EQ(0xffeb5ec0U, unwinder.frames()[7].sp);
248   EXPECT_EQ(0xf6f7499aU, unwinder.frames()[8].pc);
249   EXPECT_EQ(0xffeb5f40U, unwinder.frames()[8].sp);
250   EXPECT_EQ(0xf7265362U, unwinder.frames()[9].pc);
251   EXPECT_EQ(0xffeb5fb0U, unwinder.frames()[9].sp);
252   EXPECT_EQ(0xf72945bdU, unwinder.frames()[10].pc);
253   EXPECT_EQ(0xffeb6110U, unwinder.frames()[10].sp);
254   EXPECT_EQ(0xee75be03U, unwinder.frames()[11].pc);
255   EXPECT_EQ(0xffeb6160U, unwinder.frames()[11].sp);
256   EXPECT_EQ(0xf728e4d2U, unwinder.frames()[12].pc);
257   EXPECT_EQ(0xffeb6180U, unwinder.frames()[12].sp);
258   EXPECT_EQ(0xf6d27ab5U, unwinder.frames()[13].pc);
259   EXPECT_EQ(0xffeb61b0U, unwinder.frames()[13].sp);
260   EXPECT_EQ(0xf6f7df0dU, unwinder.frames()[14].pc);
261   EXPECT_EQ(0xffeb6250U, unwinder.frames()[14].sp);
262   EXPECT_EQ(0xf6f73552U, unwinder.frames()[15].pc);
263   EXPECT_EQ(0xffeb62f0U, unwinder.frames()[15].sp);
264   EXPECT_EQ(0xf6f7499aU, unwinder.frames()[16].pc);
265   EXPECT_EQ(0xffeb6370U, unwinder.frames()[16].sp);
266   EXPECT_EQ(0xf7265362U, unwinder.frames()[17].pc);
267   EXPECT_EQ(0xffeb63e0U, unwinder.frames()[17].sp);
268   EXPECT_EQ(0xf72945bdU, unwinder.frames()[18].pc);
269   EXPECT_EQ(0xffeb6530U, unwinder.frames()[18].sp);
270   EXPECT_EQ(0xee75bd3bU, unwinder.frames()[19].pc);
271   EXPECT_EQ(0xffeb6580U, unwinder.frames()[19].sp);
272   EXPECT_EQ(0xf728e4d2U, unwinder.frames()[20].pc);
273   EXPECT_EQ(0xffeb65b0U, unwinder.frames()[20].sp);
274   EXPECT_EQ(0xf6d27ab5U, unwinder.frames()[21].pc);
275   EXPECT_EQ(0xffeb65e0U, unwinder.frames()[21].sp);
276   EXPECT_EQ(0xf6f7df0dU, unwinder.frames()[22].pc);
277   EXPECT_EQ(0xffeb6680U, unwinder.frames()[22].sp);
278   EXPECT_EQ(0xf6f73552U, unwinder.frames()[23].pc);
279   EXPECT_EQ(0xffeb6720U, unwinder.frames()[23].sp);
280   EXPECT_EQ(0xf6f7499aU, unwinder.frames()[24].pc);
281   EXPECT_EQ(0xffeb67a0U, unwinder.frames()[24].sp);
282   EXPECT_EQ(0xf7265362U, unwinder.frames()[25].pc);
283   EXPECT_EQ(0xffeb6810U, unwinder.frames()[25].sp);
284   EXPECT_EQ(0xf72945bdU, unwinder.frames()[26].pc);
285   EXPECT_EQ(0xffeb6960U, unwinder.frames()[26].sp);
286   EXPECT_EQ(0xee75bbdbU, unwinder.frames()[27].pc);
287   EXPECT_EQ(0xffeb69b0U, unwinder.frames()[27].sp);
288   EXPECT_EQ(0xf728e6a2U, unwinder.frames()[28].pc);
289   EXPECT_EQ(0xffeb69f0U, unwinder.frames()[28].sp);
290   EXPECT_EQ(0xf6d27acbU, unwinder.frames()[29].pc);
291   EXPECT_EQ(0xffeb6a20U, unwinder.frames()[29].sp);
292   EXPECT_EQ(0xf6f7df0dU, unwinder.frames()[30].pc);
293   EXPECT_EQ(0xffeb6ac0U, unwinder.frames()[30].sp);
294   EXPECT_EQ(0xf6f73552U, unwinder.frames()[31].pc);
295   EXPECT_EQ(0xffeb6b60U, unwinder.frames()[31].sp);
296   EXPECT_EQ(0xf6f7499aU, unwinder.frames()[32].pc);
297   EXPECT_EQ(0xffeb6be0U, unwinder.frames()[32].sp);
298   EXPECT_EQ(0xf7265362U, unwinder.frames()[33].pc);
299   EXPECT_EQ(0xffeb6c50U, unwinder.frames()[33].sp);
300   EXPECT_EQ(0xf72945bdU, unwinder.frames()[34].pc);
301   EXPECT_EQ(0xffeb6dd0U, unwinder.frames()[34].sp);
302   EXPECT_EQ(0xee75b624U, unwinder.frames()[35].pc);
303   EXPECT_EQ(0xffeb6e20U, unwinder.frames()[35].sp);
304   EXPECT_EQ(0xf728e4d2U, unwinder.frames()[36].pc);
305   EXPECT_EQ(0xffeb6e50U, unwinder.frames()[36].sp);
306   EXPECT_EQ(0xf6d27ab5U, unwinder.frames()[37].pc);
307   EXPECT_EQ(0xffeb6e70U, unwinder.frames()[37].sp);
308   EXPECT_EQ(0xf6f7df0dU, unwinder.frames()[38].pc);
309   EXPECT_EQ(0xffeb6f10U, unwinder.frames()[38].sp);
310   EXPECT_EQ(0xf6f73552U, unwinder.frames()[39].pc);
311   EXPECT_EQ(0xffeb6fb0U, unwinder.frames()[39].sp);
312   EXPECT_EQ(0xf6f7499aU, unwinder.frames()[40].pc);
313   EXPECT_EQ(0xffeb7030U, unwinder.frames()[40].sp);
314   EXPECT_EQ(0xf7265362U, unwinder.frames()[41].pc);
315   EXPECT_EQ(0xffeb70a0U, unwinder.frames()[41].sp);
316   EXPECT_EQ(0xf72945bdU, unwinder.frames()[42].pc);
317   EXPECT_EQ(0xffeb71f0U, unwinder.frames()[42].sp);
318   EXPECT_EQ(0xee75aedbU, unwinder.frames()[43].pc);
319   EXPECT_EQ(0xffeb7240U, unwinder.frames()[43].sp);
320   EXPECT_EQ(0xf728e4d2U, unwinder.frames()[44].pc);
321   EXPECT_EQ(0xffeb72a0U, unwinder.frames()[44].sp);
322   EXPECT_EQ(0xf6d27ab5U, unwinder.frames()[45].pc);
323   EXPECT_EQ(0xffeb72c0U, unwinder.frames()[45].sp);
324   EXPECT_EQ(0xf6f7df0dU, unwinder.frames()[46].pc);
325   EXPECT_EQ(0xffeb7360U, unwinder.frames()[46].sp);
326   EXPECT_EQ(0xf6f73552U, unwinder.frames()[47].pc);
327   EXPECT_EQ(0xffeb7400U, unwinder.frames()[47].sp);
328   EXPECT_EQ(0xf6f7499aU, unwinder.frames()[48].pc);
329   EXPECT_EQ(0xffeb7480U, unwinder.frames()[48].sp);
330   EXPECT_EQ(0xf7265362U, unwinder.frames()[49].pc);
331   EXPECT_EQ(0xffeb74f0U, unwinder.frames()[49].sp);
332   EXPECT_EQ(0xf72945bdU, unwinder.frames()[50].pc);
333   EXPECT_EQ(0xffeb7680U, unwinder.frames()[50].sp);
334   EXPECT_EQ(0xee756c21U, unwinder.frames()[51].pc);
335   EXPECT_EQ(0xffeb76d0U, unwinder.frames()[51].sp);
336   EXPECT_EQ(0xf728e6a2U, unwinder.frames()[52].pc);
337   EXPECT_EQ(0xffeb76f0U, unwinder.frames()[52].sp);
338   EXPECT_EQ(0xf6d27acbU, unwinder.frames()[53].pc);
339   EXPECT_EQ(0xffeb7710U, unwinder.frames()[53].sp);
340   EXPECT_EQ(0xf6f7df0dU, unwinder.frames()[54].pc);
341   EXPECT_EQ(0xffeb77b0U, unwinder.frames()[54].sp);
342   EXPECT_EQ(0xf6f73552U, unwinder.frames()[55].pc);
343   EXPECT_EQ(0xffeb7850U, unwinder.frames()[55].sp);
344   EXPECT_EQ(0xf6f7499aU, unwinder.frames()[56].pc);
345   EXPECT_EQ(0xffeb78d0U, unwinder.frames()[56].sp);
346   EXPECT_EQ(0xf7265362U, unwinder.frames()[57].pc);
347   EXPECT_EQ(0xffeb7940U, unwinder.frames()[57].sp);
348   EXPECT_EQ(0xf72945bdU, unwinder.frames()[58].pc);
349   EXPECT_EQ(0xffeb7a80U, unwinder.frames()[58].sp);
350   EXPECT_EQ(0xf728e6a2U, unwinder.frames()[59].pc);
351   EXPECT_EQ(0xffeb7ad0U, unwinder.frames()[59].sp);
352   EXPECT_EQ(0xf6d27acbU, unwinder.frames()[60].pc);
353   EXPECT_EQ(0xffeb7af0U, unwinder.frames()[60].sp);
354   EXPECT_EQ(0xf718bc95U, unwinder.frames()[61].pc);
355   EXPECT_EQ(0xffeb7b90U, unwinder.frames()[61].sp);
356   EXPECT_EQ(0xf718bb5aU, unwinder.frames()[62].pc);
357   EXPECT_EQ(0xffeb7c50U, unwinder.frames()[62].sp);
358   EXPECT_EQ(0xf706b3ddU, unwinder.frames()[63].pc);
359   EXPECT_EQ(0xffeb7d10U, unwinder.frames()[63].sp);
360   EXPECT_EQ(0xf6d6548cU, unwinder.frames()[64].pc);
361   EXPECT_EQ(0xffeb7d70U, unwinder.frames()[64].sp);
362   EXPECT_EQ(0xf6d5df06U, unwinder.frames()[65].pc);
363   EXPECT_EQ(0xffeb7df0U, unwinder.frames()[65].sp);
364   EXPECT_EQ(0x56574d8cU, unwinder.frames()[66].pc);
365   EXPECT_EQ(0xffeb7e40U, unwinder.frames()[66].sp);
366   EXPECT_EQ(0x56574a80U, unwinder.frames()[67].pc);
367   EXPECT_EQ(0xffeb7e70U, unwinder.frames()[67].sp);
368   EXPECT_EQ(0xf7363275U, unwinder.frames()[68].pc);
369   EXPECT_EQ(0xffeb7ef0U, unwinder.frames()[68].sp);
370 }
371 
TEST_F(UnwindOfflineTest,jit_debug_arm)372 TEST_F(UnwindOfflineTest, jit_debug_arm) {
373   std::string error_msg;
374   if (!offline_utils_.Init({.offline_files_dir = "jit_debug_arm/",
375                             .arch = ARCH_ARM,
376                             .memory_flag = ProcessMemoryFlag::kIncludeJitMemory},
377                            &error_msg))
378     FAIL() << error_msg;
379 
380   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
381                     offline_utils_.GetProcessMemory());
382   unwinder.SetJitDebug(offline_utils_.GetJitDebug());
383   unwinder.Unwind();
384 
385   size_t expected_num_frames;
386   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
387   std::string expected_frame_info;
388   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
389 
390   std::string frame_info(DumpFrames(unwinder));
391   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
392   EXPECT_EQ(expected_frame_info, frame_info);
393   EXPECT_EQ(0xdfe66a5eU, unwinder.frames()[0].pc);
394   EXPECT_EQ(0xff85d180U, unwinder.frames()[0].sp);
395   EXPECT_EQ(0xe044712dU, unwinder.frames()[1].pc);
396   EXPECT_EQ(0xff85d200U, unwinder.frames()[1].sp);
397   EXPECT_EQ(0xe27a7cb1U, unwinder.frames()[2].pc);
398   EXPECT_EQ(0xff85d290U, unwinder.frames()[2].sp);
399   EXPECT_EQ(0xed75c175U, unwinder.frames()[3].pc);
400   EXPECT_EQ(0xff85d2b0U, unwinder.frames()[3].sp);
401   EXPECT_EQ(0xed761129U, unwinder.frames()[4].pc);
402   EXPECT_EQ(0xff85d2e8U, unwinder.frames()[4].sp);
403   EXPECT_EQ(0xed3b97a9U, unwinder.frames()[5].pc);
404   EXPECT_EQ(0xff85d370U, unwinder.frames()[5].sp);
405   EXPECT_EQ(0xed541833U, unwinder.frames()[6].pc);
406   EXPECT_EQ(0xff85d3d8U, unwinder.frames()[6].sp);
407   EXPECT_EQ(0xed528935U, unwinder.frames()[7].pc);
408   EXPECT_EQ(0xff85d428U, unwinder.frames()[7].sp);
409   EXPECT_EQ(0xed52971dU, unwinder.frames()[8].pc);
410   EXPECT_EQ(0xff85d470U, unwinder.frames()[8].sp);
411   EXPECT_EQ(0xed73c865U, unwinder.frames()[9].pc);
412   EXPECT_EQ(0xff85d4b0U, unwinder.frames()[9].sp);
413   EXPECT_EQ(0xed7606ffU, unwinder.frames()[10].pc);
414   EXPECT_EQ(0xff85d5d0U, unwinder.frames()[10].sp);
415   EXPECT_EQ(0xe27a7c31U, unwinder.frames()[11].pc);
416   EXPECT_EQ(0xff85d640U, unwinder.frames()[11].sp);
417   EXPECT_EQ(0xed75c175U, unwinder.frames()[12].pc);
418   EXPECT_EQ(0xff85d660U, unwinder.frames()[12].sp);
419   EXPECT_EQ(0xed761129U, unwinder.frames()[13].pc);
420   EXPECT_EQ(0xff85d698U, unwinder.frames()[13].sp);
421   EXPECT_EQ(0xed3b97a9U, unwinder.frames()[14].pc);
422   EXPECT_EQ(0xff85d720U, unwinder.frames()[14].sp);
423   EXPECT_EQ(0xed541833U, unwinder.frames()[15].pc);
424   EXPECT_EQ(0xff85d788U, unwinder.frames()[15].sp);
425   EXPECT_EQ(0xed528935U, unwinder.frames()[16].pc);
426   EXPECT_EQ(0xff85d7d8U, unwinder.frames()[16].sp);
427   EXPECT_EQ(0xed52971dU, unwinder.frames()[17].pc);
428   EXPECT_EQ(0xff85d820U, unwinder.frames()[17].sp);
429   EXPECT_EQ(0xed73c865U, unwinder.frames()[18].pc);
430   EXPECT_EQ(0xff85d860U, unwinder.frames()[18].sp);
431   EXPECT_EQ(0xed7606ffU, unwinder.frames()[19].pc);
432   EXPECT_EQ(0xff85d970U, unwinder.frames()[19].sp);
433   EXPECT_EQ(0xe27a7b77U, unwinder.frames()[20].pc);
434   EXPECT_EQ(0xff85d9e0U, unwinder.frames()[20].sp);
435   EXPECT_EQ(0xed75c175U, unwinder.frames()[21].pc);
436   EXPECT_EQ(0xff85da10U, unwinder.frames()[21].sp);
437   EXPECT_EQ(0xed761129U, unwinder.frames()[22].pc);
438   EXPECT_EQ(0xff85da48U, unwinder.frames()[22].sp);
439   EXPECT_EQ(0xed3b97a9U, unwinder.frames()[23].pc);
440   EXPECT_EQ(0xff85dad0U, unwinder.frames()[23].sp);
441   EXPECT_EQ(0xed541833U, unwinder.frames()[24].pc);
442   EXPECT_EQ(0xff85db38U, unwinder.frames()[24].sp);
443   EXPECT_EQ(0xed528935U, unwinder.frames()[25].pc);
444   EXPECT_EQ(0xff85db88U, unwinder.frames()[25].sp);
445   EXPECT_EQ(0xed52971dU, unwinder.frames()[26].pc);
446   EXPECT_EQ(0xff85dbd0U, unwinder.frames()[26].sp);
447   EXPECT_EQ(0xed73c865U, unwinder.frames()[27].pc);
448   EXPECT_EQ(0xff85dc10U, unwinder.frames()[27].sp);
449   EXPECT_EQ(0xed7606ffU, unwinder.frames()[28].pc);
450   EXPECT_EQ(0xff85dd20U, unwinder.frames()[28].sp);
451   EXPECT_EQ(0xe27a7a29U, unwinder.frames()[29].pc);
452   EXPECT_EQ(0xff85dd90U, unwinder.frames()[29].sp);
453   EXPECT_EQ(0xed75c175U, unwinder.frames()[30].pc);
454   EXPECT_EQ(0xff85ddc0U, unwinder.frames()[30].sp);
455   EXPECT_EQ(0xed76122fU, unwinder.frames()[31].pc);
456   EXPECT_EQ(0xff85de08U, unwinder.frames()[31].sp);
457   EXPECT_EQ(0xed3b97bbU, unwinder.frames()[32].pc);
458   EXPECT_EQ(0xff85de90U, unwinder.frames()[32].sp);
459   EXPECT_EQ(0xed541833U, unwinder.frames()[33].pc);
460   EXPECT_EQ(0xff85def8U, unwinder.frames()[33].sp);
461   EXPECT_EQ(0xed528935U, unwinder.frames()[34].pc);
462   EXPECT_EQ(0xff85df48U, unwinder.frames()[34].sp);
463   EXPECT_EQ(0xed52971dU, unwinder.frames()[35].pc);
464   EXPECT_EQ(0xff85df90U, unwinder.frames()[35].sp);
465   EXPECT_EQ(0xed73c865U, unwinder.frames()[36].pc);
466   EXPECT_EQ(0xff85dfd0U, unwinder.frames()[36].sp);
467   EXPECT_EQ(0xed7606ffU, unwinder.frames()[37].pc);
468   EXPECT_EQ(0xff85e110U, unwinder.frames()[37].sp);
469   EXPECT_EQ(0xe27a739bU, unwinder.frames()[38].pc);
470   EXPECT_EQ(0xff85e180U, unwinder.frames()[38].sp);
471   EXPECT_EQ(0xed75c175U, unwinder.frames()[39].pc);
472   EXPECT_EQ(0xff85e1b0U, unwinder.frames()[39].sp);
473   EXPECT_EQ(0xed761129U, unwinder.frames()[40].pc);
474   EXPECT_EQ(0xff85e1e0U, unwinder.frames()[40].sp);
475   EXPECT_EQ(0xed3b97a9U, unwinder.frames()[41].pc);
476   EXPECT_EQ(0xff85e268U, unwinder.frames()[41].sp);
477   EXPECT_EQ(0xed541833U, unwinder.frames()[42].pc);
478   EXPECT_EQ(0xff85e2d0U, unwinder.frames()[42].sp);
479   EXPECT_EQ(0xed528935U, unwinder.frames()[43].pc);
480   EXPECT_EQ(0xff85e320U, unwinder.frames()[43].sp);
481   EXPECT_EQ(0xed52971dU, unwinder.frames()[44].pc);
482   EXPECT_EQ(0xff85e368U, unwinder.frames()[44].sp);
483   EXPECT_EQ(0xed73c865U, unwinder.frames()[45].pc);
484   EXPECT_EQ(0xff85e3a8U, unwinder.frames()[45].sp);
485   EXPECT_EQ(0xed7606ffU, unwinder.frames()[46].pc);
486   EXPECT_EQ(0xff85e4c0U, unwinder.frames()[46].sp);
487   EXPECT_EQ(0xe27a6aa7U, unwinder.frames()[47].pc);
488   EXPECT_EQ(0xff85e530U, unwinder.frames()[47].sp);
489   EXPECT_EQ(0xed75c175U, unwinder.frames()[48].pc);
490   EXPECT_EQ(0xff85e5a0U, unwinder.frames()[48].sp);
491   EXPECT_EQ(0xed761129U, unwinder.frames()[49].pc);
492   EXPECT_EQ(0xff85e5d8U, unwinder.frames()[49].sp);
493   EXPECT_EQ(0xed3b97a9U, unwinder.frames()[50].pc);
494   EXPECT_EQ(0xff85e660U, unwinder.frames()[50].sp);
495   EXPECT_EQ(0xed541833U, unwinder.frames()[51].pc);
496   EXPECT_EQ(0xff85e6c8U, unwinder.frames()[51].sp);
497   EXPECT_EQ(0xed528935U, unwinder.frames()[52].pc);
498   EXPECT_EQ(0xff85e718U, unwinder.frames()[52].sp);
499   EXPECT_EQ(0xed52971dU, unwinder.frames()[53].pc);
500   EXPECT_EQ(0xff85e760U, unwinder.frames()[53].sp);
501   EXPECT_EQ(0xed73c865U, unwinder.frames()[54].pc);
502   EXPECT_EQ(0xff85e7a0U, unwinder.frames()[54].sp);
503   EXPECT_EQ(0xed7606ffU, unwinder.frames()[55].pc);
504   EXPECT_EQ(0xff85e8f0U, unwinder.frames()[55].sp);
505   EXPECT_EQ(0xe27a1a99U, unwinder.frames()[56].pc);
506   EXPECT_EQ(0xff85e960U, unwinder.frames()[56].sp);
507   EXPECT_EQ(0xed75c175U, unwinder.frames()[57].pc);
508   EXPECT_EQ(0xff85e990U, unwinder.frames()[57].sp);
509   EXPECT_EQ(0xed76122fU, unwinder.frames()[58].pc);
510   EXPECT_EQ(0xff85e9c8U, unwinder.frames()[58].sp);
511   EXPECT_EQ(0xed3b97bbU, unwinder.frames()[59].pc);
512   EXPECT_EQ(0xff85ea50U, unwinder.frames()[59].sp);
513   EXPECT_EQ(0xed541833U, unwinder.frames()[60].pc);
514   EXPECT_EQ(0xff85eab8U, unwinder.frames()[60].sp);
515   EXPECT_EQ(0xed528935U, unwinder.frames()[61].pc);
516   EXPECT_EQ(0xff85eb08U, unwinder.frames()[61].sp);
517   EXPECT_EQ(0xed52971dU, unwinder.frames()[62].pc);
518   EXPECT_EQ(0xff85eb50U, unwinder.frames()[62].sp);
519   EXPECT_EQ(0xed73c865U, unwinder.frames()[63].pc);
520   EXPECT_EQ(0xff85eb90U, unwinder.frames()[63].sp);
521   EXPECT_EQ(0xed7606ffU, unwinder.frames()[64].pc);
522   EXPECT_EQ(0xff85ec90U, unwinder.frames()[64].sp);
523   EXPECT_EQ(0xed75c175U, unwinder.frames()[65].pc);
524   EXPECT_EQ(0xff85ed00U, unwinder.frames()[65].sp);
525   EXPECT_EQ(0xed76122fU, unwinder.frames()[66].pc);
526   EXPECT_EQ(0xff85ed38U, unwinder.frames()[66].sp);
527   EXPECT_EQ(0xed3b97bbU, unwinder.frames()[67].pc);
528   EXPECT_EQ(0xff85edc0U, unwinder.frames()[67].sp);
529   EXPECT_EQ(0xed6ac92dU, unwinder.frames()[68].pc);
530   EXPECT_EQ(0xff85ee28U, unwinder.frames()[68].sp);
531   EXPECT_EQ(0xed6ac6c3U, unwinder.frames()[69].pc);
532   EXPECT_EQ(0xff85eeb8U, unwinder.frames()[69].sp);
533   EXPECT_EQ(0xed602411U, unwinder.frames()[70].pc);
534   EXPECT_EQ(0xff85ef48U, unwinder.frames()[70].sp);
535   EXPECT_EQ(0xed3e0a9fU, unwinder.frames()[71].pc);
536   EXPECT_EQ(0xff85ef90U, unwinder.frames()[71].sp);
537   EXPECT_EQ(0xed3db9b9U, unwinder.frames()[72].pc);
538   EXPECT_EQ(0xff85f008U, unwinder.frames()[72].sp);
539   EXPECT_EQ(0xab0d459fU, unwinder.frames()[73].pc);
540   EXPECT_EQ(0xff85f038U, unwinder.frames()[73].sp);
541   EXPECT_EQ(0xab0d4349U, unwinder.frames()[74].pc);
542   EXPECT_EQ(0xff85f050U, unwinder.frames()[74].sp);
543   EXPECT_EQ(0xedb0d0c9U, unwinder.frames()[75].pc);
544   EXPECT_EQ(0xff85f0c0U, unwinder.frames()[75].sp);
545 }
546 
547 struct LeakType {
LeakTypeunwindstack::__anonacb77c110111::LeakType548   LeakType(Maps* maps, Regs* regs, std::shared_ptr<Memory>& process_memory,
549            size_t expected_num_frames)
550       : maps(maps),
551         regs(regs),
552         process_memory(process_memory),
553         expected_num_frames(expected_num_frames) {}
554 
555   Maps* maps;
556   Regs* regs;
557   std::shared_ptr<Memory>& process_memory;
558   size_t expected_num_frames;
559 };
560 
OfflineUnwind(void * data)561 static void OfflineUnwind(void* data) {
562   LeakType* leak_data = reinterpret_cast<LeakType*>(data);
563 
564   std::unique_ptr<Regs> regs_copy(leak_data->regs->Clone());
565   std::unique_ptr<JitDebug> jit_debug =
566       CreateJitDebug(leak_data->regs->Arch(), leak_data->process_memory);
567   Unwinder unwinder(128, leak_data->maps, regs_copy.get(), leak_data->process_memory);
568   unwinder.SetJitDebug(jit_debug.get());
569   unwinder.Unwind();
570   ASSERT_EQ(leak_data->expected_num_frames, unwinder.NumFrames());
571 }
572 
TEST_F(UnwindOfflineTest,unwind_offline_check_for_leaks)573 TEST_F(UnwindOfflineTest, unwind_offline_check_for_leaks) {
574 #if !defined(__BIONIC__)
575   GTEST_SKIP() << "Leak checking depends on bionic.";
576 #endif
577 
578   std::string error_msg;
579   if (!offline_utils_.Init({.offline_files_dir = "jit_debug_arm/",
580                             .arch = ARCH_ARM,
581                             .memory_flag = ProcessMemoryFlag::kIncludeJitMemory},
582                            &error_msg))
583     FAIL() << error_msg;
584 
585   std::shared_ptr<Memory> process_memory = offline_utils_.GetProcessMemory();
586 
587   size_t expected_num_frames;
588   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
589   LeakType data(offline_utils_.GetMaps(), offline_utils_.GetRegs(), process_memory,
590                 expected_num_frames);
591   TestCheckForLeaks(OfflineUnwind, &data);
592 }
593 
594 // The eh_frame_hdr data is present but set to zero fdes. This should
595 // fallback to iterating over the cies/fdes and ignore the eh_frame_hdr.
596 // No .gnu_debugdata section in the elf file, so no symbols.
TEST_F(UnwindOfflineTest,bad_eh_frame_hdr_arm64)597 TEST_F(UnwindOfflineTest, bad_eh_frame_hdr_arm64) {
598   std::string error_msg;
599   if (!offline_utils_.Init({.offline_files_dir = "bad_eh_frame_hdr_arm64/", .arch = ARCH_ARM64},
600                            &error_msg))
601     FAIL() << error_msg;
602 
603   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
604                     offline_utils_.GetProcessMemory());
605   unwinder.Unwind();
606 
607   size_t expected_num_frames;
608   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
609   std::string expected_frame_info;
610   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
611 
612   std::string frame_info(DumpFrames(unwinder));
613   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
614   EXPECT_EQ(expected_frame_info, frame_info);
615   EXPECT_EQ(0x60a9fdf550U, unwinder.frames()[0].pc);
616   EXPECT_EQ(0x7fdd141990U, unwinder.frames()[0].sp);
617   EXPECT_EQ(0x60a9fdf568U, unwinder.frames()[1].pc);
618   EXPECT_EQ(0x7fdd1419a0U, unwinder.frames()[1].sp);
619   EXPECT_EQ(0x60a9fdf57cU, unwinder.frames()[2].pc);
620   EXPECT_EQ(0x7fdd1419b0U, unwinder.frames()[2].sp);
621   EXPECT_EQ(0x60a9fdf590U, unwinder.frames()[3].pc);
622   EXPECT_EQ(0x7fdd1419c0U, unwinder.frames()[3].sp);
623   EXPECT_EQ(0x7542d68e98U, unwinder.frames()[4].pc);
624   EXPECT_EQ(0x7fdd1419d0U, unwinder.frames()[4].sp);
625 }
626 
627 // The elf has bad eh_frame unwind information for the pcs. If eh_frame
628 // is used first, the unwind will not match the expected output.
TEST_F(UnwindOfflineTest,debug_frame_first_x86)629 TEST_F(UnwindOfflineTest, debug_frame_first_x86) {
630   std::string error_msg;
631   if (!offline_utils_.Init({.offline_files_dir = "debug_frame_first_x86/", .arch = ARCH_X86},
632                            &error_msg))
633     FAIL() << error_msg;
634 
635   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
636                     offline_utils_.GetProcessMemory());
637   unwinder.Unwind();
638 
639   size_t expected_num_frames;
640   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
641   std::string expected_frame_info;
642   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
643 
644   std::string frame_info(DumpFrames(unwinder));
645   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
646   EXPECT_EQ(expected_frame_info, frame_info);
647   EXPECT_EQ(0x56598685U, unwinder.frames()[0].pc);
648   EXPECT_EQ(0xffcf9e38U, unwinder.frames()[0].sp);
649   EXPECT_EQ(0x565986b7U, unwinder.frames()[1].pc);
650   EXPECT_EQ(0xffcf9e50U, unwinder.frames()[1].sp);
651   EXPECT_EQ(0x565986d7U, unwinder.frames()[2].pc);
652   EXPECT_EQ(0xffcf9e60U, unwinder.frames()[2].sp);
653   EXPECT_EQ(0x565986f7U, unwinder.frames()[3].pc);
654   EXPECT_EQ(0xffcf9e70U, unwinder.frames()[3].sp);
655   EXPECT_EQ(0xf744a275U, unwinder.frames()[4].pc);
656   EXPECT_EQ(0xffcf9e80U, unwinder.frames()[4].sp);
657 }
658 
659 // Make sure that a pc that is at the beginning of an fde unwinds correctly.
TEST_F(UnwindOfflineTest,eh_frame_hdr_begin_x86_64)660 TEST_F(UnwindOfflineTest, eh_frame_hdr_begin_x86_64) {
661   std::string error_msg;
662   if (!offline_utils_.Init({.offline_files_dir = "eh_frame_hdr_begin_x86_64/", .arch = ARCH_X86_64},
663                            &error_msg))
664     FAIL() << error_msg;
665 
666   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
667                     offline_utils_.GetProcessMemory());
668   unwinder.Unwind();
669 
670   size_t expected_num_frames;
671   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
672   std::string expected_frame_info;
673   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
674 
675   std::string frame_info(DumpFrames(unwinder));
676   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
677   EXPECT_EQ(expected_frame_info, frame_info);
678   EXPECT_EQ(0x561550b17a80U, unwinder.frames()[0].pc);
679   EXPECT_EQ(0x7ffcc8596ce8U, unwinder.frames()[0].sp);
680   EXPECT_EQ(0x561550b17dd9U, unwinder.frames()[1].pc);
681   EXPECT_EQ(0x7ffcc8596cf0U, unwinder.frames()[1].sp);
682   EXPECT_EQ(0x561550b1821eU, unwinder.frames()[2].pc);
683   EXPECT_EQ(0x7ffcc8596f40U, unwinder.frames()[2].sp);
684   EXPECT_EQ(0x561550b183edU, unwinder.frames()[3].pc);
685   EXPECT_EQ(0x7ffcc8597190U, unwinder.frames()[3].sp);
686   EXPECT_EQ(0x7f4de62162b0U, unwinder.frames()[4].pc);
687   EXPECT_EQ(0x7ffcc85971a0U, unwinder.frames()[4].sp);
688 }
689 
TEST_F(UnwindOfflineTest,art_quick_osr_stub_arm)690 TEST_F(UnwindOfflineTest, art_quick_osr_stub_arm) {
691   std::string error_msg;
692   if (!offline_utils_.Init({.offline_files_dir = "art_quick_osr_stub_arm/",
693                             .arch = ARCH_ARM,
694                             .memory_flag = ProcessMemoryFlag::kIncludeJitMemory},
695                            &error_msg))
696     FAIL() << error_msg;
697 
698   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
699                     offline_utils_.GetProcessMemory());
700   unwinder.SetJitDebug(offline_utils_.GetJitDebug());
701   unwinder.Unwind();
702 
703   size_t expected_num_frames;
704   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
705   std::string expected_frame_info;
706   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
707 
708   std::string frame_info(DumpFrames(unwinder));
709   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
710   EXPECT_EQ(expected_frame_info, frame_info);
711   EXPECT_EQ(0xd025c788U, unwinder.frames()[0].pc);
712   EXPECT_EQ(0xcd4ff140U, unwinder.frames()[0].sp);
713   EXPECT_EQ(0xd025cdd5U, unwinder.frames()[1].pc);
714   EXPECT_EQ(0xcd4ff140U, unwinder.frames()[1].sp);
715   EXPECT_EQ(0xe4a755bbU, unwinder.frames()[2].pc);
716   EXPECT_EQ(0xcd4ff160U, unwinder.frames()[2].sp);
717   EXPECT_EQ(0xe48c77a5U, unwinder.frames()[3].pc);
718   EXPECT_EQ(0xcd4ff190U, unwinder.frames()[3].sp);
719   EXPECT_EQ(0xe4a641a7U, unwinder.frames()[4].pc);
720   EXPECT_EQ(0xcd4ff298U, unwinder.frames()[4].sp);
721   EXPECT_EQ(0xe4a74474U, unwinder.frames()[5].pc);
722   EXPECT_EQ(0xcd4ff2b8U, unwinder.frames()[5].sp);
723   EXPECT_EQ(0xcd8365b0U, unwinder.frames()[6].pc);
724   EXPECT_EQ(0xcd4ff2e0U, unwinder.frames()[6].sp);
725   EXPECT_EQ(0xe4839f1bU, unwinder.frames()[7].pc);
726   EXPECT_EQ(0xcd4ff2e0U, unwinder.frames()[7].sp);
727   EXPECT_EQ(0xe483e593U, unwinder.frames()[8].pc);
728   EXPECT_EQ(0xcd4ff330U, unwinder.frames()[8].sp);
729   EXPECT_EQ(0xe4856d01U, unwinder.frames()[9].pc);
730   EXPECT_EQ(0xcd4ff380U, unwinder.frames()[9].sp);
731   EXPECT_EQ(0xe4a60427U, unwinder.frames()[10].pc);
732   EXPECT_EQ(0xcd4ff430U, unwinder.frames()[10].sp);
733   EXPECT_EQ(0xe4a67b94U, unwinder.frames()[11].pc);
734   EXPECT_EQ(0xcd4ff498U, unwinder.frames()[11].sp);
735   EXPECT_EQ(0x7004873eU, unwinder.frames()[12].pc);
736   EXPECT_EQ(0xcd4ff4c0U, unwinder.frames()[12].sp);
737   EXPECT_EQ(0xe4839f1bU, unwinder.frames()[13].pc);
738   EXPECT_EQ(0xcd4ff4c0U, unwinder.frames()[13].sp);
739   EXPECT_EQ(0xe483e4d5U, unwinder.frames()[14].pc);
740   EXPECT_EQ(0xcd4ff510U, unwinder.frames()[14].sp);
741   EXPECT_EQ(0xe4a545abU, unwinder.frames()[15].pc);
742   EXPECT_EQ(0xcd4ff538U, unwinder.frames()[15].sp);
743   EXPECT_EQ(0xe4a79affU, unwinder.frames()[16].pc);
744   EXPECT_EQ(0xcd4ff640U, unwinder.frames()[16].sp);
745   EXPECT_EQ(0xe4a75575U, unwinder.frames()[17].pc);
746   EXPECT_EQ(0xcd4ff6b0U, unwinder.frames()[17].sp);
747   EXPECT_EQ(0xe4a7a531U, unwinder.frames()[18].pc);
748   EXPECT_EQ(0xcd4ff6e8U, unwinder.frames()[18].sp);
749   EXPECT_EQ(0xe471668dU, unwinder.frames()[19].pc);
750   EXPECT_EQ(0xcd4ff770U, unwinder.frames()[19].sp);
751   EXPECT_EQ(0xe49c4f49U, unwinder.frames()[20].pc);
752   EXPECT_EQ(0xcd4ff7c8U, unwinder.frames()[20].sp);
753   EXPECT_EQ(0xe49c5cd9U, unwinder.frames()[21].pc);
754   EXPECT_EQ(0xcd4ff850U, unwinder.frames()[21].sp);
755   EXPECT_EQ(0xe49e71ddU, unwinder.frames()[22].pc);
756   EXPECT_EQ(0xcd4ff8e8U, unwinder.frames()[22].sp);
757   EXPECT_EQ(0xe7df3925U, unwinder.frames()[23].pc);
758   EXPECT_EQ(0xcd4ff958U, unwinder.frames()[23].sp);
759   EXPECT_EQ(0xe7daee39U, unwinder.frames()[24].pc);
760   EXPECT_EQ(0xcd4ff960U, unwinder.frames()[24].sp);
761 }
762 
TEST_F(UnwindOfflineTest,jit_map_arm)763 TEST_F(UnwindOfflineTest, jit_map_arm) {
764   std::string error_msg;
765   if (!offline_utils_.Init({.offline_files_dir = "jit_map_arm/", .arch = ARCH_ARM}, &error_msg))
766     FAIL() << error_msg;
767 
768   Maps* maps = offline_utils_.GetMaps();
769   maps->Add(0xd025c788, 0xd025c9f0, 0, PROT_READ | PROT_EXEC | MAPS_FLAGS_JIT_SYMFILE_MAP,
770             "jit_map0.so", 0);
771   maps->Add(0xd025cd98, 0xd025cff4, 0, PROT_READ | PROT_EXEC | MAPS_FLAGS_JIT_SYMFILE_MAP,
772             "jit_map1.so", 0);
773   maps->Sort();
774 
775   Unwinder unwinder(128, maps, offline_utils_.GetRegs(), offline_utils_.GetProcessMemory());
776   unwinder.Unwind();
777 
778   size_t expected_num_frames;
779   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
780   std::string expected_frame_info;
781   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
782 
783   std::string frame_info(DumpFrames(unwinder));
784   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
785   EXPECT_EQ(expected_frame_info, frame_info);
786   EXPECT_EQ(0xd025c788U, unwinder.frames()[0].pc);
787   EXPECT_EQ(0xcd4ff140U, unwinder.frames()[0].sp);
788   EXPECT_EQ(0xd025cdd5U, unwinder.frames()[1].pc);
789   EXPECT_EQ(0xcd4ff140U, unwinder.frames()[1].sp);
790   EXPECT_EQ(0xe4a755bbU, unwinder.frames()[2].pc);
791   EXPECT_EQ(0xcd4ff160U, unwinder.frames()[2].sp);
792   EXPECT_EQ(0xe49e71ddU, unwinder.frames()[3].pc);
793   EXPECT_EQ(0xcd4ff8e8U, unwinder.frames()[3].sp);
794   EXPECT_EQ(0xe7df3925U, unwinder.frames()[4].pc);
795   EXPECT_EQ(0xcd4ff958U, unwinder.frames()[4].sp);
796   EXPECT_EQ(0xe7daee39U, unwinder.frames()[5].pc);
797   EXPECT_EQ(0xcd4ff960U, unwinder.frames()[5].sp);
798 }
799 
TEST_F(UnwindOfflineTest,offset_arm)800 TEST_F(UnwindOfflineTest, offset_arm) {
801   std::string error_msg;
802   if (!offline_utils_.Init({.offline_files_dir = "offset_arm/", .arch = ARCH_ARM}, &error_msg))
803     FAIL() << error_msg;
804 
805   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
806                     offline_utils_.GetProcessMemory());
807   unwinder.Unwind();
808 
809   size_t expected_num_frames;
810   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
811   std::string expected_frame_info;
812   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
813 
814   std::string frame_info(DumpFrames(unwinder));
815   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
816   EXPECT_EQ(expected_frame_info, frame_info);
817   EXPECT_EQ(0x2e55fa0U, unwinder.frames()[0].pc);
818   EXPECT_EQ(0xf43d2cccU, unwinder.frames()[0].sp);
819   EXPECT_EQ(0x2e55febU, unwinder.frames()[1].pc);
820   EXPECT_EQ(0xf43d2ce0U, unwinder.frames()[1].sp);
821   EXPECT_EQ(0x2e55ff3U, unwinder.frames()[2].pc);
822   EXPECT_EQ(0xf43d2ce8U, unwinder.frames()[2].sp);
823   EXPECT_EQ(0x2e59ed3U, unwinder.frames()[3].pc);
824   EXPECT_EQ(0xf43d2cf0U, unwinder.frames()[3].sp);
825   EXPECT_EQ(0xf413652cU, unwinder.frames()[4].pc);
826   EXPECT_EQ(0xf43d2d10U, unwinder.frames()[4].sp);
827   EXPECT_EQ(0U, unwinder.frames()[5].pc);
828   EXPECT_EQ(0xffcc0ee0U, unwinder.frames()[5].sp);
829   EXPECT_EQ(0x2e562d9U, unwinder.frames()[6].pc);
830   EXPECT_EQ(0xffcc0ee0U, unwinder.frames()[6].sp);
831   EXPECT_EQ(0x2e56c4fU, unwinder.frames()[7].pc);
832   EXPECT_EQ(0xffcc1060U, unwinder.frames()[7].sp);
833   EXPECT_EQ(0x2e56c81U, unwinder.frames()[8].pc);
834   EXPECT_EQ(0xffcc1078U, unwinder.frames()[8].sp);
835   EXPECT_EQ(0x2e58547U, unwinder.frames()[9].pc);
836   EXPECT_EQ(0xffcc1090U, unwinder.frames()[9].sp);
837   EXPECT_EQ(0x2e58d99U, unwinder.frames()[10].pc);
838   EXPECT_EQ(0xffcc1438U, unwinder.frames()[10].sp);
839   EXPECT_EQ(0x2e7e453U, unwinder.frames()[11].pc);
840   EXPECT_EQ(0xffcc1448U, unwinder.frames()[11].sp);
841   EXPECT_EQ(0x2e7ede7U, unwinder.frames()[12].pc);
842   EXPECT_EQ(0xffcc1458U, unwinder.frames()[12].sp);
843   EXPECT_EQ(0x2e7f105U, unwinder.frames()[13].pc);
844   EXPECT_EQ(0xffcc1490U, unwinder.frames()[13].sp);
845   EXPECT_EQ(0x2e84215U, unwinder.frames()[14].pc);
846   EXPECT_EQ(0xffcc14c0U, unwinder.frames()[14].sp);
847   EXPECT_EQ(0x2e83f4fU, unwinder.frames()[15].pc);
848   EXPECT_EQ(0xffcc1510U, unwinder.frames()[15].sp);
849   EXPECT_EQ(0x2e773dbU, unwinder.frames()[16].pc);
850   EXPECT_EQ(0xffcc1528U, unwinder.frames()[16].sp);
851   EXPECT_EQ(0xf41a2c0dU, unwinder.frames()[17].pc);
852   EXPECT_EQ(0xffcc1540U, unwinder.frames()[17].sp);
853   EXPECT_EQ(0x2b6c02fU, unwinder.frames()[18].pc);
854   EXPECT_EQ(0xffcc1558U, unwinder.frames()[18].sp);
855 }
856 
857 // Test using a non-zero load bias library that has the fde entries
858 // encoded as 0xb, which is not set as pc relative.
TEST_F(UnwindOfflineTest,debug_frame_load_bias_arm)859 TEST_F(UnwindOfflineTest, debug_frame_load_bias_arm) {
860   std::string error_msg;
861   if (!offline_utils_.Init({.offline_files_dir = "debug_frame_load_bias_arm/", .arch = ARCH_ARM},
862                            &error_msg))
863     FAIL() << error_msg;
864 
865   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
866                     offline_utils_.GetProcessMemory());
867   unwinder.Unwind();
868 
869   size_t expected_num_frames;
870   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
871   std::string expected_frame_info;
872   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
873 
874   std::string frame_info(DumpFrames(unwinder));
875   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
876   EXPECT_EQ(expected_frame_info, frame_info);
877   EXPECT_EQ(0xf0be238cU, unwinder.frames()[0].pc);
878   EXPECT_EQ(0xffd4a638U, unwinder.frames()[0].sp);
879   EXPECT_EQ(0xf0bb240fU, unwinder.frames()[1].pc);
880   EXPECT_EQ(0xffd4a638U, unwinder.frames()[1].sp);
881   EXPECT_EQ(0xf1a75535U, unwinder.frames()[2].pc);
882   EXPECT_EQ(0xffd4a650U, unwinder.frames()[2].sp);
883   EXPECT_EQ(0xf1a75633U, unwinder.frames()[3].pc);
884   EXPECT_EQ(0xffd4a6b0U, unwinder.frames()[3].sp);
885   EXPECT_EQ(0xf1a75b57U, unwinder.frames()[4].pc);
886   EXPECT_EQ(0xffd4a6d0U, unwinder.frames()[4].sp);
887   EXPECT_EQ(0x8d1cc21U, unwinder.frames()[5].pc);
888   EXPECT_EQ(0xffd4a6e8U, unwinder.frames()[5].sp);
889   EXPECT_EQ(0xf0c15b89U, unwinder.frames()[6].pc);
890   EXPECT_EQ(0xffd4a700U, unwinder.frames()[6].sp);
891   EXPECT_EQ(0x8d1cb77U, unwinder.frames()[7].pc);
892   EXPECT_EQ(0xffd4a718U, unwinder.frames()[7].sp);
893 }
894 
TEST_F(UnwindOfflineTest,shared_lib_in_apk_arm64)895 TEST_F(UnwindOfflineTest, shared_lib_in_apk_arm64) {
896   std::string error_msg;
897   if (!offline_utils_.Init({.offline_files_dir = "shared_lib_in_apk_arm64/", .arch = ARCH_ARM64},
898                            &error_msg))
899     FAIL() << error_msg;
900 
901   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
902                     offline_utils_.GetProcessMemory());
903   unwinder.Unwind();
904 
905   size_t expected_num_frames;
906   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
907   std::string expected_frame_info;
908   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
909 
910   std::string frame_info(DumpFrames(unwinder));
911   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
912   EXPECT_EQ(expected_frame_info, frame_info);
913   EXPECT_EQ(0x7e82c4fcbcULL, unwinder.frames()[0].pc);
914   EXPECT_EQ(0x7df8ca3bf0ULL, unwinder.frames()[0].sp);
915   EXPECT_EQ(0x7e82b5726cULL, unwinder.frames()[1].pc);
916   EXPECT_EQ(0x7df8ca3bf0ULL, unwinder.frames()[1].sp);
917   EXPECT_EQ(0x7e82b018c0ULL, unwinder.frames()[2].pc);
918   EXPECT_EQ(0x7df8ca3da0ULL, unwinder.frames()[2].sp);
919   EXPECT_EQ(0x7e7eecc6f4ULL, unwinder.frames()[3].pc);
920   EXPECT_EQ(0x7dabf3db60ULL, unwinder.frames()[3].sp);
921   EXPECT_EQ(0x7e7eeccad4ULL, unwinder.frames()[4].pc);
922   EXPECT_EQ(0x7dabf3dc40ULL, unwinder.frames()[4].sp);
923   EXPECT_EQ(0x7dabc405b4ULL, unwinder.frames()[5].pc);
924   EXPECT_EQ(0x7dabf3dc50ULL, unwinder.frames()[5].sp);
925   EXPECT_EQ(0x7e7eec7e68ULL, unwinder.frames()[6].pc);
926   EXPECT_EQ(0x7dabf3dc70ULL, unwinder.frames()[6].sp);
927   // Ignore top frame since the test code was modified to end in __libc_init.
928 }
929 
TEST_F(UnwindOfflineTest,shared_lib_in_apk_memory_only_arm64)930 TEST_F(UnwindOfflineTest, shared_lib_in_apk_memory_only_arm64) {
931   std::string error_msg;
932   if (!offline_utils_.Init(
933           {.offline_files_dir = "shared_lib_in_apk_memory_only_arm64/", .arch = ARCH_ARM64},
934           &error_msg))
935     FAIL() << error_msg;
936   // Add the memory that represents the shared library.
937 
938   std::shared_ptr<Memory> process_memory = offline_utils_.GetProcessMemory();
939   MemoryOfflineParts* memory = reinterpret_cast<MemoryOfflineParts*>(process_memory.get());
940   const std::string* offline_files_path = offline_utils_.GetOfflineFilesPath();
941   if (offline_files_path == nullptr) FAIL() << "GetOfflineFilesPath() failed.";
942 
943   if (!AddMemory(*offline_files_path + "lib_mem.data", memory, &error_msg)) FAIL() << error_msg;
944 
945   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(), process_memory);
946   unwinder.Unwind();
947 
948   size_t expected_num_frames;
949   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
950   std::string expected_frame_info;
951   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
952 
953   std::string frame_info(DumpFrames(unwinder));
954   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
955   EXPECT_EQ(expected_frame_info, frame_info);
956   EXPECT_EQ(0x7e82c4fcbcULL, unwinder.frames()[0].pc);
957   EXPECT_EQ(0x7df8ca3bf0ULL, unwinder.frames()[0].sp);
958   EXPECT_EQ(0x7e82b5726cULL, unwinder.frames()[1].pc);
959   EXPECT_EQ(0x7df8ca3bf0ULL, unwinder.frames()[1].sp);
960   EXPECT_EQ(0x7e82b018c0ULL, unwinder.frames()[2].pc);
961   EXPECT_EQ(0x7df8ca3da0ULL, unwinder.frames()[2].sp);
962   EXPECT_EQ(0x7e7eecc6f4ULL, unwinder.frames()[3].pc);
963   EXPECT_EQ(0x7dabf3db60ULL, unwinder.frames()[3].sp);
964   EXPECT_EQ(0x7e7eeccad4ULL, unwinder.frames()[4].pc);
965   EXPECT_EQ(0x7dabf3dc40ULL, unwinder.frames()[4].sp);
966   EXPECT_EQ(0x7dabc405b4ULL, unwinder.frames()[5].pc);
967   EXPECT_EQ(0x7dabf3dc50ULL, unwinder.frames()[5].sp);
968   EXPECT_EQ(0x7e7eec7e68ULL, unwinder.frames()[6].pc);
969   EXPECT_EQ(0x7dabf3dc70ULL, unwinder.frames()[6].sp);
970   // Ignore top frame since the test code was modified to end in __libc_init.
971 }
972 
TEST_F(UnwindOfflineTest,shared_lib_in_apk_single_map_arm64)973 TEST_F(UnwindOfflineTest, shared_lib_in_apk_single_map_arm64) {
974   std::string error_msg;
975   if (!offline_utils_.Init(
976           {.offline_files_dir = "shared_lib_in_apk_single_map_arm64/", .arch = ARCH_ARM64},
977           &error_msg))
978     FAIL() << error_msg;
979 
980   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
981                     offline_utils_.GetProcessMemory());
982   unwinder.Unwind();
983 
984   size_t expected_num_frames;
985   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
986   std::string expected_frame_info;
987   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
988 
989   std::string frame_info(DumpFrames(unwinder));
990   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
991   EXPECT_EQ(expected_frame_info, frame_info);
992   EXPECT_EQ(0x7cbe0b14bcULL, unwinder.frames()[0].pc);
993   EXPECT_EQ(0x7be4f077d0ULL, unwinder.frames()[0].sp);
994   EXPECT_EQ(0x7be6715f5cULL, unwinder.frames()[1].pc);
995   EXPECT_EQ(0x7be4f077d0ULL, unwinder.frames()[1].sp);
996   EXPECT_EQ(0x7be6715e9cULL, unwinder.frames()[2].pc);
997   EXPECT_EQ(0x7be4f07800ULL, unwinder.frames()[2].sp);
998   EXPECT_EQ(0x7be6715d70ULL, unwinder.frames()[3].pc);
999   EXPECT_EQ(0x7be4f07840ULL, unwinder.frames()[3].sp);
1000   EXPECT_EQ(0x7be6716408ULL, unwinder.frames()[4].pc);
1001   EXPECT_EQ(0x7be4f07860ULL, unwinder.frames()[4].sp);
1002   EXPECT_EQ(0x7be67168d8ULL, unwinder.frames()[5].pc);
1003   EXPECT_EQ(0x7be4f07880ULL, unwinder.frames()[5].sp);
1004   EXPECT_EQ(0x7be6716814ULL, unwinder.frames()[6].pc);
1005   EXPECT_EQ(0x7be4f078f0ULL, unwinder.frames()[6].sp);
1006   EXPECT_EQ(0x7be6704f60ULL, unwinder.frames()[7].pc);
1007   EXPECT_EQ(0x7be4f07910ULL, unwinder.frames()[7].sp);
1008   EXPECT_EQ(0x7be5f7b024ULL, unwinder.frames()[8].pc);
1009   EXPECT_EQ(0x7be4f07950ULL, unwinder.frames()[8].sp);
1010   EXPECT_EQ(0x7be5f7cad0ULL, unwinder.frames()[9].pc);
1011   EXPECT_EQ(0x7be4f07aa0ULL, unwinder.frames()[9].sp);
1012   EXPECT_EQ(0x7be5f7cb64ULL, unwinder.frames()[10].pc);
1013   EXPECT_EQ(0x7be4f07ce0ULL, unwinder.frames()[10].sp);
1014   EXPECT_EQ(0x7cbe11406cULL, unwinder.frames()[11].pc);
1015   EXPECT_EQ(0x7be4f07d00ULL, unwinder.frames()[11].sp);
1016   EXPECT_EQ(0x7cbe0b5e18ULL, unwinder.frames()[12].pc);
1017   EXPECT_EQ(0x7be4f07d20ULL, unwinder.frames()[12].sp);
1018 }
1019 
TEST_F(UnwindOfflineTest,invalid_elf_offset_arm)1020 TEST_F(UnwindOfflineTest, invalid_elf_offset_arm) {
1021   std::string error_msg;
1022   if (!offline_utils_.Init({.offline_files_dir = "invalid_elf_offset_arm/",
1023                             .arch = ARCH_ARM,
1024                             .memory_flag = ProcessMemoryFlag::kNoMemory},
1025                            &error_msg))
1026     FAIL() << error_msg;
1027 
1028   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
1029                     offline_utils_.GetProcessMemory());
1030   unwinder.Unwind();
1031 
1032   size_t expected_num_frames;
1033   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1034 
1035   std::string frame_info(DumpFrames(unwinder));
1036   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1037   EXPECT_EQ("  #00 pc 00aa7508  invalid.apk (offset 0x12e4000)\n", frame_info);
1038   EXPECT_EQ(0xc898f508, unwinder.frames()[0].pc);
1039   EXPECT_EQ(0xc2044218, unwinder.frames()[0].sp);
1040 }
1041 
TEST_F(UnwindOfflineTest,load_bias_ro_rx_x86_64)1042 TEST_F(UnwindOfflineTest, load_bias_ro_rx_x86_64) {
1043   std::string error_msg;
1044   if (!offline_utils_.Init({.offline_files_dir = "load_bias_ro_rx_x86_64/", .arch = ARCH_X86_64},
1045                            &error_msg))
1046     FAIL() << error_msg;
1047 
1048   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
1049                     offline_utils_.GetProcessMemory());
1050   unwinder.Unwind();
1051 
1052   size_t expected_num_frames;
1053   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1054 
1055   std::string frame_info(DumpFrames(unwinder));
1056   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1057   EXPECT_EQ(
1058       "  #00 pc 00000000000e9dd4  libc.so (__write+20)\n"
1059       "  #01 pc 000000000007ab9c  libc.so (_IO_file_write+44)\n"
1060       "  #02 pc 0000000000079f3e  libc.so\n"
1061       "  #03 pc 000000000007bce8  libc.so (_IO_do_write+24)\n"
1062       "  #04 pc 000000000007b26e  libc.so (_IO_file_xsputn+270)\n"
1063       "  #05 pc 000000000004f7f9  libc.so (_IO_vfprintf+1945)\n"
1064       "  #06 pc 0000000000057cb5  libc.so (_IO_printf+165)\n"
1065       "  #07 pc 0000000000ed1796  perfetto_unittests "
1066       "(testing::internal::PrettyUnitTestResultPrinter::OnTestIterationStart(testing::UnitTest "
1067       "const&, int)+374)\n"
1068       "  #08 pc 0000000000ed30fd  perfetto_unittests "
1069       "(testing::internal::TestEventRepeater::OnTestIterationStart(testing::UnitTest const&, "
1070       "int)+125)\n"
1071       "  #09 pc 0000000000ed5e25  perfetto_unittests "
1072       "(testing::internal::UnitTestImpl::RunAllTests()+581)\n"
1073       "  #10 pc 0000000000ef63f3  perfetto_unittests "
1074       "(bool "
1075       "testing::internal::HandleSehExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, "
1076       "bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char "
1077       "const*)+131)\n"
1078       "  #11 pc 0000000000ee2a21  perfetto_unittests "
1079       "(bool "
1080       "testing::internal::HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, "
1081       "bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char "
1082       "const*)+113)\n"
1083       "  #12 pc 0000000000ed5bb9  perfetto_unittests (testing::UnitTest::Run()+185)\n"
1084       "  #13 pc 0000000000e900f0  perfetto_unittests (RUN_ALL_TESTS()+16)\n"
1085       "  #14 pc 0000000000e900d8  perfetto_unittests (main+56)\n"
1086       "  #15 pc 000000000002352a  libc.so (__libc_start_main+234)\n"
1087       "  #16 pc 0000000000919029  perfetto_unittests (_start+41)\n",
1088       frame_info);
1089 
1090   EXPECT_EQ(0x7f9326a57dd4ULL, unwinder.frames()[0].pc);
1091   EXPECT_EQ(0x7ffd224153c8ULL, unwinder.frames()[0].sp);
1092   EXPECT_EQ(0x7f93269e8b9cULL, unwinder.frames()[1].pc);
1093   EXPECT_EQ(0x7ffd224153d0ULL, unwinder.frames()[1].sp);
1094   EXPECT_EQ(0x7f93269e7f3eULL, unwinder.frames()[2].pc);
1095   EXPECT_EQ(0x7ffd22415400ULL, unwinder.frames()[2].sp);
1096   EXPECT_EQ(0x7f93269e9ce8ULL, unwinder.frames()[3].pc);
1097   EXPECT_EQ(0x7ffd22415440ULL, unwinder.frames()[3].sp);
1098   EXPECT_EQ(0x7f93269e926eULL, unwinder.frames()[4].pc);
1099   EXPECT_EQ(0x7ffd22415450ULL, unwinder.frames()[4].sp);
1100   EXPECT_EQ(0x7f93269bd7f9ULL, unwinder.frames()[5].pc);
1101   EXPECT_EQ(0x7ffd22415490ULL, unwinder.frames()[5].sp);
1102   EXPECT_EQ(0x7f93269c5cb5ULL, unwinder.frames()[6].pc);
1103   EXPECT_EQ(0x7ffd22415a10ULL, unwinder.frames()[6].sp);
1104   EXPECT_EQ(0xed1796ULL, unwinder.frames()[7].pc);
1105   EXPECT_EQ(0x7ffd22415af0ULL, unwinder.frames()[7].sp);
1106   EXPECT_EQ(0xed30fdULL, unwinder.frames()[8].pc);
1107   EXPECT_EQ(0x7ffd22415b70ULL, unwinder.frames()[8].sp);
1108   EXPECT_EQ(0xed5e25ULL, unwinder.frames()[9].pc);
1109   EXPECT_EQ(0x7ffd22415bb0ULL, unwinder.frames()[9].sp);
1110   EXPECT_EQ(0xef63f3ULL, unwinder.frames()[10].pc);
1111   EXPECT_EQ(0x7ffd22415c60ULL, unwinder.frames()[10].sp);
1112   EXPECT_EQ(0xee2a21ULL, unwinder.frames()[11].pc);
1113   EXPECT_EQ(0x7ffd22415cc0ULL, unwinder.frames()[11].sp);
1114   EXPECT_EQ(0xed5bb9ULL, unwinder.frames()[12].pc);
1115   EXPECT_EQ(0x7ffd22415d40ULL, unwinder.frames()[12].sp);
1116   EXPECT_EQ(0xe900f0ULL, unwinder.frames()[13].pc);
1117   EXPECT_EQ(0x7ffd22415d90ULL, unwinder.frames()[13].sp);
1118   EXPECT_EQ(0xe900d8ULL, unwinder.frames()[14].pc);
1119   EXPECT_EQ(0x7ffd22415da0ULL, unwinder.frames()[14].sp);
1120   EXPECT_EQ(0x7f932699152aULL, unwinder.frames()[15].pc);
1121   EXPECT_EQ(0x7ffd22415dd0ULL, unwinder.frames()[15].sp);
1122   EXPECT_EQ(0x919029ULL, unwinder.frames()[16].pc);
1123   EXPECT_EQ(0x7ffd22415e90ULL, unwinder.frames()[16].sp);
1124 }
1125 
TEST_F(UnwindOfflineTest,load_bias_different_section_bias_arm64)1126 TEST_F(UnwindOfflineTest, load_bias_different_section_bias_arm64) {
1127   std::string error_msg;
1128   if (!offline_utils_.Init(
1129           {.offline_files_dir = "load_bias_different_section_bias_arm64/", .arch = ARCH_ARM64},
1130           &error_msg))
1131     FAIL() << error_msg;
1132 
1133   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
1134                     offline_utils_.GetProcessMemory());
1135   unwinder.Unwind();
1136 
1137   size_t expected_num_frames;
1138   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1139   std::string expected_frame_info;
1140   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
1141 
1142   std::string frame_info(DumpFrames(unwinder));
1143   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1144   EXPECT_EQ(expected_frame_info, frame_info);
1145   EXPECT_EQ(0x7112cb99bcULL, unwinder.frames()[0].pc);
1146   EXPECT_EQ(0x7112bdbbf0ULL, unwinder.frames()[0].sp);
1147   EXPECT_EQ(0x7112c394e8ULL, unwinder.frames()[1].pc);
1148   EXPECT_EQ(0x7112bdbbf0ULL, unwinder.frames()[1].sp);
1149   EXPECT_EQ(0x7112be28c0ULL, unwinder.frames()[2].pc);
1150   EXPECT_EQ(0x7112bdbda0ULL, unwinder.frames()[2].sp);
1151   EXPECT_EQ(0x71115ab3e8ULL, unwinder.frames()[3].pc);
1152   EXPECT_EQ(0x7fdd4a3f00ULL, unwinder.frames()[3].sp);
1153   EXPECT_EQ(0x5f739dc9fcULL, unwinder.frames()[4].pc);
1154   EXPECT_EQ(0x7fdd4a3fe0ULL, unwinder.frames()[4].sp);
1155   EXPECT_EQ(0x5f739edd80ULL, unwinder.frames()[5].pc);
1156   EXPECT_EQ(0x7fdd4a3ff0ULL, unwinder.frames()[5].sp);
1157   EXPECT_EQ(0x5f739ee24cULL, unwinder.frames()[6].pc);
1158   EXPECT_EQ(0x7fdd4a4010ULL, unwinder.frames()[6].sp);
1159   EXPECT_EQ(0x5f739ee558ULL, unwinder.frames()[7].pc);
1160   EXPECT_EQ(0x7fdd4a4040ULL, unwinder.frames()[7].sp);
1161   EXPECT_EQ(0x5f739f2ffcULL, unwinder.frames()[8].pc);
1162   EXPECT_EQ(0x7fdd4a4070ULL, unwinder.frames()[8].sp);
1163   EXPECT_EQ(0x5f739f2d9cULL, unwinder.frames()[9].pc);
1164   EXPECT_EQ(0x7fdd4a4100ULL, unwinder.frames()[9].sp);
1165   EXPECT_EQ(0x5f739dd4e4ULL, unwinder.frames()[10].pc);
1166   EXPECT_EQ(0x7fdd4a4130ULL, unwinder.frames()[10].sp);
1167   EXPECT_EQ(0x71115a6a34ULL, unwinder.frames()[11].pc);
1168   EXPECT_EQ(0x7fdd4a4170ULL, unwinder.frames()[11].sp);
1169 }
1170 
TEST_F(UnwindOfflineTest,eh_frame_bias_x86)1171 TEST_F(UnwindOfflineTest, eh_frame_bias_x86) {
1172   std::string error_msg;
1173   if (!offline_utils_.Init({.offline_files_dir = "eh_frame_bias_x86/", .arch = ARCH_X86},
1174                            &error_msg))
1175     FAIL() << error_msg;
1176 
1177   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
1178                     offline_utils_.GetProcessMemory());
1179   unwinder.Unwind();
1180 
1181   size_t expected_num_frames;
1182   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1183   std::string expected_frame_info;
1184   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
1185 
1186   std::string frame_info(DumpFrames(unwinder));
1187   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1188   EXPECT_EQ(expected_frame_info, frame_info);
1189   EXPECT_EQ(0xffffe430ULL, unwinder.frames()[0].pc);
1190   EXPECT_EQ(0xfffe1a30ULL, unwinder.frames()[0].sp);
1191   EXPECT_EQ(0xeb585a4bULL, unwinder.frames()[1].pc);
1192   EXPECT_EQ(0xfffe1a40ULL, unwinder.frames()[1].sp);
1193   EXPECT_EQ(0xeb5333a3ULL, unwinder.frames()[2].pc);
1194   EXPECT_EQ(0xfffe1a60ULL, unwinder.frames()[2].sp);
1195   EXPECT_EQ(0xeb5333edULL, unwinder.frames()[3].pc);
1196   EXPECT_EQ(0xfffe1ab0ULL, unwinder.frames()[3].sp);
1197   EXPECT_EQ(0xeb841ea2ULL, unwinder.frames()[4].pc);
1198   EXPECT_EQ(0xfffe1ae0ULL, unwinder.frames()[4].sp);
1199   EXPECT_EQ(0xeb83d5e7ULL, unwinder.frames()[5].pc);
1200   EXPECT_EQ(0xfffe1b30ULL, unwinder.frames()[5].sp);
1201   EXPECT_EQ(0xeb83d193ULL, unwinder.frames()[6].pc);
1202   EXPECT_EQ(0xfffe1bd0ULL, unwinder.frames()[6].sp);
1203   EXPECT_EQ(0xeb836c77ULL, unwinder.frames()[7].pc);
1204   EXPECT_EQ(0xfffe1c00ULL, unwinder.frames()[7].sp);
1205   EXPECT_EQ(0xeb518f66ULL, unwinder.frames()[8].pc);
1206   EXPECT_EQ(0xfffe1d00ULL, unwinder.frames()[8].sp);
1207   EXPECT_EQ(0xeb83460eULL, unwinder.frames()[9].pc);
1208   EXPECT_EQ(0xfffe1d40ULL, unwinder.frames()[9].sp);
1209   EXPECT_EQ(0x00000001ULL, unwinder.frames()[10].pc);
1210   EXPECT_EQ(0xfffe1d74ULL, unwinder.frames()[10].sp);
1211 }
1212 
TEST_F(UnwindOfflineTest,signal_load_bias_arm)1213 TEST_F(UnwindOfflineTest, signal_load_bias_arm) {
1214   std::string error_msg;
1215   if (!offline_utils_.Init({.offline_files_dir = "signal_load_bias_arm/", .arch = ARCH_ARM},
1216                            &error_msg))
1217     FAIL() << error_msg;
1218 
1219   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
1220                     offline_utils_.GetProcessMemory());
1221   unwinder.Unwind();
1222 
1223   size_t expected_num_frames;
1224   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1225   std::string expected_frame_info;
1226   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
1227 
1228   std::string frame_info(DumpFrames(unwinder));
1229   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1230   EXPECT_EQ(expected_frame_info, frame_info);
1231   EXPECT_EQ(0xb6955f9eULL, unwinder.frames()[0].pc);
1232   EXPECT_EQ(0xf2790ce8ULL, unwinder.frames()[0].sp);
1233   EXPECT_EQ(0xb6955fa7ULL, unwinder.frames()[1].pc);
1234   EXPECT_EQ(0xf2790ce8ULL, unwinder.frames()[1].sp);
1235   EXPECT_EQ(0xb6955fafULL, unwinder.frames()[2].pc);
1236   EXPECT_EQ(0xf2790cf0ULL, unwinder.frames()[2].sp);
1237   EXPECT_EQ(0xb695980bULL, unwinder.frames()[3].pc);
1238   EXPECT_EQ(0xf2790cf8ULL, unwinder.frames()[3].sp);
1239   EXPECT_EQ(0xf23febd4ULL, unwinder.frames()[4].pc);
1240   EXPECT_EQ(0xf2790d10ULL, unwinder.frames()[4].sp);
1241   EXPECT_EQ(0xb695601eULL, unwinder.frames()[5].pc);
1242   EXPECT_EQ(0xffe67798ULL, unwinder.frames()[5].sp);
1243   EXPECT_EQ(0xb6956633ULL, unwinder.frames()[6].pc);
1244   EXPECT_EQ(0xffe67890ULL, unwinder.frames()[6].sp);
1245   EXPECT_EQ(0xb695664bULL, unwinder.frames()[7].pc);
1246   EXPECT_EQ(0xffe678a0ULL, unwinder.frames()[7].sp);
1247   EXPECT_EQ(0xb6958711ULL, unwinder.frames()[8].pc);
1248   EXPECT_EQ(0xffe678b0ULL, unwinder.frames()[8].sp);
1249   EXPECT_EQ(0xb6958603ULL, unwinder.frames()[9].pc);
1250   EXPECT_EQ(0xffe67ac8ULL, unwinder.frames()[9].sp);
1251   EXPECT_EQ(0xb697ffe3ULL, unwinder.frames()[10].pc);
1252   EXPECT_EQ(0xffe67ad8ULL, unwinder.frames()[10].sp);
1253   EXPECT_EQ(0xb6980b25ULL, unwinder.frames()[11].pc);
1254   EXPECT_EQ(0xffe67ae8ULL, unwinder.frames()[11].sp);
1255   EXPECT_EQ(0xb6980e27ULL, unwinder.frames()[12].pc);
1256   EXPECT_EQ(0xffe67b18ULL, unwinder.frames()[12].sp);
1257   EXPECT_EQ(0xb698893dULL, unwinder.frames()[13].pc);
1258   EXPECT_EQ(0xffe67b48ULL, unwinder.frames()[13].sp);
1259   EXPECT_EQ(0xb698860bULL, unwinder.frames()[14].pc);
1260   EXPECT_EQ(0xffe67bb0ULL, unwinder.frames()[14].sp);
1261   EXPECT_EQ(0xb6995035ULL, unwinder.frames()[15].pc);
1262   EXPECT_EQ(0xffe67bd0ULL, unwinder.frames()[15].sp);
1263   EXPECT_EQ(0xf23fe155ULL, unwinder.frames()[16].pc);
1264   EXPECT_EQ(0xffe67d10ULL, unwinder.frames()[16].sp);
1265 }
1266 
TEST_F(UnwindOfflineTest,empty_arm64)1267 TEST_F(UnwindOfflineTest, empty_arm64) {
1268   std::string error_msg;
1269   if (!offline_utils_.Init({.offline_files_dir = "empty_arm64/", .arch = ARCH_ARM64}, &error_msg))
1270     FAIL() << error_msg;
1271 
1272   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
1273                     offline_utils_.GetProcessMemory());
1274   unwinder.Unwind();
1275 
1276   size_t expected_num_frames;
1277   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1278   std::string expected_frame_info;
1279   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
1280 
1281   std::string frame_info(DumpFrames(unwinder));
1282   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1283   EXPECT_EQ(expected_frame_info, frame_info);
1284   EXPECT_EQ(0x72a02203a4U, unwinder.frames()[0].pc);
1285   EXPECT_EQ(0x7ffb6c0b50U, unwinder.frames()[0].sp);
1286   EXPECT_EQ(0x72a01dd44cU, unwinder.frames()[1].pc);
1287   EXPECT_EQ(0x7ffb6c0b50U, unwinder.frames()[1].sp);
1288   EXPECT_EQ(0x729f759ce4U, unwinder.frames()[2].pc);
1289   EXPECT_EQ(0x7ffb6c0c50U, unwinder.frames()[2].sp);
1290   EXPECT_EQ(0x729f759e98U, unwinder.frames()[3].pc);
1291   EXPECT_EQ(0x7ffb6c0ce0U, unwinder.frames()[3].sp);
1292   EXPECT_EQ(0x729f75a6acU, unwinder.frames()[4].pc);
1293   EXPECT_EQ(0x7ffb6c0d10U, unwinder.frames()[4].sp);
1294   EXPECT_EQ(0x5d478af3b0U, unwinder.frames()[5].pc);
1295   EXPECT_EQ(0x7ffb6c0d40U, unwinder.frames()[5].sp);
1296   EXPECT_EQ(0x72a01cf594U, unwinder.frames()[6].pc);
1297   EXPECT_EQ(0x7ffb6c0f30U, unwinder.frames()[6].sp);
1298 }
1299 
1300 // This test has a libc.so where the __restore has been changed so
1301 // that the signal handler match does not occur and it uses the
1302 // fde to do the unwind.
TEST_F(UnwindOfflineTest,signal_fde_x86)1303 TEST_F(UnwindOfflineTest, signal_fde_x86) {
1304   std::string error_msg;
1305   if (!offline_utils_.Init({.offline_files_dir = "signal_fde_x86/", .arch = ARCH_X86}, &error_msg))
1306     FAIL() << error_msg;
1307 
1308   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
1309                     offline_utils_.GetProcessMemory());
1310   unwinder.Unwind();
1311 
1312   size_t expected_num_frames;
1313   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1314   std::string expected_frame_info;
1315   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
1316 
1317   std::string frame_info(DumpFrames(unwinder));
1318   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1319   EXPECT_EQ(expected_frame_info, frame_info);
1320   EXPECT_EQ(0x5ae0d4d9U, unwinder.frames()[0].pc);
1321   EXPECT_EQ(0xecb37188U, unwinder.frames()[0].sp);
1322   EXPECT_EQ(0x5ae0d4fcU, unwinder.frames()[1].pc);
1323   EXPECT_EQ(0xecb37190U, unwinder.frames()[1].sp);
1324   EXPECT_EQ(0x5ae0d52cU, unwinder.frames()[2].pc);
1325   EXPECT_EQ(0xecb371b0U, unwinder.frames()[2].sp);
1326   EXPECT_EQ(0x5ae16f62U, unwinder.frames()[3].pc);
1327   EXPECT_EQ(0xecb371d0U, unwinder.frames()[3].sp);
1328   EXPECT_EQ(0xec169fb0U, unwinder.frames()[4].pc);
1329   EXPECT_EQ(0xecb371f0U, unwinder.frames()[4].sp);
1330   EXPECT_EQ(0x0U, unwinder.frames()[5].pc);
1331   EXPECT_EQ(0xffcfac6cU, unwinder.frames()[5].sp);
1332   EXPECT_EQ(0x5ae0d61aU, unwinder.frames()[6].pc);
1333   EXPECT_EQ(0xffcfac6cU, unwinder.frames()[6].sp);
1334   EXPECT_EQ(0x5ae0e3aaU, unwinder.frames()[7].pc);
1335   EXPECT_EQ(0xffcfad60U, unwinder.frames()[7].sp);
1336   EXPECT_EQ(0x5ae0e3eaU, unwinder.frames()[8].pc);
1337   EXPECT_EQ(0xffcfad90U, unwinder.frames()[8].sp);
1338   EXPECT_EQ(0x5ae13444U, unwinder.frames()[9].pc);
1339   EXPECT_EQ(0xffcfadc0U, unwinder.frames()[9].sp);
1340   EXPECT_EQ(0x5ae145b8U, unwinder.frames()[10].pc);
1341   EXPECT_EQ(0xffcfb020U, unwinder.frames()[10].sp);
1342   EXPECT_EQ(0x5ae93a19U, unwinder.frames()[11].pc);
1343   EXPECT_EQ(0xffcfb050U, unwinder.frames()[11].sp);
1344   EXPECT_EQ(0x5ae938c5U, unwinder.frames()[12].pc);
1345   EXPECT_EQ(0xffcfb090U, unwinder.frames()[12].sp);
1346   EXPECT_EQ(0x5ae94d3eU, unwinder.frames()[13].pc);
1347   EXPECT_EQ(0xffcfb0f0U, unwinder.frames()[13].sp);
1348   EXPECT_EQ(0x5ae958b4U, unwinder.frames()[14].pc);
1349   EXPECT_EQ(0xffcfb160U, unwinder.frames()[14].sp);
1350   EXPECT_EQ(0x5aea4cb0U, unwinder.frames()[15].pc);
1351   EXPECT_EQ(0xffcfb1d0U, unwinder.frames()[15].sp);
1352   EXPECT_EQ(0x5aea470fU, unwinder.frames()[16].pc);
1353   EXPECT_EQ(0xffcfb270U, unwinder.frames()[16].sp);
1354   EXPECT_EQ(0x5aebc31eU, unwinder.frames()[17].pc);
1355   EXPECT_EQ(0xffcfb2c0U, unwinder.frames()[17].sp);
1356   EXPECT_EQ(0x5aebb9e9U, unwinder.frames()[18].pc);
1357   EXPECT_EQ(0xffcfc3c0U, unwinder.frames()[18].sp);
1358   EXPECT_EQ(0xec161646U, unwinder.frames()[19].pc);
1359   EXPECT_EQ(0xffcfc3f0U, unwinder.frames()[19].sp);
1360 }
1361 
1362 // This test has a libc.so where the __restore_rt has been changed so
1363 // that the signal handler match does not occur and it uses the
1364 // fde to do the unwind.
TEST_F(UnwindOfflineTest,signal_fde_x86_64)1365 TEST_F(UnwindOfflineTest, signal_fde_x86_64) {
1366   std::string error_msg;
1367   if (!offline_utils_.Init({.offline_files_dir = "signal_fde_x86_64/", .arch = ARCH_X86_64},
1368                            &error_msg))
1369     FAIL() << error_msg;
1370 
1371   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
1372                     offline_utils_.GetProcessMemory());
1373   unwinder.Unwind();
1374 
1375   size_t expected_num_frames;
1376   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1377   std::string expected_frame_info;
1378   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
1379 
1380   std::string frame_info(DumpFrames(unwinder));
1381   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1382   EXPECT_EQ(expected_frame_info, frame_info);
1383   EXPECT_EQ(0x5bb41271e15bU, unwinder.frames()[0].pc);
1384   EXPECT_EQ(0x707eb5aa8320U, unwinder.frames()[0].sp);
1385   EXPECT_EQ(0x5bb41271e168U, unwinder.frames()[1].pc);
1386   EXPECT_EQ(0x707eb5aa8330U, unwinder.frames()[1].sp);
1387   EXPECT_EQ(0x5bb41271e178U, unwinder.frames()[2].pc);
1388   EXPECT_EQ(0x707eb5aa8340U, unwinder.frames()[2].sp);
1389   EXPECT_EQ(0x5bb412724c77U, unwinder.frames()[3].pc);
1390   EXPECT_EQ(0x707eb5aa8350U, unwinder.frames()[3].sp);
1391   EXPECT_EQ(0x707eb2ca5d10U, unwinder.frames()[4].pc);
1392   EXPECT_EQ(0x707eb5aa8380U, unwinder.frames()[4].sp);
1393   EXPECT_EQ(0x0U, unwinder.frames()[5].pc);
1394   EXPECT_EQ(0x7ffcaadde078U, unwinder.frames()[5].sp);
1395   EXPECT_EQ(0x5bb41271e244U, unwinder.frames()[6].pc);
1396   EXPECT_EQ(0x7ffcaadde078U, unwinder.frames()[6].sp);
1397   EXPECT_EQ(0x5bb41271eb44U, unwinder.frames()[7].pc);
1398   EXPECT_EQ(0x7ffcaadde1a0U, unwinder.frames()[7].sp);
1399   EXPECT_EQ(0x5bb41271eb64U, unwinder.frames()[8].pc);
1400   EXPECT_EQ(0x7ffcaadde1c0U, unwinder.frames()[8].sp);
1401   EXPECT_EQ(0x5bb412722457U, unwinder.frames()[9].pc);
1402   EXPECT_EQ(0x7ffcaadde1e0U, unwinder.frames()[9].sp);
1403   EXPECT_EQ(0x5bb412722f67U, unwinder.frames()[10].pc);
1404   EXPECT_EQ(0x7ffcaadde510U, unwinder.frames()[10].sp);
1405   EXPECT_EQ(0x5bb412773c38U, unwinder.frames()[11].pc);
1406   EXPECT_EQ(0x7ffcaadde530U, unwinder.frames()[11].sp);
1407   EXPECT_EQ(0x5bb412774f9aU, unwinder.frames()[12].pc);
1408   EXPECT_EQ(0x7ffcaadde560U, unwinder.frames()[12].sp);
1409   EXPECT_EQ(0x5bb412775a46U, unwinder.frames()[13].pc);
1410   EXPECT_EQ(0x7ffcaadde5b0U, unwinder.frames()[13].sp);
1411   EXPECT_EQ(0x5bb4127844c6U, unwinder.frames()[14].pc);
1412   EXPECT_EQ(0x7ffcaadde5f0U, unwinder.frames()[14].sp);
1413   EXPECT_EQ(0x5bb412783f61U, unwinder.frames()[15].pc);
1414   EXPECT_EQ(0x7ffcaadde6c0U, unwinder.frames()[15].sp);
1415   EXPECT_EQ(0x5bb41279a155U, unwinder.frames()[16].pc);
1416   EXPECT_EQ(0x7ffcaadde720U, unwinder.frames()[16].sp);
1417   EXPECT_EQ(0x707eb2c9c405U, unwinder.frames()[17].pc);
1418   EXPECT_EQ(0x7ffcaaddf870U, unwinder.frames()[17].sp);
1419 }
1420 
TEST_F(UnwindOfflineTest,pauth_pc_arm64)1421 TEST_F(UnwindOfflineTest, pauth_pc_arm64) {
1422   std::string error_msg;
1423   if (!offline_utils_.Init({.offline_files_dir = "pauth_pc_arm64/", .arch = ARCH_ARM64},
1424                            &error_msg))
1425     FAIL() << error_msg;
1426 
1427   static_cast<RegsArm64*>(offline_utils_.GetRegs())->SetPACMask(0x007fff8000000000ULL);
1428 
1429   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
1430                     offline_utils_.GetProcessMemory());
1431   unwinder.Unwind();
1432 
1433   size_t expected_num_frames;
1434   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1435   std::string expected_frame_info;
1436   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
1437 
1438   std::string frame_info(DumpFrames(unwinder));
1439   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1440   EXPECT_EQ(expected_frame_info, frame_info);
1441   EXPECT_EQ(0x5c390884a8U, unwinder.frames()[0].pc);
1442   EXPECT_EQ(0x7ff3511750U, unwinder.frames()[0].sp);
1443   EXPECT_EQ(0x5c39088270U, unwinder.frames()[1].pc);
1444   EXPECT_EQ(0x7ff3511770U, unwinder.frames()[1].sp);
1445   EXPECT_EQ(0x5c39074640U, unwinder.frames()[2].pc);
1446   EXPECT_EQ(0x7ff3511930U, unwinder.frames()[2].sp);
1447   EXPECT_EQ(0x5c39074588U, unwinder.frames()[3].pc);
1448   EXPECT_EQ(0x7ff3511960U, unwinder.frames()[3].sp);
1449   EXPECT_EQ(0x5c390746a8U, unwinder.frames()[4].pc);
1450   EXPECT_EQ(0x7ff35119a0U, unwinder.frames()[4].sp);
1451   EXPECT_EQ(0x5c39074588U, unwinder.frames()[5].pc);
1452   EXPECT_EQ(0x7ff35119d0U, unwinder.frames()[5].sp);
1453   EXPECT_EQ(0x5c390746a8U, unwinder.frames()[6].pc);
1454   EXPECT_EQ(0x7ff3511a10U, unwinder.frames()[6].sp);
1455   EXPECT_EQ(0x5c39074588U, unwinder.frames()[7].pc);
1456   EXPECT_EQ(0x7ff3511a40U, unwinder.frames()[7].sp);
1457   EXPECT_EQ(0x5c390746a8U, unwinder.frames()[8].pc);
1458   EXPECT_EQ(0x7ff3511a80U, unwinder.frames()[8].sp);
1459   EXPECT_EQ(0x5c39074588U, unwinder.frames()[9].pc);
1460   EXPECT_EQ(0x7ff3511ab0U, unwinder.frames()[9].sp);
1461   EXPECT_EQ(0x5c390746a8U, unwinder.frames()[10].pc);
1462   EXPECT_EQ(0x7ff3511af0U, unwinder.frames()[10].sp);
1463   EXPECT_EQ(0x5c39074588U, unwinder.frames()[11].pc);
1464   EXPECT_EQ(0x7ff3511b20U, unwinder.frames()[11].sp);
1465   EXPECT_EQ(0x5c390746a8U, unwinder.frames()[12].pc);
1466   EXPECT_EQ(0x7ff3511b60U, unwinder.frames()[12].sp);
1467   EXPECT_EQ(0x5c39074588U, unwinder.frames()[13].pc);
1468   EXPECT_EQ(0x7ff3511b90U, unwinder.frames()[13].sp);
1469   EXPECT_EQ(0x5c390746a8U, unwinder.frames()[14].pc);
1470   EXPECT_EQ(0x7ff3511bd0U, unwinder.frames()[14].sp);
1471   EXPECT_EQ(0x5c39074588U, unwinder.frames()[15].pc);
1472   EXPECT_EQ(0x7ff3511c00U, unwinder.frames()[15].sp);
1473   EXPECT_EQ(0x5c390746a8U, unwinder.frames()[16].pc);
1474   EXPECT_EQ(0x7ff3511c40U, unwinder.frames()[16].sp);
1475   EXPECT_EQ(0x5c39074588U, unwinder.frames()[17].pc);
1476   EXPECT_EQ(0x7ff3511c70U, unwinder.frames()[17].sp);
1477   EXPECT_EQ(0x5c390746a8U, unwinder.frames()[18].pc);
1478   EXPECT_EQ(0x7ff3511cb0U, unwinder.frames()[18].sp);
1479   EXPECT_EQ(0x5c39074588U, unwinder.frames()[19].pc);
1480   EXPECT_EQ(0x7ff3511ce0U, unwinder.frames()[19].sp);
1481   EXPECT_EQ(0x5c390746a8U, unwinder.frames()[20].pc);
1482   EXPECT_EQ(0x7ff3511d20U, unwinder.frames()[20].sp);
1483   EXPECT_EQ(0x5c39086e54U, unwinder.frames()[21].pc);
1484   EXPECT_EQ(0x7ff3511d50U, unwinder.frames()[21].sp);
1485   EXPECT_EQ(0x5c3907c834U, unwinder.frames()[22].pc);
1486   EXPECT_EQ(0x7ff3511db0U, unwinder.frames()[22].sp);
1487   EXPECT_EQ(0x5c3907c2ccU, unwinder.frames()[23].pc);
1488   EXPECT_EQ(0x7ff3511dc0U, unwinder.frames()[23].sp);
1489   EXPECT_EQ(0x5c3907c8b4U, unwinder.frames()[24].pc);
1490   EXPECT_EQ(0x7ff3511e40U, unwinder.frames()[24].sp);
1491   EXPECT_EQ(0x7e4ede29d8U, unwinder.frames()[25].pc);
1492   EXPECT_EQ(0x7ff3511e70U, unwinder.frames()[25].sp);
1493 }
1494 
TEST_F(UnwindOfflineTest,profiler_like_multi_process)1495 TEST_F(UnwindOfflineTest, profiler_like_multi_process) {
1496   ConsecutiveUnwindTest(std::vector<UnwindSampleInfo>{
1497       {.offline_files_dir = "bluetooth_arm64/pc_1/", .arch = ARCH_ARM64},
1498       {.offline_files_dir = "jit_debug_arm/",
1499        .arch = ARCH_ARM,
1500        .memory_flag = ProcessMemoryFlag::kIncludeJitMemory},
1501       {.offline_files_dir = "photos_reset_arm64/", .arch = ARCH_ARM64},
1502       {.offline_files_dir = "youtube_compiled_arm64/", .arch = ARCH_ARM64},
1503       {.offline_files_dir = "yt_music_arm64/", .arch = ARCH_ARM64},
1504       {.offline_files_dir = "maps_compiled_arm64/28656_oat_odex_jar/", .arch = ARCH_ARM64}});
1505 }
1506 
TEST_F(UnwindOfflineTest,profiler_like_single_process_multi_thread)1507 TEST_F(UnwindOfflineTest, profiler_like_single_process_multi_thread) {
1508   ConsecutiveUnwindTest(std::vector<UnwindSampleInfo>{
1509       {.offline_files_dir = "maps_compiled_arm64/28656_oat_odex_jar/", .arch = ARCH_ARM64},
1510       {.offline_files_dir = "maps_compiled_arm64/28613_main-thread/", .arch = ARCH_ARM64},
1511       {.offline_files_dir = "maps_compiled_arm64/28644/", .arch = ARCH_ARM64},
1512       {.offline_files_dir = "maps_compiled_arm64/28648/", .arch = ARCH_ARM64},
1513       {.offline_files_dir = "maps_compiled_arm64/28667/", .arch = ARCH_ARM64}});
1514 }
1515 
TEST_F(UnwindOfflineTest,profiler_like_single_thread_diverse_pcs)1516 TEST_F(UnwindOfflineTest, profiler_like_single_thread_diverse_pcs) {
1517   ConsecutiveUnwindTest(std::vector<UnwindSampleInfo>{
1518       {.offline_files_dir = "bluetooth_arm64/pc_1/", .arch = ARCH_ARM64},
1519       {.offline_files_dir = "bluetooth_arm64/pc_2/", .arch = ARCH_ARM64},
1520       {.offline_files_dir = "bluetooth_arm64/pc_3/", .arch = ARCH_ARM64},
1521       {.offline_files_dir = "bluetooth_arm64/pc_4/", .arch = ARCH_ARM64}});
1522 }
1523 
VerifyApkRORX(Unwinder & unwinder)1524 static void VerifyApkRORX(Unwinder& unwinder) {
1525   EXPECT_EQ(0x7426d2e030U, unwinder.frames()[0].pc);
1526   EXPECT_EQ(0x7fe740cc90U, unwinder.frames()[0].sp);
1527   EXPECT_EQ(0x7426d2e08cU, unwinder.frames()[1].pc);
1528   EXPECT_EQ(0x7fe740ccd0U, unwinder.frames()[1].sp);
1529   EXPECT_EQ(0x7426d2e0b8U, unwinder.frames()[2].pc);
1530   EXPECT_EQ(0x7fe740ccf0U, unwinder.frames()[2].sp);
1531   EXPECT_EQ(0x7426d2e0e4U, unwinder.frames()[3].pc);
1532   EXPECT_EQ(0x7fe740cd10U, unwinder.frames()[3].sp);
1533   EXPECT_EQ(0x603b0c5154U, unwinder.frames()[4].pc);
1534   EXPECT_EQ(0x7fe740cd30U, unwinder.frames()[4].sp);
1535   EXPECT_EQ(0x76b6df0b10U, unwinder.frames()[5].pc);
1536   EXPECT_EQ(0x7fe740cdb0U, unwinder.frames()[5].sp);
1537 }
1538 
TEST_F(UnwindOfflineTest,apk_rorx_arm64)1539 TEST_F(UnwindOfflineTest, apk_rorx_arm64) {
1540   std::string error_msg;
1541   if (!offline_utils_.Init({.offline_files_dir = "apk_rorx_arm64/", .arch = ARCH_ARM64},
1542                            &error_msg))
1543     FAIL() << error_msg;
1544 
1545   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
1546                     offline_utils_.GetProcessMemory());
1547   unwinder.Unwind();
1548 
1549   size_t expected_num_frames;
1550   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1551   std::string expected_frame_info;
1552   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
1553 
1554   std::string frame_info(DumpFrames(unwinder));
1555   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1556   EXPECT_EQ(expected_frame_info, frame_info);
1557 
1558   VerifyApkRORX(unwinder);
1559 }
1560 
TEST_F(UnwindOfflineTest,apk_rorx_unreadable_arm64)1561 TEST_F(UnwindOfflineTest, apk_rorx_unreadable_arm64) {
1562   std::string error_msg;
1563   if (!offline_utils_.Init({.offline_files_dir = "apk_rorx_unreadable_arm64/", .arch = ARCH_ARM64},
1564                            &error_msg))
1565     FAIL() << error_msg;
1566 
1567   // Create a process memory object that holds the apk data in memory
1568   // along with the stack data.
1569   MemoryOffline* stack_memory = new MemoryOffline;
1570   ASSERT_TRUE(stack_memory->Init("stack.data", 0));
1571 
1572   MemoryOffline* apk_memory = new MemoryOffline;
1573   auto info1 = offline_utils_.GetMaps()->Find(0x7426d2d000);
1574   ASSERT_TRUE(info1 != nullptr);
1575   auto info2 = offline_utils_.GetMaps()->Find(0x7426d2e000);
1576   ASSERT_TRUE(info2 != nullptr);
1577   ASSERT_TRUE(
1578       apk_memory->Init("fake.apk", info1->offset(), info1->start(), info2->end() - info1->start()));
1579 
1580   std::unique_ptr<MemoryOfflineParts> parts(new MemoryOfflineParts);
1581   parts->Add(stack_memory);
1582   parts->Add(apk_memory);
1583 
1584   std::shared_ptr<Memory> process_memory(parts.release());
1585 
1586   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(), process_memory);
1587   unwinder.Unwind();
1588 
1589   size_t expected_num_frames;
1590   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1591   std::string expected_frame_info;
1592   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
1593 
1594   std::string frame_info(DumpFrames(unwinder));
1595   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1596   EXPECT_EQ(expected_frame_info, frame_info);
1597 
1598   VerifyApkRORX(unwinder);
1599 }
1600 
VerifyApkRX(Unwinder & unwinder)1601 static void VerifyApkRX(Unwinder& unwinder) {
1602   EXPECT_EQ(0x7cb0e6266cU, unwinder.frames()[0].pc);
1603   EXPECT_EQ(0x7fe563be90U, unwinder.frames()[0].sp);
1604   EXPECT_EQ(0x7cb0e626c0U, unwinder.frames()[1].pc);
1605   EXPECT_EQ(0x7fe563bed0U, unwinder.frames()[1].sp);
1606   EXPECT_EQ(0x7cb0e626ecU, unwinder.frames()[2].pc);
1607   EXPECT_EQ(0x7fe563bef0U, unwinder.frames()[2].sp);
1608   EXPECT_EQ(0x7cb0e62718U, unwinder.frames()[3].pc);
1609   EXPECT_EQ(0x7fe563bf10U, unwinder.frames()[3].sp);
1610   EXPECT_EQ(0x5e004f0154U, unwinder.frames()[4].pc);
1611   EXPECT_EQ(0x7fe563bf30U, unwinder.frames()[4].sp);
1612   EXPECT_EQ(0x7f41124b10U, unwinder.frames()[5].pc);
1613   EXPECT_EQ(0x7fe563bfb0U, unwinder.frames()[5].sp);
1614 }
1615 
TEST_F(UnwindOfflineTest,apk_rx_arm64)1616 TEST_F(UnwindOfflineTest, apk_rx_arm64) {
1617   std::string error_msg;
1618   if (!offline_utils_.Init({.offline_files_dir = "apk_rx_arm64/", .arch = ARCH_ARM64}, &error_msg))
1619     FAIL() << error_msg;
1620 
1621   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(),
1622                     offline_utils_.GetProcessMemory());
1623   unwinder.Unwind();
1624 
1625   size_t expected_num_frames;
1626   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1627   std::string expected_frame_info;
1628   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
1629 
1630   std::string frame_info(DumpFrames(unwinder));
1631   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1632   EXPECT_EQ(expected_frame_info, frame_info);
1633 
1634   VerifyApkRX(unwinder);
1635 }
1636 
TEST_F(UnwindOfflineTest,apk_rx_unreadable_arm64)1637 TEST_F(UnwindOfflineTest, apk_rx_unreadable_arm64) {
1638   std::string error_msg;
1639   if (!offline_utils_.Init({.offline_files_dir = "apk_rx_unreadable_arm64/", .arch = ARCH_ARM64},
1640                            &error_msg))
1641     FAIL() << error_msg;
1642 
1643   // Create a process memory object that holds the apk data in memory
1644   // along with the stack data.
1645   MemoryOffline* stack_memory = new MemoryOffline;
1646   ASSERT_TRUE(stack_memory->Init("stack.data", 0));
1647 
1648   MemoryOffline* apk_memory = new MemoryOffline;
1649   auto info = offline_utils_.GetMaps()->Find(0x7cb0e62000);
1650   ASSERT_TRUE(info != nullptr);
1651   ASSERT_TRUE(
1652       apk_memory->Init("fake.apk", info->offset(), info->start(), info->end() - info->start()));
1653 
1654   std::unique_ptr<MemoryOfflineParts> parts(new MemoryOfflineParts);
1655   parts->Add(stack_memory);
1656   parts->Add(apk_memory);
1657 
1658   std::shared_ptr<Memory> process_memory(parts.release());
1659 
1660   Unwinder unwinder(128, offline_utils_.GetMaps(), offline_utils_.GetRegs(), process_memory);
1661   unwinder.Unwind();
1662 
1663   size_t expected_num_frames;
1664   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1665   std::string expected_frame_info;
1666   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
1667 
1668   std::string frame_info(DumpFrames(unwinder));
1669   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1670   EXPECT_EQ(expected_frame_info, frame_info);
1671 
1672   VerifyApkRX(unwinder);
1673 }
1674 
TEST_F(UnwindOfflineTest,apk_soname_at_end_arm64)1675 TEST_F(UnwindOfflineTest, apk_soname_at_end_arm64) {
1676   std::string error_msg;
1677   if (!offline_utils_.Init({.offline_files_dir = "apk_soname_at_end_arm64/", .arch = ARCH_ARM64},
1678                            &error_msg))
1679     FAIL() << error_msg;
1680 
1681   Regs* regs = offline_utils_.GetRegs();
1682   std::unique_ptr<Regs> regs_copy(regs->Clone());
1683   Unwinder unwinder(128, offline_utils_.GetMaps(), regs, offline_utils_.GetProcessMemory());
1684   unwinder.Unwind();
1685 
1686   size_t expected_num_frames;
1687   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1688   std::string expected_frame_info;
1689   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
1690 
1691   std::string frame_info(DumpFrames(unwinder));
1692   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1693   EXPECT_EQ(expected_frame_info, frame_info);
1694   EXPECT_EQ(0x7c0064b13cULL, unwinder.frames()[0].pc);
1695   EXPECT_EQ(0x7ff9ec4b90ULL, unwinder.frames()[0].sp);
1696   EXPECT_EQ(0x580e17d0f0ULL, unwinder.frames()[1].pc);
1697   EXPECT_EQ(0x7ff9ec4bb0ULL, unwinder.frames()[1].sp);
1698   EXPECT_EQ(0x7e908c9cc8ULL, unwinder.frames()[2].pc);
1699   EXPECT_EQ(0x7ff9ec4c10ULL, unwinder.frames()[2].sp);
1700 }
1701 
1702 // Unwind through libraries with debug_frames compressed with zstd.
TEST_F(UnwindOfflineTest,zstd_compress_arm)1703 TEST_F(UnwindOfflineTest, zstd_compress_arm) {
1704   std::string error_msg;
1705   if (!offline_utils_.Init({.offline_files_dir = "zstd_compress_arm/", .arch = ARCH_ARM},
1706                            &error_msg))
1707     FAIL() << error_msg;
1708 
1709   Regs* regs = offline_utils_.GetRegs();
1710   std::unique_ptr<Regs> regs_copy(regs->Clone());
1711   Unwinder unwinder(128, offline_utils_.GetMaps(), regs, offline_utils_.GetProcessMemory());
1712   unwinder.Unwind();
1713 
1714   size_t expected_num_frames;
1715   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1716   std::string expected_frame_info;
1717   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
1718 
1719   std::string frame_info(DumpFrames(unwinder));
1720   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1721   EXPECT_EQ(expected_frame_info, frame_info);
1722   EXPECT_EQ(0xf7868324ULL, unwinder.frames()[0].pc);
1723   EXPECT_EQ(0xf779eae0ULL, unwinder.frames()[0].sp);
1724   EXPECT_EQ(0xf77dd1e3ULL, unwinder.frames()[1].pc);
1725   EXPECT_EQ(0xf779eaf0ULL, unwinder.frames()[1].sp);
1726   EXPECT_EQ(0xf786dc40ULL, unwinder.frames()[2].pc);
1727   EXPECT_EQ(0xf779ec90ULL, unwinder.frames()[2].sp);
1728   EXPECT_EQ(0xf6ebeeaeULL, unwinder.frames()[3].pc);
1729   EXPECT_EQ(0xff7fa398ULL, unwinder.frames()[3].sp);
1730   EXPECT_EQ(0xbafff4fULL, unwinder.frames()[4].pc);
1731   EXPECT_EQ(0xff7fa468ULL, unwinder.frames()[4].sp);
1732   EXPECT_EQ(0xbb00337ULL, unwinder.frames()[5].pc);
1733   EXPECT_EQ(0xff7fa478ULL, unwinder.frames()[5].sp);
1734   EXPECT_EQ(0xbb01191ULL, unwinder.frames()[6].pc);
1735   EXPECT_EQ(0xff7fa568ULL, unwinder.frames()[6].sp);
1736 }
1737 
1738 // Unwind through libraries with debug_frames compressed with zlib.
TEST_F(UnwindOfflineTest,zlib_compress_arm)1739 TEST_F(UnwindOfflineTest, zlib_compress_arm) {
1740   std::string error_msg;
1741   if (!offline_utils_.Init({.offline_files_dir = "zlib_compress_arm/", .arch = ARCH_ARM},
1742                            &error_msg))
1743     FAIL() << error_msg;
1744 
1745   Regs* regs = offline_utils_.GetRegs();
1746   std::unique_ptr<Regs> regs_copy(regs->Clone());
1747   Unwinder unwinder(128, offline_utils_.GetMaps(), regs, offline_utils_.GetProcessMemory());
1748   unwinder.Unwind();
1749 
1750   size_t expected_num_frames;
1751   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1752   std::string expected_frame_info;
1753   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
1754 
1755   std::string frame_info(DumpFrames(unwinder));
1756   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1757   EXPECT_EQ(expected_frame_info, frame_info);
1758   EXPECT_EQ(0xed8dc324ULL, unwinder.frames()[0].pc);
1759   EXPECT_EQ(0xed812ae0ULL, unwinder.frames()[0].sp);
1760   EXPECT_EQ(0xed8511f5ULL, unwinder.frames()[1].pc);
1761   EXPECT_EQ(0xed812af0ULL, unwinder.frames()[1].sp);
1762   EXPECT_EQ(0xed8e1c40ULL, unwinder.frames()[2].pc);
1763   EXPECT_EQ(0xed812c90ULL, unwinder.frames()[2].sp);
1764   EXPECT_EQ(0xecfc2eaeULL, unwinder.frames()[3].pc);
1765   EXPECT_EQ(0xff96c328ULL, unwinder.frames()[3].sp);
1766   EXPECT_EQ(0x2d72f4fULL, unwinder.frames()[4].pc);
1767   EXPECT_EQ(0xff96c3f8ULL, unwinder.frames()[4].sp);
1768   EXPECT_EQ(0x2d73337ULL, unwinder.frames()[5].pc);
1769   EXPECT_EQ(0xff96c408ULL, unwinder.frames()[5].sp);
1770   EXPECT_EQ(0x2d74191ULL, unwinder.frames()[6].pc);
1771   EXPECT_EQ(0xff96c4f8ULL, unwinder.frames()[6].sp);
1772 }
1773 
1774 // Make sure that an unwind using vlenb works properly.
TEST_F(UnwindOfflineTest,vlenb_riscv64)1775 TEST_F(UnwindOfflineTest, vlenb_riscv64) {
1776   std::string error_msg;
1777   if (!offline_utils_.Init({.offline_files_dir = "vlenb_riscv64/", .arch = ARCH_RISCV64},
1778                            &error_msg))
1779     FAIL() << error_msg;
1780 
1781   Regs* regs = offline_utils_.GetRegs();
1782   std::unique_ptr<Regs> regs_copy(regs->Clone());
1783   Unwinder unwinder(128, offline_utils_.GetMaps(), regs, offline_utils_.GetProcessMemory());
1784   unwinder.Unwind();
1785 
1786   size_t expected_num_frames;
1787   if (!offline_utils_.GetExpectedNumFrames(&expected_num_frames, &error_msg)) FAIL() << error_msg;
1788   std::string expected_frame_info;
1789   if (!GetExpectedSamplesFrameInfo(&expected_frame_info, &error_msg)) FAIL() << error_msg;
1790 
1791   std::string frame_info(DumpFrames(unwinder));
1792   ASSERT_EQ(expected_num_frames, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
1793   EXPECT_EQ(expected_frame_info, frame_info);
1794   EXPECT_EQ(0x555c440735dcULL, unwinder.frames()[0].pc);
1795   EXPECT_EQ(0x7fffe388a680ULL, unwinder.frames()[0].sp);
1796   EXPECT_EQ(0x555c4408bdfcULL, unwinder.frames()[1].pc);
1797   EXPECT_EQ(0x7fffe388a6a0ULL, unwinder.frames()[1].sp);
1798   EXPECT_EQ(0x555c4408cc76ULL, unwinder.frames()[2].pc);
1799   EXPECT_EQ(0x7fffe388a6e0ULL, unwinder.frames()[2].sp);
1800   EXPECT_EQ(0x555c4408d604ULL, unwinder.frames()[3].pc);
1801   EXPECT_EQ(0x7fffe388a730ULL, unwinder.frames()[3].sp);
1802   EXPECT_EQ(0x555c44099cd2ULL, unwinder.frames()[4].pc);
1803   EXPECT_EQ(0x7fffe388a7b0ULL, unwinder.frames()[4].sp);
1804   EXPECT_EQ(0x555c4409939eULL, unwinder.frames()[5].pc);
1805   EXPECT_EQ(0x7fffe388a930ULL, unwinder.frames()[5].sp);
1806   EXPECT_EQ(0x555c440a2c7cULL, unwinder.frames()[6].pc);
1807   EXPECT_EQ(0x7fffe388a970ULL, unwinder.frames()[6].sp);
1808   EXPECT_EQ(0x7ff2fdf27394ULL, unwinder.frames()[7].pc);
1809   EXPECT_EQ(0x7fffe388bb20ULL, unwinder.frames()[7].sp);
1810 }
1811 
1812 }  // namespace
1813 }  // namespace unwindstack
1814