diff --git a/ecmascript/dfx/hprof/rawheap_translate/rawheap_translate.cpp b/ecmascript/dfx/hprof/rawheap_translate/rawheap_translate.cpp old mode 100644 new mode 100755 index 5ddf6dabe384a59d143b05bb15d5bf5d56ac97b8..af2806cfb588381c70487f789fd16420aaee3bc1 --- a/ecmascript/dfx/hprof/rawheap_translate/rawheap_translate.cpp +++ b/ecmascript/dfx/hprof/rawheap_translate/rawheap_translate.cpp @@ -281,7 +281,7 @@ bool RawHeapTranslateV1::ReadStringTable(FileReader &file) bool RawHeapTranslateV1::ReadObjectTable(FileReader &file, uint32_t offset, uint32_t totalSize) { - if (!file.CheckAndGetHeaderAt(offset, sizeof(AddrTableItem))) { + if (!file.CheckAndGetHeaderAt(offset, 0) || file.GetHeaderRight() < sizeof(AddrTableItem)) { LOG_ERROR_ << "object table header error!"; return false; } @@ -298,25 +298,25 @@ bool RawHeapTranslateV1::ReadObjectTable(FileReader &file, uint32_t offset, uint mem_.push_back(mem); char *data = objTableData.data(); for (uint32_t i = 0; i < file.GetHeaderLeft(); ++i) { - uint64_t addr = ByteToU64(data); + AddrTableItem table = { + ByteToU64(data), // addr + ByteToU64(data + sizeof(uint64_t)), // id + ByteToU32(data + sizeof(uint64_t) * 2), // objSize + ByteToU32(data + sizeof(uint64_t) * 2 + sizeof(uint32_t)) // offset + }; + uint64_t addr = table.addr; Node *node = FindOrCreateNode(addr); - data += sizeof(uint64_t); - - node->nodeId = ByteToU64(data); - data += sizeof(uint64_t); - - node->size = ByteToU32(data); - data += sizeof(uint32_t); - - uint32_t memOffset = ByteToU32(data) - tableSize; - data += sizeof(uint32_t); + node->nodeId = table.id; + node->size = table.objSize; + uint32_t memOffset = table.offset - tableSize; if (memOffset + sizeof(uint64_t) > memSize) { LOG_ERROR_ << "object memory offset error!"; return false; } node->data = mem + memOffset; + data += file.GetHeaderRight(); } LOG_INFO_ << "section objects count " << file.GetHeaderLeft(); return true; @@ -614,13 +614,13 @@ bool RawHeapTranslateV2::ReadStringTable(FileReader &file) bool RawHeapTranslateV2::ReadObjectTable(FileReader &file) { // 4: index in sections means the offset of object table - if (!file.CheckAndGetHeaderAt(sections_[4], sizeof(AddrTableItemV2))) { + if (!file.CheckAndGetHeaderAt(sections_[4], 0) || file.GetHeaderRight() < sizeof(AddrTableItemV2)) { LOG_ERROR_ << "object table header error!"; return false; } syntheticRoot_ = CreateNode(); - uint32_t tableSize = file.GetHeaderLeft() * sizeof(AddrTableItemV2); + uint32_t tableSize = file.GetHeaderLeft() * file.GetHeaderRight(); // 5: index in sections means the total size of object table memSize_ = sections_[5] - tableSize - sizeof(uint64_t); std::vector objTableData(tableSize); @@ -646,7 +646,7 @@ bool RawHeapTranslateV2::ReadObjectTable(FileReader &file) node->nodeId = table.nodeId; node->nativeSize = table.nativeSize; node->jsType = static_cast(table.type); - tableData += sizeof(AddrTableItemV2); + tableData += file.GetHeaderRight(); } LOG_INFO_ << "objects table count " << file.GetHeaderLeft();