1 /* 2 * Copyright (c) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #include <gtest/gtest.h> 17 #include <ctime> 18 #include <securec.h> 19 #include <string> 20 #include <vector> 21 22 #include "dfx_elf.h" 23 #include "dfx_maps.h" 24 #include "dfx_memory.h" 25 #include "dfx_regs.h" 26 #include "dfx_regs_get.h" 27 #include "dfx_symbols.h" 28 #include "dfx_ptrace.h" 29 #include "dfx_test_util.h" 30 #include "dwarf_define.h" 31 #include "stack_util.h" 32 33 using namespace OHOS::HiviewDFX; 34 using namespace testing::ext; 35 using namespace std; 36 37 namespace OHOS { 38 namespace HiviewDFX { 39 class DfxMemoryTest : public testing::Test { 40 public: SetUpTestCase(void)41 static void SetUpTestCase(void) {} TearDownTestCase(void)42 static void TearDownTestCase(void) {} SetUp()43 void SetUp() {} TearDown()44 void TearDown() {} 45 }; 46 47 namespace { 48 /** 49 * @tc.name: DfxMemoryTest001 50 * @tc.desc: test DfxMemory class ReadReg 51 * @tc.type: FUNC 52 */ 53 HWTEST_F(DfxMemoryTest, DfxMemoryTest001, TestSize.Level2) 54 { 55 GTEST_LOG_(INFO) << "DfxMemoryTest001: start."; 56 uintptr_t regs[] = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa}; 57 UnwindContext ctx; 58 ctx.regs = DfxRegs::CreateFromRegs(UnwindMode::DWARF_UNWIND, regs, sizeof(regs) / sizeof(regs[0])); 59 auto acc = std::make_shared<DfxAccessorsLocal>(); 60 auto memory = std::make_shared<DfxMemory>(acc); 61 memory->SetCtx(&ctx); 62 uintptr_t value; 63 bool ret = memory->ReadReg(0, &value); 64 EXPECT_EQ(true, ret) << "DfxMemoryTest001: ret" << ret; 65 EXPECT_EQ(static_cast<uintptr_t>(0x1), value) << "DfxMemoryTest001: value" << value; 66 GTEST_LOG_(INFO) << "DfxMemoryTest001: end."; 67 } 68 69 /** 70 * @tc.name: DfxMemoryTest002 71 * @tc.desc: test DfxMemory class Read 72 * @tc.type: FUNC 73 */ 74 HWTEST_F(DfxMemoryTest, DfxMemoryTest002, TestSize.Level2) 75 { 76 GTEST_LOG_(INFO) << "DfxMemoryTest002: start."; 77 uint8_t values[] = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8}; 78 79 uintptr_t addr = reinterpret_cast<uintptr_t>(&values[0]); 80 uintptr_t value; 81 auto acc = std::make_shared<DfxAccessorsLocal>(); 82 auto memory = std::make_shared<DfxMemory>(acc); 83 bool ret = memory->ReadUptr(addr, &value, false); 84 EXPECT_EQ(true, ret) << "DfxMemoryTest002: ret:" << ret; 85 86 87 uint64_t tmp; 88 memory->Read(addr, &tmp, sizeof(uint8_t), false); 89 ASSERT_EQ(tmp, 0x01); 90 91 memory->Read(addr, &tmp, sizeof(uint16_t), false); 92 ASSERT_EQ(tmp, 0x0201); 93 94 memory->Read(addr, &tmp, sizeof(uint32_t), false); 95 ASSERT_EQ(tmp, 0x04030201); 96 97 memory->Read(addr, &tmp, sizeof(uint64_t), false); 98 ASSERT_EQ(tmp, 0x0807060504030201); 99 100 GTEST_LOG_(INFO) << "DfxMemoryTest002: end."; 101 } 102 103 /** 104 * @tc.name: DfxMemoryTest003 105 * @tc.desc: test DfxMemory class Read 106 * @tc.type: FUNC 107 */ 108 HWTEST_F(DfxMemoryTest, DfxMemoryTest003, TestSize.Level2) 109 { 110 GTEST_LOG_(INFO) << "DfxMemoryTest003: start."; 111 uint8_t values[] = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8}; 112 UnwindContext ctx; 113 auto acc = std::make_shared<DfxAccessorsLocal>(); 114 ASSERT_TRUE(GetSelfStackRange(ctx.stackBottom, ctx.stackTop)); 115 auto memory = std::make_shared<DfxMemory>(acc); 116 memory->SetCtx(&ctx); 117 uintptr_t addr = reinterpret_cast<uintptr_t>(&values[0]); 118 uintptr_t value; 119 ASSERT_TRUE(memory->ReadUptr(addr, &value, false)); 120 #if defined(__arm__) 121 ASSERT_EQ(value, 0x04030201); 122 #elif defined(__aarch64__) 123 ASSERT_EQ(value, 0x0807060504030201); 124 #endif 125 126 uint64_t tmp; 127 ASSERT_TRUE(memory->Read(addr, &tmp, sizeof(uint8_t), false)); 128 ASSERT_EQ(tmp, 0x01); 129 130 ASSERT_TRUE(memory->Read(addr, &tmp, sizeof(uint16_t), false)); 131 ASSERT_EQ(tmp, 0x0201); 132 133 ASSERT_TRUE(memory->Read(addr, &tmp, sizeof(uint32_t), false)); 134 ASSERT_EQ(tmp, 0x04030201); 135 136 ASSERT_TRUE(memory->Read(addr, &tmp, sizeof(uint64_t), false)); 137 ASSERT_EQ(tmp, 0x0807060504030201); 138 139 GTEST_LOG_(INFO) << "DfxMemoryTest003: end."; 140 } 141 142 /** 143 * @tc.name: DfxMemoryTest004 144 * @tc.desc: test DfxMemory class Read 145 * @tc.type: FUNC 146 */ 147 HWTEST_F(DfxMemoryTest, DfxMemoryTest004, TestSize.Level2) 148 { 149 GTEST_LOG_(INFO) << "DfxMemoryTest004: start."; 150 uint8_t values[] = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8}; 151 UnwindContext ctx; 152 auto acc = std::make_shared<DfxAccessorsLocal>(); 153 ASSERT_TRUE(GetSelfStackRange(ctx.stackBottom, ctx.stackTop)); 154 auto memory = std::make_shared<DfxMemory>(acc); 155 memory->SetCtx(&ctx); 156 uintptr_t addr = reinterpret_cast<uintptr_t>(&values[0]); 157 uint8_t tmp8; 158 ASSERT_TRUE(memory->ReadU8(addr, &tmp8, false)); 159 ASSERT_EQ(tmp8, 0x01); 160 uint16_t tmp16; 161 ASSERT_TRUE(memory->ReadU16(addr, &tmp16, false)); 162 ASSERT_EQ(tmp16, 0x0201); 163 uint32_t tmp32; 164 ASSERT_TRUE(memory->ReadU32(addr, &tmp32, false)); 165 ASSERT_EQ(tmp32, 0x04030201); 166 uint64_t tmp64; 167 ASSERT_TRUE(memory->ReadU64(addr, &tmp64, false)); 168 ASSERT_EQ(tmp64, 0x0807060504030201); 169 GTEST_LOG_(INFO) << "DfxMemoryTest004: end."; 170 } 171 172 /** 173 * @tc.name: DfxMemoryTest005 174 * @tc.desc: test DfxMemory class Read 175 * @tc.type: FUNC 176 */ 177 HWTEST_F(DfxMemoryTest, DfxMemoryTest005, TestSize.Level2) 178 { 179 GTEST_LOG_(INFO) << "DfxMemoryTest005: start."; 180 uint8_t values[] = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8}; 181 UnwindContext ctx; 182 auto acc = std::make_shared<DfxAccessorsLocal>(); 183 ASSERT_TRUE(GetSelfStackRange(ctx.stackBottom, ctx.stackTop)); 184 auto memory = std::make_shared<DfxMemory>(acc); 185 memory->SetCtx(&ctx); 186 uintptr_t addr = reinterpret_cast<uintptr_t>(&values[0]); 187 uintptr_t valuePrel32; 188 ASSERT_TRUE(memory->ReadPrel31(addr, &valuePrel32)); 189 ASSERT_EQ(valuePrel32, 0x04030201 + addr); 190 char testStr[] = "Test ReadString Func"; 191 std::string resultStr; 192 uintptr_t addrStr = reinterpret_cast<uintptr_t>(&testStr[0]); 193 ASSERT_TRUE(memory->ReadString(addrStr, &resultStr, sizeof(testStr)/sizeof(char), false)); 194 ASSERT_EQ(testStr, resultStr); 195 ASSERT_EQ(memory->ReadUleb128(addr), 1U); 196 ASSERT_EQ(memory->ReadSleb128(addr), 2); 197 GTEST_LOG_(INFO) << "DfxMemoryTest005: end."; 198 } 199 200 /** 201 * @tc.name: DfxMemoryTest006 202 * @tc.desc: test DfxMemory class Read 203 * @tc.type: FUNC 204 */ 205 HWTEST_F(DfxMemoryTest, DfxMemoryTest006, TestSize.Level2) 206 { 207 GTEST_LOG_(INFO) << "DfxMemoryTest006: start."; 208 UnwindContext ctx; 209 auto acc = std::make_shared<DfxAccessorsLocal>(); 210 ASSERT_TRUE(GetSelfStackRange(ctx.stackBottom, ctx.stackTop)); 211 auto memory = std::make_shared<DfxMemory>(acc); 212 memory->SetCtx(&ctx); 213 ASSERT_EQ(memory->GetEncodedSize(DW_EH_PE_absptr), sizeof(uintptr_t)); 214 ASSERT_EQ(memory->GetEncodedSize(DW_EH_PE_sdata1), 1); 215 ASSERT_EQ(memory->GetEncodedSize(DW_EH_PE_sdata2), 2); 216 ASSERT_EQ(memory->GetEncodedSize(DW_EH_PE_sdata4), 4); 217 ASSERT_EQ(memory->GetEncodedSize(DW_EH_PE_sdata8), 8); 218 GTEST_LOG_(INFO) << "DfxMemoryTest006: end."; 219 } 220 221 /** 222 * @tc.name: DfxMemoryTest007 223 * @tc.desc: test DfxMemory class ReadReg in remote case 224 * @tc.type: FUNC 225 */ 226 HWTEST_F(DfxMemoryTest, DfxMemoryTest007, TestSize.Level2) 227 { 228 GTEST_LOG_(INFO) << "DfxMemoryTest007: start."; 229 uintptr_t regs[] = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa}; 230 UnwindContext ctx; 231 ctx.regs = DfxRegs::CreateFromRegs(UnwindMode::DWARF_UNWIND, regs, sizeof(regs) / sizeof(regs[0])); 232 auto acc = std::make_shared<DfxAccessorsRemote>(); 233 auto memory = std::make_shared<DfxMemory>(acc); 234 memory->SetCtx(&ctx); 235 uintptr_t value; 236 bool ret = memory->ReadReg(0, &value); 237 EXPECT_EQ(true, ret) << "DfxMemoryTest007: ret" << ret; 238 EXPECT_EQ(static_cast<uintptr_t>(0x1), value) << "DfxMemoryTest007: value" << value; 239 GTEST_LOG_(INFO) << "DfxMemoryTest007: end."; 240 } 241 /** 242 * @tc.name: DfxMemoryTest008 243 * @tc.desc: test DfxMemory class Read in remote case 244 * @tc.type: FUNC 245 */ 246 HWTEST_F(DfxMemoryTest, DfxMemoryTest008, TestSize.Level2) 247 { 248 GTEST_LOG_(INFO) << "DfxMemoryTest008: start."; 249 static pid_t pid = getpid(); 250 uint8_t values[] = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8}; 251 pid_t child = fork(); 252 if (child == 0) { 253 GTEST_LOG_(INFO) << "pid: " << pid << ", ppid:" << getppid(); 254 DfxPtrace::Attach(pid); 255 uintptr_t value; 256 UnwindContext ctx; 257 ctx.pid = pid; 258 auto acc = std::make_shared<DfxAccessorsRemote>(); 259 auto memory = std::make_shared<DfxMemory>(acc); 260 memory->SetCtx(&ctx); 261 uintptr_t addr = reinterpret_cast<uintptr_t>(&values[0]); 262 bool ret = memory->ReadUptr(addr, &value, false); 263 EXPECT_EQ(true, ret) << "DfxMemoryTest008: ret:" << ret; 264 uint64_t tmp; 265 memory->Read(addr, &tmp, sizeof(uint8_t), false); 266 EXPECT_EQ(tmp, 0x01); 267 268 memory->Read(addr, &tmp, sizeof(uint16_t), false); 269 EXPECT_EQ(tmp, 0x0201); 270 271 memory->Read(addr, &tmp, sizeof(uint32_t), false); 272 EXPECT_EQ(tmp, 0x04030201); 273 274 memory->Read(addr, &tmp, sizeof(uint64_t), false); 275 EXPECT_EQ(tmp, 0x0807060504030201); 276 DfxPtrace::Detach(pid); 277 _exit(0); 278 } 279 int status; 280 int ret = wait(&status); 281 GTEST_LOG_(INFO) << "Status:" << status << " Result:" << ret; 282 GTEST_LOG_(INFO) << "DfxMemoryTest008: end."; 283 } 284 285 /** 286 * @tc.name: DfxMemoryTest009 287 * @tc.desc: test DfxMemory class Read in remote case 288 * @tc.type: FUNC 289 */ 290 HWTEST_F(DfxMemoryTest, DfxMemoryTest009, TestSize.Level2) 291 { 292 GTEST_LOG_(INFO) << "DfxMemoryTest009: start."; 293 static pid_t pid = getpid(); 294 uint8_t values[] = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8}; 295 pid_t child = fork(); 296 if (child == 0) { 297 GTEST_LOG_(INFO) << "pid: " << pid << ", ppid:" << getppid(); 298 DfxPtrace::Attach(pid); 299 UnwindContext ctx; 300 ctx.pid = pid; 301 auto acc = std::make_shared<DfxAccessorsRemote>(); 302 auto memory = std::make_shared<DfxMemory>(acc); 303 memory->SetCtx(&ctx); 304 uintptr_t addr = reinterpret_cast<uintptr_t>(&values[0]); 305 uintptr_t value; 306 ASSERT_TRUE(memory->ReadUptr(addr, &value, false)); 307 #if defined(__arm__) 308 ASSERT_EQ(value, 0x04030201); 309 #elif defined(__aarch64__) 310 ASSERT_EQ(value, 0x0807060504030201); 311 #endif 312 313 uint64_t tmp; 314 ASSERT_TRUE(memory->Read(addr, &tmp, sizeof(uint8_t), false)); 315 ASSERT_EQ(tmp, 0x01); 316 317 ASSERT_TRUE(memory->Read(addr, &tmp, sizeof(uint16_t), false)); 318 ASSERT_EQ(tmp, 0x0201); 319 320 ASSERT_TRUE(memory->Read(addr, &tmp, sizeof(uint32_t), false)); 321 ASSERT_EQ(tmp, 0x04030201); 322 323 ASSERT_TRUE(memory->Read(addr, &tmp, sizeof(uint64_t), false)); 324 ASSERT_EQ(tmp, 0x0807060504030201); 325 DfxPtrace::Detach(pid); 326 _exit(0); 327 } 328 int status; 329 int ret = wait(&status); 330 GTEST_LOG_(INFO) << "Status:" << status << " Result:" << ret; 331 GTEST_LOG_(INFO) << "DfxMemoryTest009: end."; 332 } 333 334 /** 335 * @tc.name: DfxMemoryTest010 336 * @tc.desc: test DfxMemory class Read in remote case 337 * @tc.type: FUNC 338 */ 339 HWTEST_F(DfxMemoryTest, DfxMemoryTest010, TestSize.Level2) 340 { 341 GTEST_LOG_(INFO) << "DfxMemoryTest010: start."; 342 static pid_t pid = getpid(); 343 uint8_t values[] = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8}; 344 pid_t child = fork(); 345 if (child == 0) { 346 GTEST_LOG_(INFO) << "pid: " << pid << ", ppid:" << getppid(); 347 DfxPtrace::Attach(pid); 348 349 UnwindContext ctx; 350 ctx.pid = pid; 351 auto acc = std::make_shared<DfxAccessorsRemote>(); 352 auto memory = std::make_shared<DfxMemory>(acc); 353 memory->SetCtx(&ctx); 354 uintptr_t addr = reinterpret_cast<uintptr_t>(&values[0]); 355 uint8_t tmp8; 356 ASSERT_TRUE(memory->ReadU8(addr, &tmp8, false)); 357 ASSERT_EQ(tmp8, 0x01); 358 uint16_t tmp16; 359 ASSERT_TRUE(memory->ReadU16(addr, &tmp16, false)); 360 ASSERT_EQ(tmp16, 0x0201); 361 uint32_t tmp32; 362 ASSERT_TRUE(memory->ReadU32(addr, &tmp32, false)); 363 ASSERT_EQ(tmp32, 0x04030201); 364 uint64_t tmp64; 365 ASSERT_TRUE(memory->ReadU64(addr, &tmp64, false)); 366 ASSERT_EQ(tmp64, 0x0807060504030201); 367 DfxPtrace::Detach(pid); 368 _exit(0); 369 } 370 int status; 371 int ret = wait(&status); 372 GTEST_LOG_(INFO) << "Status:" << status << " Result:" << ret; 373 GTEST_LOG_(INFO) << "DfxMemoryTest010: end."; 374 } 375 376 /** 377 * @tc.name: DfxMemoryTest011 378 * @tc.desc: test DfxMemory class Read in remote case 379 * @tc.type: FUNC 380 */ 381 HWTEST_F(DfxMemoryTest, DfxMemoryTest011, TestSize.Level2) 382 { 383 GTEST_LOG_(INFO) << "DfxMemoryTest011: start."; 384 static pid_t pid = getpid(); 385 uint8_t values[] = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8}; 386 char testStr[] = "Test ReadString Func"; 387 pid_t child = fork(); 388 if (child == 0) { 389 GTEST_LOG_(INFO) << "pid: " << pid << ", ppid:" << getppid(); 390 DfxPtrace::Attach(getppid()); 391 UnwindContext ctx; 392 ctx.pid = getppid(); 393 auto acc = std::make_shared<DfxAccessorsRemote>(); 394 auto memory = std::make_shared<DfxMemory>(acc); 395 memory->SetCtx(&ctx); 396 uintptr_t addr = reinterpret_cast<uintptr_t>(&values[0]); 397 std::string resultStr; 398 uintptr_t addrStr = reinterpret_cast<uintptr_t>(&testStr[0]); 399 ASSERT_TRUE(memory->ReadString(addrStr, &resultStr, sizeof(testStr)/sizeof(char), false)); 400 ASSERT_EQ(testStr, resultStr); 401 ASSERT_TRUE(memory->ReadString(addrStr, &resultStr, sizeof(testStr)/sizeof(char), true)); 402 ASSERT_EQ(testStr, resultStr); 403 ASSERT_EQ(memory->ReadUleb128(addr), 1U); 404 ASSERT_EQ(memory->ReadSleb128(addr), 2); 405 DfxPtrace::Detach(pid); 406 _exit(0); 407 } 408 int status; 409 int ret = wait(&status); 410 GTEST_LOG_(INFO) << "Status:" << status << " Result:" << ret; 411 GTEST_LOG_(INFO) << "DfxMemoryTest011: end."; 412 } 413 414 /** 415 * @tc.name: DfxMemoryTest012 416 * @tc.desc: test DfxMemory class Read in remote case 417 * @tc.type: FUNC 418 */ 419 HWTEST_F(DfxMemoryTest, DfxMemoryTest012, TestSize.Level2) 420 { 421 GTEST_LOG_(INFO) << "DfxMemoryTest012: start."; 422 static pid_t pid = getpid(); 423 pid_t child = fork(); 424 if (child == 0) { 425 GTEST_LOG_(INFO) << "pid: " << pid << ", ppid:" << getppid(); 426 DfxPtrace::Attach(pid); 427 UnwindContext ctx; 428 ctx.pid = pid; 429 auto acc = std::make_shared<DfxAccessorsRemote>(); 430 auto memory = std::make_shared<DfxMemory>(acc); 431 memory->SetCtx(&ctx); 432 ASSERT_EQ(memory->GetEncodedSize(DW_EH_PE_absptr), sizeof(uintptr_t)); 433 ASSERT_EQ(memory->GetEncodedSize(DW_EH_PE_sdata1), 1); 434 ASSERT_EQ(memory->GetEncodedSize(DW_EH_PE_sdata2), 2); 435 ASSERT_EQ(memory->GetEncodedSize(DW_EH_PE_sdata4), 4); 436 ASSERT_EQ(memory->GetEncodedSize(DW_EH_PE_sdata8), 8); 437 DfxPtrace::Detach(pid); 438 _exit(0); 439 } 440 int status; 441 int ret = wait(&status); 442 GTEST_LOG_(INFO) << "Status:" << status << " Result:" << ret; 443 GTEST_LOG_(INFO) << "DfxMemoryTest012: end."; 444 } 445 446 /** 447 * @tc.name: DfxMemoryTest013 448 * @tc.desc: test DfxMemory class Read in error case 449 * @tc.type: FUNC 450 */ 451 HWTEST_F(DfxMemoryTest, DfxMemoryTest013, TestSize.Level2) 452 { 453 GTEST_LOG_(INFO) << "DfxMemoryTest013: start."; 454 auto acc = std::make_shared<DfxAccessorsLocal>(); 455 auto memory = std::make_shared<DfxMemory>(acc); 456 uintptr_t val; 457 EXPECT_FALSE(memory->ReadReg(0, &val)); 458 uintptr_t regs[] = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa}; 459 UnwindContext ctx; 460 ctx.regs = DfxRegs::CreateFromRegs(UnwindMode::DWARF_UNWIND, regs, sizeof(regs) / sizeof(regs[0])); 461 memory->SetCtx(&ctx); 462 EXPECT_FALSE(memory->ReadReg(-1, &val)); 463 464 uint8_t values[] = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8}; 465 uintptr_t addr = reinterpret_cast<uintptr_t>(&values[0]); 466 EXPECT_FALSE(memory->ReadMem(addr, nullptr)); 467 EXPECT_FALSE(memory->ReadUptr(addr, nullptr, false)); 468 EXPECT_FALSE(memory->Read(addr, nullptr, sizeof(uint8_t), false)); 469 EXPECT_FALSE(memory->ReadU8(addr, nullptr, false)); 470 EXPECT_FALSE(memory->ReadU16(addr, nullptr, false)); 471 EXPECT_FALSE(memory->ReadU32(addr, nullptr, false)); 472 EXPECT_FALSE(memory->ReadU64(addr, nullptr, false)); 473 GTEST_LOG_(INFO) << "DfxMemoryTest013: end."; 474 } 475 476 /** 477 * @tc.name: DfxMemoryTest014 478 * @tc.desc: test DfxMemory class ReadProcMemByPid 479 * @tc.type: FUNC 480 */ 481 HWTEST_F(DfxMemoryTest, DfxMemoryTest014, TestSize.Level2) 482 { 483 GTEST_LOG_(INFO) << "DfxMemoryTest014: start."; 484 std::string res = ExecuteCommands("uname"); 485 bool linuxKernel = res.find("Linux") != std::string::npos; 486 if (linuxKernel) { 487 ASSERT_TRUE(linuxKernel); 488 return; 489 } 490 pid_t pid = GetProcessPid(FOUNDATION_NAME); 491 auto maps = DfxMaps::Create(pid); 492 std::vector<std::shared_ptr<DfxMap>> shmmMaps; 493 ASSERT_TRUE(maps->FindMapsByName("[shmm]", shmmMaps)); 494 std::shared_ptr<DfxMap> shmmMap = nullptr; 495 for (auto map : shmmMaps) { 496 if (map->IsMapExec()) { 497 shmmMap = map; 498 break; 499 } 500 } 501 ASSERT_TRUE(shmmMap != nullptr); 502 auto shmmData = std::make_shared<std::vector<uint8_t>>(shmmMap->end - shmmMap->begin); 503 DfxMemory::ReadProcMemByPid(pid, shmmMap->begin, shmmData->data(), shmmMap->end - shmmMap->begin); 504 auto shmmElf = std::make_shared<DfxElf>(shmmData->data(), shmmMap->end - shmmMap->begin); 505 ASSERT_TRUE(shmmElf->IsValid()); 506 std::vector<DfxSymbol> shmmSyms; 507 DfxSymbols::ParseSymbols(shmmSyms, shmmElf, ""); 508 GTEST_LOG_(INFO) << "shmm symbols size" << shmmSyms.size(); 509 ASSERT_GT(shmmSyms.size(), 0); 510 for (auto& sym : shmmSyms) { 511 GTEST_LOG_(INFO) << sym.ToDebugString(); 512 } 513 GTEST_LOG_(INFO) << "DfxMemoryTest014 : end."; 514 } 515 } 516 } // namespace HiviewDFX 517 } // namespace OHOS 518