Mono.Debugger.Backend.Mono.MonoThreadManager.InitializeThreads C# (CSharp) Method

InitializeThreads() private method

private InitializeThreads ( Inferior inferior ) : void
inferior Inferior
return void
        internal void InitializeThreads(Inferior inferior)
        {
            TargetAddress ptr = inferior.ReadAddress (MonoDebuggerInfo.ThreadTable);
            while (!ptr.IsNull) {
                int size;
                if (MonoDebuggerInfo.CheckRuntimeVersion (81, 3))
                    size = 60 + inferior.TargetMemoryInfo.TargetAddressSize;
                else
                    size = 32 + inferior.TargetMemoryInfo.TargetAddressSize;
                TargetReader reader = new TargetReader (inferior.ReadMemory (ptr, size));

                long tid = reader.ReadLongInteger ();
                TargetAddress lmf_addr = reader.ReadAddress ();
                TargetAddress end_stack = reader.ReadAddress ();

                TargetAddress extended_notifications_addr = ptr + 24;

                if (inferior.TargetMemoryInfo.TargetAddressSize == 4)
                    tid &= 0x00000000ffffffffL;

                reader.Offset += 8;
                ptr = reader.ReadAddress ();

                ThreadFlags flags = ThreadFlags.None;
                if (MonoDebuggerInfo.CheckRuntimeVersion (81, 3)) {
                    reader.Offset = 56 + inferior.TargetAddressSize;
                    flags = (ThreadFlags) reader.ReadInteger ();
                }

                bool found = false;
                foreach (SingleSteppingEngine engine in process.Engines) {
                    if (engine.TID != tid)
                        continue;

                    engine.SetManagedThreadData (lmf_addr, extended_notifications_addr);
                    engine.OnManagedThreadCreated (end_stack);
                    check_thread_flags (engine, flags);
                    found = true;
                    break;
                }

                if (!found)
                    Report.Error ("Cannot find thread {0:x} in {1}",
                              tid, process.ProcessStart.CommandLine);
            }
        }

Usage Example

示例#1
0
        internal void InitializeMono(Inferior inferior, TargetAddress mdb_debug_info)
        {
            MonoRuntimeFound = true;
            mono_manager = MonoThreadManager.Initialize (this, inferior, mdb_debug_info, is_attached);

            InitializeThreads (inferior, !is_attached);

            if (mono_manager == null)
                return;

            mono_manager.InitializeThreads (inferior);

            if (is_attached)
                mono_manager.InitializeAfterAttach (inferior);
        }