| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
#include <debug/dbgcom.h> void run_child (void); |
This function starts or resumes the debugged program, via a
longjmp to the debuggee's code. When the debuggee hits a
breakpoint, or exits normally, the exception handler that is called to
service the breakpoint exception will longjmp back to
run_child, and it will then return to the caller.
After run_child returns, the debugger usually examines the
a_tss variable to find out the reason the debuggee stopped. The
a_tss variable is defined by the header `debug/tss.h' as
follows:
typedef struct TSS {
unsigned short tss_back_link;
unsigned short res0;
unsigned long tss_esp0;
unsigned short tss_ss0;
unsigned short res1;
unsigned long tss_esp1;
unsigned short tss_ss1;
unsigned short res2;
unsigned long tss_esp2;
unsigned short tss_ss2;
unsigned short res3;
unsigned long tss_cr3;
unsigned long tss_eip;
unsigned long tss_eflags;
unsigned long tss_eax;
unsigned long tss_ecx;
unsigned long tss_edx;
unsigned long tss_ebx;
unsigned long tss_esp;
unsigned long tss_ebp;
unsigned long tss_esi;
unsigned long tss_edi;
unsigned short tss_es;
unsigned short res4;
unsigned short tss_cs;
unsigned short res5;
unsigned short tss_ss;
unsigned short res6;
unsigned short tss_ds;
unsigned short res7;
unsigned short tss_fs;
unsigned short res8;
unsigned short tss_gs;
unsigned short res9;
unsigned short tss_ldt;
unsigned short res10;
unsigned short tss_trap;
unsigned char tss_iomap;
unsigned char tss_irqn;
unsigned long tss_error;
} TSS;
extern TSS a_tss;
|
See the example below for a typical tests after run_child
returns.
Note that, generally, you'd need to save the standard handles before
calling run_child and restore them after it returns. Otherwise,
if the debuggee redirects one of its standard handles, the corresponding
debugger's standard handle is redirected as well.
See section redir_to_child, and see redir_to_debugger.
| ANSI/ISO C | No |
| POSIX | No |
save_npx ();
run_child ();
load_npx ();
if (a_tss.tss_irqn == 0x21)
{
status = DEBUGGEE_EXITED;
exit_code = a_tss.tss_eax & 0xff;
}
else
{
status = DEBUGGEE_GOT_SIGNAL
if (a_tss.tss_irqn == 0x75)
signal_number = SIGINT;
else if (a_tss.tss_irqn == 1 || a_tss.tss_irqn == 3)
signal_number = SIGTRAP; /* a breakpoint */
}
|
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |