void read_note_section() { threads = new ArrayList(); foreach (Bfd.Section section in core_bfd.Sections) { if (!section.name.StartsWith(".reg/")) { continue; } int pid = Int32.Parse(section.name.Substring(5)); CoreFileThread thread = new CoreFileThread(this, pid); OnThreadCreatedEvent(thread); threads.Add(thread); } #if FIXME TargetReader reader = core_bfd.GetSectionReader("note0"); while (reader.Offset < reader.Size) { long offset = reader.Offset; int namesz = reader.ReadInteger(); int descsz = reader.ReadInteger(); int type = reader.ReadInteger(); string name = null; if (namesz != 0) { char[] namebuf = new char [namesz]; for (int i = 0; i < namesz; i++) { namebuf [i] = (char)reader.ReadByte(); } name = new String(namebuf); } byte[] desc = null; if (descsz != 0) { desc = reader.BinaryReader.ReadBuffer(descsz); } // Console.WriteLine ("NOTE: {0} {1:x} {2}", offset, type, name); // Console.WriteLine (TargetBinaryReader.HexDump (desc)); reader.Offset += 4 - (reader.Offset % 4); } #endif }
void read_thread_table() { TargetAddress ptr = main_thread.ReadAddress(debugger_info.ThreadTable); while (!ptr.IsNull) { int size = 56 + main_thread.TargetMemoryInfo.TargetAddressSize; TargetReader reader = new TargetReader(main_thread.ReadMemory(ptr, size)); long tid = reader.ReadLongInteger(); TargetAddress lmf_addr = reader.ReadAddress(); reader.ReadAddress(); // end stack ptr = reader.ReadAddress(); TargetAddress stack_start = reader.ReadAddress(); TargetAddress signal_stack_start = reader.ReadAddress(); int stack_size = reader.ReadInteger(); int signal_stack_size = reader.ReadInteger(); bool found = false; foreach (CoreFileThread thread in threads) { TargetAddress sp = thread.CurrentFrame.StackPointer; if ((sp >= stack_start) && (sp < stack_start + stack_size)) { thread.SetLMFAddress(tid, lmf_addr); found = true; break; } else if (!signal_stack_start.IsNull && (sp >= signal_stack_start) && (sp < signal_stack_start + signal_stack_size)) { thread.SetLMFAddress(tid, lmf_addr); found = true; break; } } if (!found) { Console.WriteLine("InternalError: did not find the address for the thread"); } } }
public void Read(TargetMemoryAccess memory) { int address_size = memory.TargetMemoryInfo.TargetAddressSize; int header_size = 16 + address_size; if (first_chunk.IsNull) { first_chunk = memory.ReadAddress (TableAddress + 8); current_chunk = first_chunk; } if (current_chunk.IsNull) return; again: TargetReader reader = new TargetReader ( memory.ReadMemory (current_chunk, header_size)); reader.ReadInteger (); /* size */ int allocated_size = reader.ReadInteger (); int current_offset = reader.ReadInteger (); reader.ReadInteger (); /* dummy */ TargetAddress next = reader.ReadAddress (); read_data_items (memory, current_chunk + header_size, last_offset, current_offset); last_offset = current_offset; if (!next.IsNull && (current_offset == allocated_size)) { current_chunk = next; last_offset = 0; goto again; } }
// This method reads the MonoDebuggerSymbolTable structure // (struct definition is in mono-debug-debugger.h) void do_read_symbol_table(TargetMemoryAccess memory) { TargetAddress symtab_address = memory.ReadAddress (info.SymbolTable); if (symtab_address.IsNull) throw new SymbolTableException ("Symbol table is null."); TargetReader header = new TargetReader ( memory.ReadMemory (symtab_address, info.SymbolTableSize)); long magic = header.BinaryReader.ReadInt64 (); if (magic != MonoDebuggerInfo.DynamicMagic) throw new SymbolTableException ( "Debugger symbol table has unknown magic {0:x}.", magic); int version = header.ReadInteger (); if (version < MonoDebuggerInfo.MinDynamicVersion) throw new SymbolTableException ( "Debugger symbol table has version {0}, but " + "expected at least {1}.", version, MonoDebuggerInfo.MinDynamicVersion); if (version > MonoDebuggerInfo.MaxDynamicVersion) throw new SymbolTableException ( "Debugger symbol table has version {0}, but " + "expected at most {1}.", version, MonoDebuggerInfo.MaxDynamicVersion); int total_size = header.ReadInteger (); if (total_size != info.SymbolTableSize) throw new SymbolTableException ( "Debugger symbol table has size {0}, but " + "expected {1}.", total_size, info.SymbolTableSize); TargetAddress corlib_address = header.ReadAddress (); TargetAddress global_data_table_ptr = header.ReadAddress (); TargetAddress data_table_list = header.ReadAddress (); TargetAddress symfile_by_index = header.ReadAddress (); if (corlib_address.IsNull) throw new SymbolTableException ("Corlib address is null."); corlib = load_symfile (memory, corlib_address); if (corlib == null) throw new SymbolTableException ("Cannot read corlib!"); TargetAddress ptr = symfile_by_index; while (!ptr.IsNull) { TargetAddress next_ptr = memory.ReadAddress (ptr); TargetAddress address = memory.ReadAddress ( ptr + memory.TargetMemoryInfo.TargetAddressSize); ptr = next_ptr; load_symfile (memory, address); } ptr = data_table_list; while (!ptr.IsNull) { TargetAddress next_ptr = memory.ReadAddress (ptr); TargetAddress address = memory.ReadAddress ( ptr + memory.TargetMemoryInfo.TargetAddressSize); ptr = next_ptr; add_data_table (memory, address); } global_data_table = new GlobalDataTable (this, global_data_table_ptr); }
void add_data_table(TargetMemoryAccess memory, TargetAddress ptr) { int table_size = 8 + 2 * memory.TargetMemoryInfo.TargetAddressSize; TargetReader reader = new TargetReader (memory.ReadMemory (ptr, table_size)); int domain = reader.ReadInteger (); reader.Offset += 4; DomainDataTable table = (DomainDataTable) data_tables [domain]; if (table == null) { TargetAddress first_chunk = reader.ReadAddress (); table = new DomainDataTable (this, domain, ptr, first_chunk); data_tables.Add (domain, table); } }
void read_thread_table() { TargetAddress ptr = main_thread.ReadAddress (debugger_info.ThreadTable); while (!ptr.IsNull) { int size = 56 + main_thread.TargetMemoryInfo.TargetAddressSize; TargetReader reader = new TargetReader (main_thread.ReadMemory (ptr, size)); long tid = reader.ReadLongInteger (); TargetAddress lmf_addr = reader.ReadAddress (); reader.ReadAddress (); // end stack ptr = reader.ReadAddress (); TargetAddress stack_start = reader.ReadAddress (); TargetAddress signal_stack_start = reader.ReadAddress (); int stack_size = reader.ReadInteger (); int signal_stack_size = reader.ReadInteger (); bool found = false; foreach (CoreFileThread thread in threads) { TargetAddress sp = thread.CurrentFrame.StackPointer; if ((sp >= stack_start) && (sp < stack_start + stack_size)) { thread.SetLMFAddress (tid, lmf_addr); found = true; break; } else if (!signal_stack_start.IsNull && (sp >= signal_stack_start) && (sp < signal_stack_start + signal_stack_size)) { thread.SetLMFAddress (tid, lmf_addr); found = true; break; } } if (!found) Console.WriteLine ("InternalError: did not find the address for the thread"); } }