blob: e9c5733500296add6bef7abf2cd473443fac1993 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2010 Wind River Systems, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Eclipse Distribution License v1.0 which accompany this distribution.
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Wind River Systems - initial API and implementation
*******************************************************************************/
/*
* This module implements Breakpoints service.
* The service maintains a list of breakpoints.
* Each breakpoint consists of one or more conditions that determine
* when a program's execution should be interrupted.
*/
#ifndef D_breakpoints
#define D_breakpoints
#include <framework/context.h>
#include <framework/protocol.h>
typedef struct BreakpointInfo BreakpointInfo;
#if SERVICE_Breakpoints
/*
* The function is called from context.c every time a context is stopped by breakpoint.
* The function evaluates breakpoint condition and calls suspend_debug_context() if the condition is true.
*/
extern void evaluate_breakpoint(Context * ctx);
/*
* Return NULL-terminated array of breakpoint IDs if the context is stopped by breakpoint.
* Otherwise return NULL.
*/
extern char ** get_context_breakpoint_ids(Context * ctx);
/*
* When a context is stopped by breakpoint, it is necessary to disable
* the breakpoint temporarily before the context can be resumed.
* This function function removes break instruction, then does single step
* over breakpoint location, then restores break intruction.
* Return: 0 if it is OK to resume context from current state,
* return 1 if context needs to step over a breakpoint.
*/
extern int skip_breakpoint(Context * ctx, int single_step);
/* Return 1 if break instruction is planted at given address in the context memory */
extern int is_breakpoint_address(Context * ctx, ContextAddress address);
/* Clone all planted breakpoints when a process forks */
extern void clone_breakpoints_on_process_fork(Context * parent, Context * child);
/*
* Check if memory data buffer contans planted break instructions and remove them.
* Return -1 and set errno if the check cannot be done.
*/
extern int check_breakpoints_on_memory_read(Context * ctx, ContextAddress address, void * buf, size_t size);
/*
* Check if data is about to be written over planted break instructions and adjust the data and breakpoint backing storage
* Return -1 and set errno if the check cannot be done.
*/
extern int check_breakpoints_on_memory_write(Context * ctx, ContextAddress address, void * buf, size_t size);
/* Evenpoint callback. It is called when context is suspended by eventpoint, right before "context_stopped" event */
typedef void EventPointCallBack(Context *, void *);
/* Create, plant and return eventpoint. Eventpoints are breakpoints that are created by agent to control execution of debugee.
* Eventpoint are not exposed through "Breakpoints" TCF service, they are handled by agent itself. */
extern BreakpointInfo * create_eventpoint(const char * location, EventPointCallBack * callback, void * callback_args);
/* Unplant and destroy eventpoint */
extern void destroy_eventpoint(BreakpointInfo * eventpoint);
#else /* SERVICE_Breakpoints */
#define evaluate_breakpoint(ctx)
#define skip_breakpoint(ctx, single_step) 0
#define is_breakpoint_address(ctx, address) 0
#define clone_breakpoints_on_process_fork(parent, child) 0
#define check_breakpoints_on_memory_read(ctx, address, buf, size) 0
#define check_breakpoints_on_memory_write(ctx, address, buf, size) 0
#define create_eventpoint(location, callback, callback_args) 0
#endif /* SERVICE_Breakpoints */
extern void ini_breakpoints_service(Protocol *, TCFBroadcastGroup *);
#endif /* D_breakpoints */