mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-13 16:49:07 +02:00
FpDbg: Show correct value of eip after hitting a breakpoint
git-svn-id: trunk@44450 -
This commit is contained in:
parent
7c3e1eeadf
commit
434c770d67
@ -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:
|
||||||
|
Loading…
Reference in New Issue
Block a user