Пример #1
0
        private void CreateRegisterParagraphs(ParserEngine aEngine, NThread aThread, ParserElementBase.ElementCompleteHandler aLastFieldHandler)
        {
            {
                ParserParagraph para = new ParserParagraph("NTHREAD_REGS1");
                para.SetTargetMethod(aThread.Registers, "Add");
                ParserLine l1 = ParserLine.NewSymFormat("FPEXC %08x\r\n");
                ParserLine l2 = ParserLine.NewSymFormat("CAR %08x\r\n");
                ParserLine l3 = ParserLine.NewSymFormat("DACR %08x\r\n");
                para.Add(l1, l2, l3);
                aEngine.Add(para);
            }

            {
                ParserParagraph para = new ParserParagraph("NTHREAD_REGS2");
                para.SetTargetMethod(aThread.Registers, "Add");
                ParserLine l1 = ParserLine.NewSymFormat("R13_USR %08x R14_USR %08x SPSR_SVC %08x\r\n");
                ParserLine l2 = ParserLine.NewSymFormat(" R4 %08x  R5 %08x  R6 %08x  R7 %08x\r\n");
                ParserLine l3 = ParserLine.NewSymFormat(" R8 %08x  R9 %08x R10 %08x R11 %08x\r\n");
                ParserLine l4 = ParserLine.NewSymFormat(" PC %08x\r\n");
                //
                if (aLastFieldHandler != null)
                {
                    l4[0].ElementComplete += new ParserElementBase.ElementCompleteHandler(aLastFieldHandler);
                }
                //
                para.Add(l1, l2, l3, l4);
                aEngine.Add(para);
            }
        }
Пример #2
0
        public ParserParagraph CreateEntryDetector(string aObjectName, ParserElementBase.ElementCompleteHandler aNewEntryHandler)
        {
            ParserParagraph para = new ParserParagraph("MONITOR_ENTRY_DETECTOR");

            // If the "new entry handler" object is utilised, the client wishes to detect when a new entry is created.
            // This detection will act as a transient call-back to the client - and won't be used to gather any specific
            // information besides that a new entry has been detected. Furthermore, the entry will be non-consuming and
            // dequeue itself once it "fires" since it's purpose has then been served.
            if (aNewEntryHandler == null)
            {
                throw new ArgumentException("aNewEntryHandler cannot be NULL");
            }

            ParserLine newEntryLine = ParserLine.NewSymFormat(aObjectName.ToUpper() + " at %08x VPTR=%08x AccessCount=%d Owner=%08x\r\n");

            newEntryLine.ElementComplete  += new ParserElementBase.ElementCompleteHandler(aNewEntryHandler);
            newEntryLine.DequeueIfComplete = true;
            newEntryLine.NeverConsumesLine = true;
            para.Add(newEntryLine);
            return(para);
        }
Пример #3
0
        public void CreateMonitorThread(ParserEngine aEngine, string aName, DThread aThread, ParserElementBase.ElementCompleteHandler aLastFieldHandler)
        {
            // Create DObject paragraph
            ParserParagraph para0 = base.CreateMonitorObjectParagraph(aName, aThread);

            aEngine.Add(para0);

            // Create MState paragraphs
            ParserParagraph para1 = new ParserParagraph(aName + "_MSTATE");

            para1.Tag = aThread;
            aEngine.Add(para1);
            CreateThreadMState(para1, DThread.TThreadState.ECreated, "CREATED", false);
            CreateThreadMState(para1, DThread.TThreadState.EDead, "DEAD", false);
            CreateThreadMState(para1, DThread.TThreadState.EReady, "READY", false);
            CreateThreadMState(para1, DThread.TThreadState.EWaitSemaphore, "WAITSEM", true);
            CreateThreadMState(para1, DThread.TThreadState.EWaitSemaphoreSuspended, "WAITSEMS", true);
            CreateThreadMState(para1, DThread.TThreadState.EWaitMutex, "WAITMUTEX", true);
            CreateThreadMState(para1, DThread.TThreadState.EWaitMutexSuspended, "WAITMUTXS", true);
            CreateThreadMState(para1, DThread.TThreadState.EHoldMutexPending, "HOLDMUTXP", true);
            CreateThreadMState(para1, DThread.TThreadState.EWaitCondVar, "WAITCONDVAR", true);
            CreateThreadMState(para1, DThread.TThreadState.EWaitCondVarSuspended, "WAITCONDVRS", true);
            CreateThreadMState(para1, DThread.TThreadState.EUnknown, "??", true);

            // Create common thread paragraph
            ParserParagraph para2 = CreateThreadCommon(aName, aThread);

            aEngine.Add(para2);

            // Create NThread paragraphs
            iHelper.CreateMonitorNThread(aEngine, aName + "_NTHREAD", aThread.NThread, aLastFieldHandler);

            // TODO: add support for older memory models?
        }
