Fix two debugger attach bugs.
- orte_debugger_init_after_spawn was not being called for debuggers that use the MPIR_attach_fifo to co-locate debugger daemons. - MPIR_Breakpoint was not getting called if a debugger reattached. Add a job state (ORTE_JOB_STATE_DEBUGGER_DETACH) to reset mpir_breakpoint_fired to false when a debugger detaches to ensure MPIR_Breakpoint is called if another debugger attaches. Tested with STAT 2.0/launchmon 1.0. cmr:v1.7 This commit was SVN r28665.
Этот коммит содержится в:
родитель
b9ca8e3cd1
Коммит
299d5b3dd7
@ -124,6 +124,7 @@ typedef int32_t orte_job_state_t;
|
||||
#define ORTE_JOB_STATE_REGISTERED 15 /* all procs registered for sync */
|
||||
#define ORTE_JOB_STATE_READY_FOR_DEBUGGERS 16 /* job ready for debugger init after spawn */
|
||||
#define ORTE_JOB_STATE_LOCAL_LAUNCH_COMPLETE 17 /* all local procs have attempted launch */
|
||||
#define ORTE_JOB_STATE_DEBUGGER_DETACH 18 /* a debugger has detached */
|
||||
|
||||
/*
|
||||
* Define a "boundary" so we can easily and quickly determine
|
||||
|
@ -476,7 +476,11 @@ void orte_state_base_track_procs(int fd, short argc, void *cbdata)
|
||||
pdata->state = state;
|
||||
jdata->num_launched++;
|
||||
if (jdata->num_launched == jdata->num_procs) {
|
||||
ORTE_ACTIVATE_JOB_STATE(jdata, ORTE_JOB_STATE_RUNNING);
|
||||
if (jdata->controls & ORTE_JOB_CONTROL_DEBUGGER_DAEMON) {
|
||||
ORTE_ACTIVATE_JOB_STATE(jdata, ORTE_JOB_STATE_READY_FOR_DEBUGGERS);
|
||||
} else {
|
||||
ORTE_ACTIVATE_JOB_STATE(jdata, ORTE_JOB_STATE_RUNNING);
|
||||
}
|
||||
}
|
||||
} else if (ORTE_PROC_STATE_REGISTERED == state) {
|
||||
/* update the proc state */
|
||||
@ -723,6 +727,10 @@ void orte_state_base_check_all_complete(int fd, short args, void *cbdata)
|
||||
* is maintained!
|
||||
*/
|
||||
if (1 < j) {
|
||||
if (jdata->controls & ORTE_JOB_CONTROL_DEBUGGER_DAEMON) {
|
||||
/* this was a debugger daemon. notify that a debugger has detached */
|
||||
ORTE_ACTIVATE_JOB_STATE(jdata, ORTE_JOB_STATE_DEBUGGER_DETACH);
|
||||
}
|
||||
opal_pointer_array_set_item(orte_job_data, j, NULL); /* ensure the array has a NULL */
|
||||
OBJ_RELEASE(jdata);
|
||||
}
|
||||
|
@ -129,6 +129,7 @@ int MPIR_force_to_main = 0;
|
||||
static void orte_debugger_dump(void);
|
||||
static void orte_debugger_init_before_spawn(orte_job_t *jdata);
|
||||
static void orte_debugger_init_after_spawn(int fd, short event, void *arg);
|
||||
static void orte_debugger_detached(int fd, short event, void *arg);
|
||||
static void attach_debugger(int fd, short event, void *arg);
|
||||
static void build_debugger_args(orte_app_context_t *debugger);
|
||||
static void open_fifo (void);
|
||||
@ -988,6 +989,9 @@ int orterun(int argc, char *argv[])
|
||||
orte_state.add_job_state(ORTE_JOB_STATE_READY_FOR_DEBUGGERS,
|
||||
orte_debugger_init_after_spawn,
|
||||
ORTE_SYS_PRI);
|
||||
orte_state.add_job_state(ORTE_JOB_STATE_DEBUGGER_DETACH,
|
||||
orte_debugger_detached,
|
||||
ORTE_SYS_PRI);
|
||||
|
||||
if (orte_staged_execution) {
|
||||
/* staged execution is requested - each app_context
|
||||
@ -2909,6 +2913,15 @@ void orte_debugger_init_after_spawn(int fd, short event, void *cbdata)
|
||||
OBJ_RELEASE(caddy);
|
||||
}
|
||||
|
||||
static void orte_debugger_detached(int fd, short event, void *cbdata)
|
||||
{
|
||||
orte_state_caddy_t *caddy = (orte_state_caddy_t*)cbdata;
|
||||
OBJ_RELEASE(caddy);
|
||||
|
||||
/* need to ensure MPIR_Breakpoint is called again if another debugger attaches */
|
||||
mpir_breakpoint_fired = false;
|
||||
}
|
||||
|
||||
static void open_fifo (void)
|
||||
{
|
||||
opal_event_t *attach;
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user