コード例 #1
0
ファイル: DebugException.cs プロジェクト: aBothe/DDebugger
        public DebugException(EXCEPTION_RECORD32 ex, bool firstChance)
        {
            this.IsFirstChance = firstChance;
            Message            = GetCodeMessage(Code = ex.Code, out Title);
            this.Address       = ex.ExceptionAddress;
            this.IsContinuable = ex.ExceptionFlags == 0;

            if (ex.ExceptionRecord != IntPtr.Zero)
            {
                var innerExt = new EXCEPTION_RECORD32();
                Marshal.PtrToStructure(ex.ExceptionRecord, innerExt);
                InnerException = new DebugException(innerExt, firstChance);
            }
        }
コード例 #2
0
ファイル: DebugException.cs プロジェクト: aBothe/DDebugger
        public DebugException(EXCEPTION_RECORD32 ex, bool firstChance)
        {
            this.IsFirstChance = firstChance;
            Message = GetCodeMessage(Code = ex.Code, out Title);
            this.Address = ex.ExceptionAddress;
            this.IsContinuable = ex.ExceptionFlags == 0;

            if (ex.ExceptionRecord != IntPtr.Zero)
            {
                var innerExt = new EXCEPTION_RECORD32();
                Marshal.PtrToStructure(ex.ExceptionRecord, innerExt);
                InnerException = new DebugException(innerExt, firstChance);
            }
        }
コード例 #3
0
ファイル: Debuggee.cs プロジェクト: aBothe/DDebugger
        void HandleException(DebugThread th, EXCEPTION_DEBUG_INFO e)
        {
            th.Context.Update();

            var code = e.ExceptionRecord.Code;
            // The instruction
            var targetSiteAddress = e.ExceptionRecord.ExceptionAddress;

            if (code == ExceptionCode.Breakpoint)
            {
                if (CodeStepping.lastUnhandledBreakpoint != null)
                {
                    CodeStepping.postBreakpointResetStepCompleted = true;
                }

                var bp = Breakpoints.ByAddress(targetSiteAddress);
                if (bp == null)
                {
                    return;
                }
                //APIIntermediate.GetCallStack_x86(th.OwnerProcess.Handle, (uint)th.StartAddress.ToInt32(), th.Context["ebp"], th.Context["eip"]);

                /*
                 * var sf = new STACKFRAME64();
                 * sf.AddrPC.Offset = th.Context["eip"];
                 * sf.AddrFrame.Offset = th.Context["ebp"];
                 * sf.AddrStack.Offset = th.Context["esp"];
                 * sf.AddrReturn.Mode = sf.AddrStack.Mode = sf.AddrPC.Mode = sf.AddrFrame.Mode = ADDRESS_MODE.AddrModeFlat;
                 *
                 * if(!API.StackWalk64(MachineType.i386, th.OwnerProcess.Handle, th.Handle, ref sf, ref th.Context.lastReadCtxt))
                 *      throw new Win32Exception(Marshal.GetLastWin32Error());
                 */
                th.CurrentInstruction = targetSiteAddress;
                bp.Disable();
                bp.temporarilyDisabled = true;
                CodeStepping.lastUnhandledBreakpoint       = bp;
                CodeStepping.lastUnhandledBreakpointThread = th;

                bp.WasHit();

                foreach (var l in DDebugger.EventListeners)
                {
                    l.OnBreakpoint(th, bp);
                }
            }
            else if (code == ExceptionCode.SingleStep)
            {
                if (CodeStepping.lastUnhandledBreakpoint != null)
                {
                    CodeStepping.postBreakpointResetStepCompleted = true;
                }
                else
                {
                    foreach (var l in DDebugger.EventListeners)
                    {
                        l.OnStepComplete(th);
                    }
                }
            }
            else
            {
                var ex = new DebugException(e.ExceptionRecord, e.dwFirstChance != 0);

                foreach (var l in DDebugger.EventListeners)
                {
                    l.OnException(th, ex);
                }

                LastException = ex;
            }
        }
コード例 #4
0
ファイル: MainForm.cs プロジェクト: aBothe/DDebugger
 public override void OnException(DebugThread thread, DebugException exception)
 {
     form.HighlightCurrentInstruction(thread);
 }
コード例 #5
0
ファイル: Debuggee.cs プロジェクト: aBothe/DDebugger
        void HandleException(DebugThread th, EXCEPTION_DEBUG_INFO e)
        {
            th.Context.Update();

            var code = e.ExceptionRecord.Code;
            // The instruction
            var targetSiteAddress = e.ExceptionRecord.ExceptionAddress;
            if (code == ExceptionCode.Breakpoint)
            {
                if (CodeStepping.lastUnhandledBreakpoint != null)
                    CodeStepping.postBreakpointResetStepCompleted = true;

                var bp = Breakpoints.ByAddress(targetSiteAddress);
                if (bp == null)
                    return;
                //APIIntermediate.GetCallStack_x86(th.OwnerProcess.Handle, (uint)th.StartAddress.ToInt32(), th.Context["ebp"], th.Context["eip"]);
                /*
                var sf = new STACKFRAME64();
                sf.AddrPC.Offset = th.Context["eip"];
                sf.AddrFrame.Offset = th.Context["ebp"];
                sf.AddrStack.Offset = th.Context["esp"];
                sf.AddrReturn.Mode = sf.AddrStack.Mode = sf.AddrPC.Mode = sf.AddrFrame.Mode = ADDRESS_MODE.AddrModeFlat;

                if(!API.StackWalk64(MachineType.i386, th.OwnerProcess.Handle, th.Handle, ref sf, ref th.Context.lastReadCtxt))
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                */
                th.CurrentInstruction = targetSiteAddress;
                bp.Disable();
                bp.temporarilyDisabled = true;
                CodeStepping.lastUnhandledBreakpoint = bp;
                CodeStepping.lastUnhandledBreakpointThread = th;

                bp.WasHit();

                foreach (var l in DDebugger.EventListeners)
                    l.OnBreakpoint(th, bp);
            }
            else if (code == ExceptionCode.SingleStep)
            {
                if (CodeStepping.lastUnhandledBreakpoint != null)
                    CodeStepping.postBreakpointResetStepCompleted = true;
                else
                    foreach (var l in DDebugger.EventListeners)
                        l.OnStepComplete(th);
            }
            else
            {
                var ex = new DebugException(e.ExceptionRecord, e.dwFirstChance != 0);

                foreach (var l in DDebugger.EventListeners)
                    l.OnException(th, ex);

                LastException = ex;
            }
        }
コード例 #6
0
 public virtual void OnException(DebugThread thread, DebugException exception)
 {
 }
コード例 #7
0
 public virtual void OnException(DebugThread thread, DebugException exception)
 {
 }