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");
}
}