LazDebuggerFp (pure): Recognition of breakpoints on Windows. Silently ignore unknown breakpoints, if possible.

git-svn-id: trunk@44657 -
This commit is contained in:
joost 2014-04-08 22:11:09 +00:00
parent e39d578a44
commit e2c993ce95

View File

@ -391,7 +391,6 @@ begin
case ADebugEvent.dwDebugEventCode of case ADebugEvent.dwDebugEventCode of
EXCEPTION_DEBUG_EVENT: begin EXCEPTION_DEBUG_EVENT: begin
case ADebugEvent.Exception.ExceptionRecord.ExceptionCode of case ADebugEvent.Exception.ExceptionRecord.ExceptionCode of
EXCEPTION_BREAKPOINT: {Result :=} DoBreak(TDbgPtr(ADebugEvent.Exception.ExceptionRecord.ExceptionAddress), ADebugEvent.dwThreadId); // we never set a break ourself, let the callee pause!
EXCEPTION_SINGLE_STEP: Result := DoSingleStep; EXCEPTION_SINGLE_STEP: Result := DoSingleStep;
end; end;
end; end;
@ -765,8 +764,28 @@ begin
case MDebugEvent.dwDebugEventCode of case MDebugEvent.dwDebugEventCode of
EXCEPTION_DEBUG_EVENT: begin EXCEPTION_DEBUG_EVENT: begin
DumpEvent('EXCEPTION_DEBUG_EVENT'); DumpEvent('EXCEPTION_DEBUG_EVENT');
HandleException(MDebugEvent); case MDebugEvent.Exception.ExceptionRecord.ExceptionCode of
result := deException; EXCEPTION_BREAKPOINT: begin
if DoBreak(TDbgPtr(MDebugEvent.Exception.ExceptionRecord.ExceptionAddress), MDebugEvent.dwThreadId)
then
result := deBreakpoint
else begin
// Unknown breakpoint.
if (MDebugEvent.Exception.dwFirstChance <> 0) and (MDebugEvent.Exception.ExceptionRecord.ExceptionFlags = 0)
then begin
// First chance and breakpoint is continuable -> silently ignore.
result := deInternalContinue
end else begin
// Or else, show an exception
result := deException;
end;
end;
end
else begin
HandleException(MDebugEvent);
result := deException;
end;
end;
end; end;
CREATE_THREAD_DEBUG_EVENT: begin CREATE_THREAD_DEBUG_EVENT: begin
DumpEvent('CREATE_THREAD_DEBUG_EVENT'); DumpEvent('CREATE_THREAD_DEBUG_EVENT');