Пример #4
0
        public void CreateMonitorNThread(ParserEngine aEngine, string aName, NThread aThread, ParserElementBase.ElementCompleteHandler aLastFieldHandler)
        {
            // Create MState lines
            ParserParagraph para0 = new ParserParagraph(aName + "_NSTATE");

            para0.Tag = aThread;
            CreateThreadNState(para0, aThread, "READY", false);
            CreateThreadNState(para0, aThread, "SUSPENDED", false);
            CreateThreadNState(para0, aThread, "WAITFSEM", true);
            CreateThreadNState(para0, aThread, "SLEEP", false);
            CreateThreadNState(para0, aThread, "BLOCKED", false);
            CreateThreadNState(para0, aThread, "DEAD", false);
            CreateThreadNState(para0, aThread, "WAITDFC", false);
            CreateThreadNState(para0, aThread, "??", true);
            aEngine.Add(para0);

            ParserParagraph para1 = CreateThreadCommon(aName, aThread);

            aEngine.Add(para1);

            CreateRegisterParagraphs(aEngine, aThread, aLastFieldHandler);

            // TODO: add support for older memory models?
        }
Пример #5
0
        public void CreateMonitorProcess(ParserEngine aEngine, string aName, DProcess aProcess, ParserElementBase.ElementCompleteHandler aLastFieldHandler)
        {
            ParserParagraph para0 = base.CreateMonitorObjectParagraph(aName, aProcess);

            aEngine.Add(para0);
            ParserParagraph para1 = CreateMonitorProcessCommon(aName, aProcess);

            aEngine.Add(para1);
            ParserParagraph para2 = CreateMonitorProcessCodeSegs(aName + "_CodeSegs", aProcess);

            aEngine.Add(para2);
            ParserParagraph para3 = CreateMonitorProcessMemModelMultiple(aName + "_MemModel_Multiple", aProcess, aLastFieldHandler);

            aEngine.Add(para3);

            // TODO: add support for older memory models?
        }
Пример #6
0
        private ParserParagraph CreateMonitorProcessMemModelMultiple(string aName, DProcess aProcess, ParserElementBase.ElementCompleteHandler aLastFieldHandler)
        {
            ParserParagraph para = new ParserParagraph(aName);

            para.Tag = aProcess;
            if (aLastFieldHandler != null)
            {
                para.ElementComplete += new ParserElementBase.ElementCompleteHandler(aLastFieldHandler);
            }

            // Misc
            ParserLine l0 = ParserLine.NewSymFormat("OS ASID=%d, LPD=%08x, GPD=%08x\r\n");

            l0.SetTargetProperties(aProcess, "OSASID", "LPD", "GPD");

            // Loop body - construct this first as we use it for the header line
            ParserLine l2 = ParserLine.NewSymFormat("%d: Chunk %08x, access count %d\r\n");

            l2[0].SetTargetObject();
            l2[1].SetTargetMethod(this, "AddChunkToProcess");
            l2[2].SetTargetMethod(this, "SetChunkAccessCount");

            // Loop header
            ParserLine l1 = ParserLine.NewSymFormat("ChunkCount=%d ChunkAlloc=%d\r\n");

            l1[0].SetTargetMethod(l2, "SetRepetitions");

            para.Add(l0, l1, l2);
            return(para);
        }