FpDbg: Show correct value of eip after hitting a breakpoint

git-svn-id: trunk@44450 -
This commit is contained in:
joost 2014-03-16 22:11:19 +00:00
parent 7c3e1eeadf
commit 434c770d67

View File

@ -45,6 +45,8 @@ type
TDbgDarwinThread = class(TDbgThread) TDbgDarwinThread = class(TDbgThread)
private private
FThreadState: x86_thread_state32_t; FThreadState: x86_thread_state32_t;
protected
function ReadThreadState: boolean;
public public
function ResetInstructionPointerAfterBreakpoint: boolean; override; function ResetInstructionPointerAfterBreakpoint: boolean; override;
end; end;
@ -56,7 +58,6 @@ type
FStatus: cint; FStatus: cint;
FProcessStarted: boolean; FProcessStarted: boolean;
FTaskPort: mach_port_name_t; FTaskPort: mach_port_name_t;
FThreadState: x86_thread_state32_t;
function GetDebugAccessRights: boolean; function GetDebugAccessRights: boolean;
protected protected
function InitializeLoader: TDbgImageLoader; override; function InitializeLoader: TDbgImageLoader; override;
@ -118,25 +119,32 @@ end;
{ TDbgDarwinThread } { TDbgDarwinThread }
function TDbgDarwinThread.ResetInstructionPointerAfterBreakpoint: boolean; function TDbgDarwinThread.ReadThreadState: boolean;
var var
aKernResult: kern_return_t; aKernResult: kern_return_t;
old_StateCnt: mach_msg_Type_number_t; old_StateCnt: mach_msg_Type_number_t;
begin begin
old_StateCnt:=x86_THREAD_STATE32_COUNT; old_StateCnt:=x86_THREAD_STATE32_COUNT;
aKernResult:=thread_get_state(ID,x86_THREAD_STATE32, @FThreadState, old_StateCnt); aKernResult:=thread_get_state(Id,x86_THREAD_STATE32, @FThreadState,old_StateCnt);
if aKernResult <> KERN_SUCCESS then if aKernResult <> KERN_SUCCESS then
begin begin
Log('Failed to call thread_get_state for thread %d. Mach error: '+mach_error_string(aKernResult),[Id]); Log('Failed to call thread_get_state for thread %d. Mach error: '+mach_error_string(aKernResult),[Id]);
end; end;
end;
function TDbgDarwinThread.ResetInstructionPointerAfterBreakpoint: boolean;
var
aKernResult: kern_return_t;
new_StateCnt: mach_msg_Type_number_t;
begin
{$ifdef cpui386} {$ifdef cpui386}
Dec(FThreadState.__eip); Dec(FThreadState.__eip);
{$else} {$else}
Dec(FThreadState.__rip); Dec(FThreadState.__rip);
{$endif} {$endif}
aKernResult:=thread_set_state(ID,x86_THREAD_STATE32, @FThreadState, old_StateCnt); new_StateCnt := x86_THREAD_STATE32_COUNT;
aKernResult:=thread_set_state(ID,x86_THREAD_STATE32, @FThreadState, new_StateCnt);
if aKernResult <> KERN_SUCCESS then if aKernResult <> KERN_SUCCESS then
begin begin
Log('Failed to call thread_set_state for thread %d. Mach error: '+mach_error_string(aKernResult),[Id]); Log('Failed to call thread_set_state for thread %d. Mach error: '+mach_error_string(aKernResult),[Id]);
@ -267,12 +275,12 @@ end;
function TDbgDarwinProcess.GetInstructionPointerRegisterValue: TDbgPtr; function TDbgDarwinProcess.GetInstructionPointerRegisterValue: TDbgPtr;
begin begin
result := FThreadState.__eip; result := TDbgDarwinThread(FMainThread).FThreadState.__eip;
end; end;
function TDbgDarwinProcess.GetStackBasePointerRegisterValue: TDbgPtr; function TDbgDarwinProcess.GetStackBasePointerRegisterValue: TDbgPtr;
begin begin
result := FThreadState.__ebp; result := TDbgDarwinThread(FMainThread).FThreadState.__ebp;
end; end;
@ -304,7 +312,6 @@ var
aKernResult: kern_return_t; aKernResult: kern_return_t;
act_list: thread_act_array_t; act_list: thread_act_array_t;
act_listCtn: mach_msg_type_number_t; act_listCtn: mach_msg_type_number_t;
old_StateCnt: mach_msg_Type_number_t;
i: Integer; i: Integer;
AThread: TDbgThread; AThread: TDbgThread;
begin begin
@ -333,13 +340,7 @@ begin
end; end;
end; end;
old_StateCnt:=x86_THREAD_STATE32_COUNT; TDbgDarwinThread(FMainThread).ReadThreadState;
aKernResult:=thread_get_state(act_list^[0],x86_THREAD_STATE32, @FThreadState,old_StateCnt);
if aKernResult <> KERN_SUCCESS then
begin
Log('Failed to call thread_get_state. Mach error: '+mach_error_string(aKernResult));
end;
writeln(Format('eip: %s, eax: %s, ebx: %s, ecx: %s, edx: %s',[FormatAddress(FThreadState.__eip), FormatAddress(FThreadState.__eax),FormatAddress(FThreadState.__ebx),FormatAddress(FThreadState.__ecx), FormatAddress(FThreadState.__edx)]));
end end
end; end;
@ -371,8 +372,7 @@ begin
else else
begin begin
result := deBreakpoint; result := deBreakpoint;
DoBreak(FThreadState.__eip-1, FMainThread.ID); DoBreak(TDbgDarwinThread(FMainThread).FThreadState.__eip-1, FMainThread.ID);
writeln('Breakpoint');
end; end;
end; end;
SIGBUS: SIGBUS: