MCPcopy Create free account
hub / github.com/bloomberg/pystack / copyMemoryFromProcess

Method copyMemoryFromProcess

src/pystack/_pystack/mem.cpp:295–320  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

293}
294
295ssize_t
296ProcessMemoryManager::copyMemoryFromProcess(remote_addr_t addr, size_t len, void* dst) const
297{
298 auto vmap = std::find_if(d_vmaps.begin(), d_vmaps.end(), [&](const auto& vmap) {
299 return vmap.containsAddr(addr) && vmap.containsAddr(addr + len - 1);
300 });
301
302 if (vmap == d_vmaps.end() || !d_lru_cache.can_fit(vmap->Size())) {
303 return readChunk(addr, len, reinterpret_cast<char*>(dst));
304 }
305
306 uintptr_t key = vmap->Start();
307 size_t chunk_size = vmap->Size();
308 remote_addr_t vmap_start_addr = vmap->Start();
309 size_t offset_addr = addr - vmap_start_addr;
310
311 if (!d_lru_cache.exists(key)) {
312 std::vector<char> buf(chunk_size);
313 readChunk(vmap_start_addr, chunk_size, buf.data());
314 d_lru_cache.put(key, std::move(buf));
315 }
316
317 std::memcpy(dst, d_lru_cache.get(key).data() + offset_addr, len);
318
319 return len;
320}
321
322bool
323ProcessMemoryManager::isAddressValid(remote_addr_t addr, const VirtualMap& map) const

Callers 11

getCodeMethod · 0.45
resolveLocalVariablesMethod · 0.45
TupleObjectMethod · 0.45
ListObjectMethod · 0.45
LongObjectMethod · 0.45
getDictEntriesFunction · 0.45
loadFromPython3Method · 0.45
loadFromPython2Method · 0.45
findPthreadTidOffsetFunction · 0.45
copyFromRemoteMethod · 0.45
getLocationInfoFunction · 0.45

Calls 8

LOGClass · 0.85
containsAddrMethod · 0.80
can_fitMethod · 0.80
SizeMethod · 0.80
StartMethod · 0.80
existsMethod · 0.80
putMethod · 0.80

Tested by

no test coverage detected