MCPcopy Create free account
hub / github.com/nodejs/node / print_remembered_set

Function print_remembered_set

deps/v8/tools/windbg.js:792–862  ·  view source on GitHub ↗
(chunk_addr, set_id = 0)

Source from the content-addressed store, hash-verified

790-----------------------------------------------------------------------------*/
791// set ids: 0 = OLD_TO_NEW, 1 = 0 = OLD_TO_OLD
792function print_remembered_set(chunk_addr, set_id = 0) {
793 if (!chunk_addr) {
794 if (isolate_address == 0) {
795 print("Please call !set_iso(isolate_address) or provide chunk address.");
796 return;
797 }
798
799 let iso = cast(isolate_address, "v8::internal::Isolate");
800 let h = iso.heap_;
801 let chunks = [];
802 get_chunks_space('old', h.old_space_.memory_chunk_list_.front_, chunks);
803 get_chunks_space('lo', h.lo_space_.memory_chunk_list_.front_, chunks);
804 for (let c of chunks) {
805 try {
806 print_remembered_set(c.address);
807 }
808 catch (e) {
809 print(`failed to process chunk ${hex(c.address)} due to ${e.message}`);
810 }
811 }
812 return;
813 }
814
815 print(`Remembered set in chunk ${hex(chunk_addr)}`);
816 let chunk = cast(chunk_addr, "v8::internal::MemoryChunk");
817
818 // chunk.slot_set_ is an array of SlotSet's. For standard pages there is 0 or
819 // 1 item in the array, but for large pages there will be more.
820 const page_size = 256 * 1024;
821 const sets_count = Math.floor((chunk.size_ + page_size - 1) / page_size);
822 let rs = chunk.slot_set_[set_id];
823 if (rs.isNull) {
824 print(` <empty>`);
825 return;
826 }
827 if (rs[0].page_start_ != chunk_addr) {
828 print(`page_start_ [${hex(rs.page_start_)}] doesn't match chunk_addr!`);
829 return;
830 }
831
832 const ptr_size = tagged_size();
833 let count = 0;
834 for (let s = 0; s < sets_count; s++){
835 const buckets_count = rs[s].buckets_.Count();
836 for (let b = 0; b < buckets_count; b++) {
837 let bucket = rs[s].buckets_[b];
838 if (bucket.isNull) continue;
839 // there are 32 cells in each bucket, cell's size is 32 bits
840 print(` bucket ${hex(bucket.address.asNumber())}:`);
841 const first_cell = bucket.address.asNumber();
842 for (let c = 0; c < 32; c++) {
843 let cell = host.memory.readMemoryValues(
844 first_cell + c * 4, 1, 4 /*size to read*/)[0];
845 if (cell == 0) continue;
846 let mask = 1;
847 for (let bit = 0; bit < 32; bit++){
848 if (cell & mask) {
849 count++;

Callers

nothing calls this directly

Calls 7

get_chunks_spaceFunction · 0.85
tagged_sizeFunction · 0.85
poimFunction · 0.85
CountMethod · 0.80
printFunction · 0.70
castFunction · 0.70
hexFunction · 0.70

Tested by

no test coverage detected