public unsafe void RegisterTracing(PyThreadState tstate)
 {
     tstate.use_tracing.Write(1);
     tstate.c_tracefunc.Write(_traceFunc.GetPointer());
     _pyTracingPossible.Write(_pyTracingPossible.Read() + 1);
     _isTracing.Write(1);
 }
Beispiel #2
0
 public IEnumerable <PyThreadState> GetThreadStates()
 {
     for (PyThreadState tstate = tstate_head.TryRead(); tstate != null; tstate = tstate.next.TryRead())
     {
         yield return(tstate);
     }
 }
Beispiel #3
0
        public unsafe void RegisterTracing(PyThreadState tstate)
        {
            tstate.use_tracing.Write(1);
            tstate.c_tracefunc.Write(_traceFunc.GetPointer());
            var pyTracingPossible = GetTracingPossible(_pyrtInfo, _process);

            pyTracingPossible.Write(pyTracingPossible.Read() + 1);
            _isTracing.Write(1);
        }
            public void new_threadstate(DkmThread thread, ulong frameBase, ulong vframe, ulong returnAddress)
            {
                var process = thread.Process;
                var cppEval = new CppExpressionEvaluator(thread, frameBase, vframe);

                // Addressing this local by name does not work for release builds, so read the return value directly from the register instead.
                var tstate = PyThreadState.TryCreate(process, cppEval.EvaluateReturnValueUInt64());

                if (tstate == null)
                {
                    return;
                }

                _owner.RegisterTracing(tstate);
            }
Beispiel #5
0
        private void OnException(DkmThread thread)
        {
            if (thread.SystemPart == null)
            {
                Debug.Fail("OnException couldn't obtain system thread ID.");
                return;
            }
            var tid = thread.SystemPart.Id;

            var           process = thread.Process;
            PyThreadState tstate  = PyThreadState.GetThreadStates(process).FirstOrDefault(ts => ts.thread_id.Read() == tid);

            if (tstate == null)
            {
                Debug.Fail("OnException couldn't find PyThreadState corresponding to system thread " + tid);
                return;
            }

            var exc_type  = tstate.curexc_type.TryRead();
            var exc_value = tstate.curexc_value.TryRead();

            if (exc_type == null || exc_type.IsNone)
            {
                return;
            }

            var reprOptions = new ReprOptions(process);

            string typeName       = "<unknown exception type>";
            string additionalInfo = "";

            try {
                var typeObject = exc_type as PyTypeObject;
                if (typeObject != null)
                {
                    var mod = typeObject.__module__;
                    var ver = _process.GetPythonRuntimeInfo().LanguageVersion;
                    if ((mod == "builtins" && ver >= PythonLanguageVersion.V30) ||
                        (mod == "exceptions" && ver < PythonLanguageVersion.V30))
                    {
                        typeName = typeObject.__name__;
                    }
                    else
                    {
                        typeName = mod + "." + typeObject.__name__;
                    }
                }

                var exc = exc_value as PyBaseExceptionObject;
                if (exc != null)
                {
                    var args = exc.args.TryRead();
                    if (args != null)
                    {
                        additionalInfo = args.Repr(reprOptions);
                    }
                }
                else
                {
                    var str = exc_value as IPyBaseStringObject;
                    if (str != null)
                    {
                        additionalInfo = str.ToString();
                    }
                    else if (exc_value != null)
                    {
                        additionalInfo = exc_value.Repr(reprOptions);
                    }
                }
            } catch {
            }

            new RemoteComponent.RaiseExceptionRequest {
                ThreadId = thread.UniqueId,
                Name     = typeName,
                AdditionalInformation = Encoding.Unicode.GetBytes(additionalInfo)
            }.SendLower(process);
        }
Beispiel #6
0
 public static void PyEval_RestoreThread(PyThreadState save)
 {
 }