debugger.pp is now working well (see also mydebugger.pp in the demos folder)

This commit is contained in:
ocoursiere
2004-01-08 23:41:24 +00:00
parent e4b815203b
commit ddb696ec79
2 changed files with 441 additions and 40 deletions

View File

@@ -1,15 +1,31 @@
{ BePascal - A pascal wrapper around the BeOS API
Copyright (C) 2002-2004 Oscar Lesta
Olivier Coursiere
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
}
unit debugger; unit debugger;
// Description: kernel interface for a debugger. // Description: kernel interface for a debugger.
interface interface
uses uses
{.$ifdef CPUI386} {$ifdef CPUI386}
// signal, signal,
{.$endif CPUI386} {$endif CPUI386}
// BeBuild, {BeBuild,} OS, image, SupportDefs;
OS, image, SupportDefs;
// kernel calls // kernel calls
function install_default_debugger(to_debugger_port : port_id) : status_t; function install_default_debugger(to_debugger_port : port_id) : status_t;
@@ -21,6 +37,12 @@ function remove_team_debugger(team : team_id) : status_t;
function debug_thread(thread : thread_id) : status_t; function debug_thread(thread : thread_id) : status_t;
cdecl; external 'root' name 'debug_thread'; cdecl; external 'root' name 'debug_thread';
// undocumented syscall to trace syscalls
// this function is used to configure the tracing level
// (see also DEBUG_* const at the end of this file)
function strace_init(thread : thread_id; flags : Cardinal) : status_t;
cdecl; external 'root' name '_kstrace_init_';
{ per-thread debugging flags (returned by the get_thread_debug_info request to { per-thread debugging flags (returned by the get_thread_debug_info request to
the debugging nub) } the debugging nub) }
const const
@@ -163,8 +185,7 @@ type
general registers. } general registers. }
type type
cpu_state = packed record cpu_state = packed record
// this one is in posix/signal.h xregs : extended_regs; // fpu/mmx/xmm registers
// xregs : extended_regs; // fpu/mmx/xmm registers
gs, gs,
reserved0, reserved0,
fs, fs,
@@ -183,11 +204,11 @@ type
eax, eax,
trap_no, // trap or int number trap_no, // trap or int number
error_code, // trap error code error_code, // trap error code
eip : Longword; // user eip eip : Cardinal; // user eip
cs, // user cs cs, // user cs
reserved4 : Word; reserved4 : Word;
eflags, // user elfags eflags, // user elfags
uesp : Longword; // user esp uesp : Cardinal; // user esp
ss, // user ss ss, // user ss
reserved5 : Word; reserved5 : Word;
end; end;
@@ -361,25 +382,64 @@ type
// union of all stuctures passed to the nub // union of all stuctures passed to the nub
to_nub_msg = packed record to_nub_msg = packed record
nub_read_memory : nub_read_memory_msg; case Integer of
nub_write_memory : nub_write_memory_msg; 0: (
nub_run_thread : nub_run_thread_msg; nub_read_memory : nub_read_memory_msg;
nub_step_thread : nub_step_thread_msg; );
nub_step_over_thread : nub_step_over_thread_msg; 1: (
nub_step_out_thread : nub_step_out_thread_msg; nub_write_memory : nub_write_memory_msg;
nub_set_breakpoint : nub_set_breakpoint_msg; );
nub_clear_breakpoint : nub_clear_breakpoint_msg; 2: (
nub_stop_new_threads : nub_stop_new_threads_msg; nub_run_thread : nub_run_thread_msg;
nub_get_thread_debug_info : nub_get_thread_debug_info_msg; );
nub_acknowlege_image_created : nub_acknowlege_image_created_msg; 3: (
nub_start_profiler : nub_start_profiler_msg; nub_step_thread : nub_step_thread_msg;
nub_stop_profiler : nub_stop_profiler_msg; );
nub_set_watchpoint : nub_set_watchpoint_msg; 4: (
nub_clear_watchpoint : nub_clear_watchpoint_msg; nub_step_over_thread : nub_step_over_thread_msg;
nub_stop_on_debug : nub_stop_on_debug_msg; );
nub_get_thread_stack_top : nub_get_thread_stack_top_msg; 5: (
nub_handoff : nub_handoff_msg; nub_step_out_thread : nub_step_out_thread_msg;
nub_get_why_stopped : nub_get_why_stopped_msg; );
6: (
nub_set_breakpoint : nub_set_breakpoint_msg;
);
7: (
nub_clear_breakpoint : nub_clear_breakpoint_msg;
);
8: (
nub_stop_new_threads : nub_stop_new_threads_msg;
);
9: (
nub_get_thread_debug_info : nub_get_thread_debug_info_msg;
);
10: (
nub_acknowlege_image_created : nub_acknowlege_image_created_msg;
);
11: (
nub_start_profiler : nub_start_profiler_msg;
);
12: (
nub_stop_profiler : nub_stop_profiler_msg;
);
13: (
nub_set_watchpoint : nub_set_watchpoint_msg;
);
14: (
nub_clear_watchpoint : nub_clear_watchpoint_msg;
);
15: (
nub_stop_on_debug : nub_stop_on_debug_msg;
);
16: (
nub_get_thread_stack_top : nub_get_thread_stack_top_msg;
);
17: (
nub_handoff : nub_handoff_msg;
);
18: (
nub_get_why_stopped : nub_get_why_stopped_msg;
);
end; end;
{ messages passed to the external debugger { messages passed to the external debugger
@@ -395,7 +455,8 @@ type
{$ifdef POWERPC} {$ifdef POWERPC}
B_PEF_IMAGE_CREATED, // pef image was created B_PEF_IMAGE_CREATED, // pef image was created
B_PEF_IMAGE_DELETED, // pef image was deleted B_PEF_IMAGE_DELETED, // pef image was deleted
{$elif CPUI386} {$endif}
{$ifdef CPUI386}
B_ELF_IMAGE_CREATED, // pe image was created B_ELF_IMAGE_CREATED, // pe image was created
B_ELF_IMAGE_DELETED, // pe image was deleted B_ELF_IMAGE_DELETED, // pe image was deleted
{$endif} {$endif}
@@ -465,15 +526,34 @@ type
// union of all structures passed to external debugger // union of all structures passed to external debugger
to_debugger_msg = packed record to_debugger_msg = packed record
thread_stopped : db_thread_stopped_msg; case Integer of
team_created : db_team_created_msg; 0: (
team_deleted : db_team_deleted_msg; thread_stopped : db_thread_stopped_msg;
pef_image_created : db_pef_image_created_msg; );
pef_image_deleted : db_pef_image_deleted_msg; 1: (
thread_created : db_thread_created_msg; team_created : db_team_created_msg;
thread_deleted : db_thread_deleted_msg; );
get_profile_info : db_get_profile_info_msg; 2: (
syscall_post : db_syscall_post_msg; team_deleted : db_team_deleted_msg;
);
3: (
pef_image_created : db_pef_image_created_msg;
);
4: (
pef_image_deleted : db_pef_image_deleted_msg;
);
5: (
thread_created : db_thread_created_msg;
);
6: (
thread_deleted : db_thread_deleted_msg;
);
7: (
get_profile_info : db_get_profile_info_msg;
);
8: (
syscall_post : db_syscall_post_msg;
);
end; end;
{ {
@@ -492,4 +572,4 @@ const
implementation implementation
end. end.

View File

@@ -0,0 +1,321 @@
{ BePascal - A pascal wrapper around the BeOS API
Copyright (C) 2004 Olivier Coursiere
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
}
unit signal;
interface
(*
typedef struct packed_fp_stack {
unsigned char st0[10];
unsigned char st1[10];
unsigned char st2[10];
unsigned char st3[10];
unsigned char st4[10];
unsigned char st5[10];
unsigned char st6[10];
unsigned char st7[10];
} packed_fp_stack;
*)
type
packed_fp_stack = packed record
st0 : array[0..9] of Byte;
st1 : array[0..9] of Byte;
st2 : array[0..9] of Byte;
st3 : array[0..9] of Byte;
st4 : array[0..9] of Byte;
st5 : array[0..9] of Byte;
st6 : array[0..9] of Byte;
st7 : array[0..9] of Byte;
end;
(*
typedef struct packed_mmx_regs {
unsigned char mm0[10];
unsigned char mm1[10];
unsigned char mm2[10];
unsigned char mm3[10];
unsigned char mm4[10];
unsigned char mm5[10];
unsigned char mm6[10];
unsigned char mm7[10];
} packed_mmx_regs;
*)
type
packed_mmx_regs = packed record
mm0 : array[0..9] of Byte;
mm1 : array[0..9] of Byte;
mm2 : array[0..9] of Byte;
mm3 : array[0..9] of Byte;
mm4 : array[0..9] of Byte;
mm5 : array[0..9] of Byte;
mm6 : array[0..9] of Byte;
mm7 : array[0..9] of Byte;
end;
(*
typedef struct old_extended_regs {
unsigned short fp_control;
unsigned short _reserved1;
unsigned short fp_status;
unsigned short _reserved2;
unsigned short fp_tag;
unsigned short _reserved3;
unsigned long fp_eip;
unsigned short fp_cs;
unsigned short fp_opcode;
unsigned long fp_datap;
unsigned short fp_ds;
unsigned short _reserved4;
union {
packed_fp_stack fp;
packed_mmx_regs mmx;
} fp_mmx;
} old_extended_regs;
*)
type
old_extended_regs = packed record
fp_control : word;
_reserved1 : word;
fp_status : word;
_reserved2 : word;
fp_tag : word;
_reserved3 : word;
fp_eip : cardinal;
fp_cs : word;
fp_opcode : word;
fp_datap : cardinal;
fp_ds : word;
_reserved4 : word;
case integer of
1 : (
fp : packed_fp_stack
);
2 : (
mmx : packed_mmx_regs
);
end;
(*
typedef struct fp_stack {
unsigned char st0[10];
unsigned char _reserved_42_47[6];
unsigned char st1[10];
unsigned char _reserved_58_63[6];
unsigned char st2[10];
unsigned char _reserved_74_79[6];
unsigned char st3[10];
unsigned char _reserved_90_95[6];
unsigned char st4[10];
unsigned char _reserved_106_111[6];
unsigned char st5[10];
unsigned char _reserved_122_127[6];
unsigned char st6[10];
unsigned char _reserved_138_143[6];
unsigned char st7[10];
unsigned char _reserved_154_159[6];
} fp_stack;
*)
type
fp_stack = packed record
st0 : array[0..9] of Byte;
_reserved_42_47 : array[0..5] of Byte;
st1 : array[0..9] of Byte;
_reserved_58_63 : array[0..5] of Byte;
st2 : array[0..9] of Byte;
_reserved_74_79 : array[0..5] of Byte;
st3 : array[0..9] of Byte;
_reserved_90_95 : array[0..5] of Byte;
st4 : array[0..9] of Byte;
_reserved_106_111 : array[0..5] of Byte;
st5 : array[0..9] of Byte;
_reserved_122_127 : array[0..5] of Byte;
st6 : array[0..9] of Byte;
_reserved_138_143 : array[0..5] of Byte;
st7 : array[0..9] of Byte;
_reserved_154_159 : array[0..5] of Byte;
end;
(*
typedef struct mmx_regs {
unsigned char mm0[10];
unsigned char _reserved_42_47[6];
unsigned char mm1[10];
unsigned char _reserved_58_63[6];
unsigned char mm2[10];
unsigned char _reserved_74_79[6];
unsigned char mm3[10];
unsigned char _reserved_90_95[6];
unsigned char mm4[10];
unsigned char _reserved_106_111[6];
unsigned char mm5[10];
unsigned char _reserved_122_127[6];
unsigned char mm6[10];
unsigned char _reserved_138_143[6];
unsigned char mm7[10];
unsigned char _reserved_154_159[6];
} mmx_regs;
*)
type
mmx_regs = packed record
mm0 : array[0..9] of Byte;
_reserved_42_47 : array[0..5] of Byte;
mm1 : array[0..9] of Byte;
_reserved_58_63 : array[0..5] of Byte;
mm2 : array[0..9] of Byte;
_reserved_74_79 : array[0..5] of Byte;
mm3 : array[0..9] of Byte;
_reserved_90_95 : array[0..5] of Byte;
mm4 : array[0..9] of Byte;
_reserved_106_111 : array[0..5] of Byte;
mm5 : array[0..9] of Byte;
_reserved_122_127 : array[0..5] of Byte;
mm6 : array[0..9] of Byte;
_reserved_138_143 : array[0..5] of Byte;
mm7 : array[0..9] of Byte;
_reserved_154_159 : array[0..5] of Byte;
end;
(*
typedef struct xmmx_regs {
unsigned char xmm0[16];
unsigned char xmm1[16];
unsigned char xmm2[16];
unsigned char xmm3[16];
unsigned char xmm4[16];
unsigned char xmm5[16];
unsigned char xmm6[16];
unsigned char xmm7[16];
} xmmx_regs;
*)
type
xmmx_regs = packed record
xmm0 : array[0..15] of Byte;
xmm1 : array[0..15] of Byte;
xmm2 : array[0..15] of Byte;
xmm3 : array[0..15] of Byte;
xmm4 : array[0..15] of Byte;
xmm5 : array[0..15] of Byte;
xmm6 : array[0..15] of Byte;
xmm7 : array[0..15] of Byte;
end;
(*
typedef struct new_extended_regs {
unsigned short fp_control;
unsigned short fp_status;
unsigned short fp_tag;
unsigned short fp_opcode;
unsigned long fp_eip;
unsigned short fp_cs;
unsigned short res_14_15;
unsigned long fp_datap;
unsigned short fp_ds;
unsigned short _reserved_22_23;
unsigned long mxcsr;
unsigned long _reserved_28_31;
union {
fp_stack fp;
mmx_regs mmx;
} fp_mmx;
xmmx_regs xmmx;
unsigned char _reserved_288_511[224];
} new_extended_regs;
*)
type
new_extended_regs = packed record
fp_control : word;
fp_status : word;
fp_tag : word;
fp_opcode : word;
fp_eip : cardinal;
fp_cs : word;
res_14_15 : word;
fp_datap : cardinal;
fp_ds : word;
_reserved_22_23 : word;
mxcsr : cardinal;
_reserved_28_31 : cardinal;
fp_mmx : packed record
case integer of
1 : (
fp : fp_stack
);
2 : (
mmx : mmx_regs
);
end;
xmmx : xmmx_regs;
_reserved_288_511 : array[0..223] of Byte;
end;
(*
typedef struct extended_regs {
union {
old_extended_regs old_format;
new_extended_regs new_format;
} state;
unsigned long format;
} extended_regs;
*)
type
extended_regs = packed record
state : packed record
case integer of
1 : (old_format : old_extended_regs);
2 : (new_format : new_extended_regs);
end;
format : cardinal;
end;
(*
struct vregs {
unsigned long eip;
unsigned long eflags;
unsigned long eax;
unsigned long ecx;
unsigned long edx;
unsigned long esp;
unsigned long ebp;
unsigned long _reserved_1;
extended_regs xregs;
unsigned long _reserved_2[3];
};
*)
type
vregs = packed record
eip : cardinal;
eflags : cardinal;
eax : cardinal;
ecx : cardinal;
edx : cardinal;
esp : cardinal;
ebp : cardinal;
_reserved_1 : cardinal;
xregs : extended_regs;
_reserved_2 : array[0..3] of cardinal;
end;
implementation
end.