Skip to content

Commit

Permalink
improve debugger set/get state
Browse files Browse the repository at this point in the history
  • Loading branch information
xianjimli committed May 19, 2023
1 parent 6420b62 commit 1cfa5e7
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 49 deletions.
3 changes: 3 additions & 0 deletions docs/changes.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# 最新动态

2023/05/19
* 增加了debugger的get和set调试状态的重载函数指针(感谢智明提供补丁)

2023/05/17
* 修改EVT\_POINTER\_LEAVE事件返回RET\_STOP则停止后续操作(感谢朝泽提供补丁)
* 修复cairo模式下LCD屏幕旋转报错问题(感谢高源提供补丁)。
Expand Down
30 changes: 22 additions & 8 deletions src/debugger/debugger.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,25 +24,39 @@

bool_t debugger_is_paused(debugger_t* debugger) {
return_value_if_fail(debugger != NULL, FALSE);

return debugger->state == DEBUGGER_PROGRAM_STATE_PAUSED;
return debugger_get_state(debugger) == DEBUGGER_PROGRAM_STATE_PAUSED;
}

bool_t debugger_is_running(debugger_t* debugger) {
return_value_if_fail(debugger != NULL, FALSE);

return debugger->state == DEBUGGER_PROGRAM_STATE_RUNNING;
return debugger_get_state(debugger) == DEBUGGER_PROGRAM_STATE_RUNNING;
}

bool_t debugger_is_paused_or_running(debugger_t* debugger) {
debugger_program_state_t state;
return_value_if_fail(debugger != NULL, FALSE);
state = debugger_get_state(debugger);
return state == DEBUGGER_PROGRAM_STATE_RUNNING || state == DEBUGGER_PROGRAM_STATE_PAUSED;
}

return debugger->state == DEBUGGER_PROGRAM_STATE_RUNNING || debugger->state == DEBUGGER_PROGRAM_STATE_PAUSED;
debugger_program_state_t debugger_get_state(debugger_t* debugger) {
debugger_program_state_t state;
return_value_if_fail(debugger != NULL && debugger->vt != NULL, DEBUGGER_PROGRAM_STATE_NONE);
if (debugger->vt->get_state != NULL) {
state = debugger->vt->get_state(debugger);
} else {
state = debugger->state;
}
return state;
}

ret_t debugger_set_state(debugger_t* debugger, debugger_program_state_t state) {
return_value_if_fail(debugger != NULL, RET_BAD_PARAMS);
debugger->state = state;
return_value_if_fail(debugger != NULL && debugger->vt != NULL, RET_BAD_PARAMS);
if (debugger->vt->set_state != NULL) {
return debugger->vt->set_state(debugger, state);
} else {
debugger->state = state;
}
return RET_OK;
}

Expand Down Expand Up @@ -231,7 +245,7 @@ ret_t debugger_launch(debugger_t* debugger, const char* lang, const binary_data_
ret_t debugger_deinit(debugger_t* debugger) {
return_value_if_fail(debugger != NULL && debugger->vt != NULL, RET_BAD_PARAMS);
return_value_if_fail(debugger->vt->deinit != NULL, RET_BAD_PARAMS);
debugger->state = DEBUGGER_PROGRAM_STATE_NONE;
debugger_set_state(debugger, DEBUGGER_PROGRAM_STATE_NONE);

return debugger->vt->deinit(debugger);
}
Expand Down
81 changes: 47 additions & 34 deletions src/debugger/debugger.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,33 @@ BEGIN_C_DECLS

struct _debugger_t;
typedef struct _debugger_t debugger_t;
/**
* @enum debugger_program_state_t
* @prefix DEBUGGER_PROGRAM_STATE_
* 被调试程序的状态。
*/
typedef enum _debugger_program_state_t {
/**
* @const DEBUGGER_PROGRAM_STATE_NONE
* 初始状态。
*/
DEBUGGER_PROGRAM_STATE_NONE = 0,
/**
* @const DEBUGGER_PROGRAM_STATE_PAUSED
* 停止状态(断点/异常等)。
*/
DEBUGGER_PROGRAM_STATE_PAUSED,
/**
* @const DEBUGGER_PROGRAM_STATE_RUNNING
* 运行状态(断点/异常等)。
*/
DEBUGGER_PROGRAM_STATE_RUNNING,
/**
* @const DEBUGGER_PROGRAM_STATE_TERMINATED
* 终止状态(断点/异常等)。
*/
DEBUGGER_PROGRAM_STATE_TERMINATED
} debugger_program_state_t;

typedef ret_t (*debugger_lock_t)(debugger_t* debugger);
typedef ret_t (*debugger_unlock_t)(debugger_t* debugger);
Expand Down Expand Up @@ -60,11 +87,13 @@ typedef ret_t (*debugger_launch_t)(debugger_t* debugger, const char* lang,
typedef ret_t (*debugger_attach_t)(debugger_t* debugger, const char* lang, const char* code_id);
typedef ret_t (*debugger_deinit_t)(debugger_t* debugger);

typedef debugger_program_state_t (*debugger_get_state_t)(debugger_t* debugger);
typedef ret_t (*debugger_set_state_t)(debugger_t* debugger, debugger_program_state_t state);

/*扩展接口以支持lldb的DAP协议{*/
typedef tk_object_t* (*debugger_get_threads_t)(debugger_t* debugger);
typedef ret_t (*debugger_launch_app_t)(debugger_t* debugger, const char* program, const char* work_dir,
int argc, char* argv[]);
typedef ret_t (*debugger_launch_app_t)(debugger_t* debugger, const char* program,
const char* work_dir, int argc, char* argv[]);

typedef tk_object_t* (*debugger_get_var_t)(debugger_t* debugger, const char* path);
typedef ret_t (*debugger_set_break_point_ex_t)(debugger_t* debugger, const char* position);
Expand All @@ -73,34 +102,6 @@ typedef ret_t (*debugger_set_current_frame_t)(debugger_t* debugger, uint32_t fra
typedef ret_t (*debugger_dispatch_messages_t)(debugger_t* debugger);
/*}扩展接口以支持lldb的DAP协议{*/

/**
* @enum debugger_program_state_t
* @prefix DEBUGGER_PROGRAM_STATE_
* 被调试程序的状态。
*/
typedef enum _debugger_program_state_t {
/**
* @const DEBUGGER_PROGRAM_STATE_NONE
* 初始状态。
*/
DEBUGGER_PROGRAM_STATE_NONE = 0,
/**
* @const DEBUGGER_PROGRAM_STATE_PAUSED
* 停止状态(断点/异常等)。
*/
DEBUGGER_PROGRAM_STATE_PAUSED,
/**
* @const DEBUGGER_PROGRAM_STATE_RUNNING
* 运行状态(断点/异常等)。
*/
DEBUGGER_PROGRAM_STATE_RUNNING,
/**
* @const DEBUGGER_PROGRAM_STATE_TERMINATED
* 终止状态(断点/异常等)。
*/
DEBUGGER_PROGRAM_STATE_TERMINATED
} debugger_program_state_t;

typedef debugger_t* (*debugger_fscript_create_t)(void);

typedef struct _debugger_vtable_t {
Expand Down Expand Up @@ -133,15 +134,18 @@ typedef struct _debugger_vtable_t {
debugger_clear_break_points_t clear_break_points;
debugger_deinit_t deinit;

/*扩展接口以支持lldb的DAP协议{*/
debugger_get_state_t get_state;
debugger_set_state_t set_state;

/*扩展接口以支持lldb的DAP协议{*/
debugger_get_threads_t get_threads;
debugger_launch_app_t launch_app;
debugger_get_var_t get_var;
debugger_set_break_point_ex_t set_break_point_ex;
debugger_remove_break_point_ex_t remove_break_point_ex;
debugger_set_current_frame_t set_current_frame;
debugger_dispatch_messages_t dispatch_messages;
/*}扩展接口以支持lldb的DAP协议{*/
/*}扩展接口以支持lldb的DAP协议{*/
} debugger_vtable_t;

/**
Expand Down Expand Up @@ -464,8 +468,8 @@ tk_object_t* debugger_get_threads(debugger_t* debugger);
*
* @return {ret_t} 返回RET_OK表示成功,否则表示失败。
*/
ret_t debugger_launch_app(debugger_t* debugger, const char* program, const char* work_dir,
int argc, char* argv[]);
ret_t debugger_launch_app(debugger_t* debugger, const char* program, const char* work_dir, int argc,
char* argv[]);

/**
* @method debugger_set_break_point_ex
Expand Down Expand Up @@ -533,6 +537,15 @@ ret_t debugger_dispatch_messages(debugger_t* debugger);
*/
ret_t debugger_set_state(debugger_t* debugger, debugger_program_state_t state);

/**
* @method debugger_get_state
* 获取调试状态。
* @param {debugger_t*} debugger debugger对象。
*
* @return {debugger_program_state_t} 返回调试状态。
*/
debugger_program_state_t debugger_get_state(debugger_t* debugger);

/*}扩展接口以支持lldb的DAP协议{*/

#define DEBUGGER(debugger) ((debugger_t*)(debugger))
Expand Down
4 changes: 2 additions & 2 deletions src/debugger/debugger_fscript.c
Original file line number Diff line number Diff line change
Expand Up @@ -741,9 +741,9 @@ static bool_t debugger_fscript_emit_breaked(debugger_t* debugger, int32_t line)
debugger_fscript_t* d = DEBUGGER_FSCRIPT(debugger);

if (d->prev_breaked_line == line) {
debugger->state = DEBUGGER_PROGRAM_STATE_RUNNING;
debugger_set_state(debugger, DEBUGGER_PROGRAM_STATE_RUNNING);
} else {
debugger->state = DEBUGGER_PROGRAM_STATE_PAUSED;
debugger_set_state(debugger, DEBUGGER_PROGRAM_STATE_PAUSED);
d->prev_breaked_line = line;
}

Expand Down
10 changes: 5 additions & 5 deletions src/debugger/debugger_lldb.c
Original file line number Diff line number Diff line change
Expand Up @@ -409,7 +409,7 @@ static ret_t debugger_lldb_init(debugger_t* debugger) {
req = debugger_lldb_create_init_req(debugger);
return_value_if_fail(req != NULL, RET_BAD_PARAMS);

debugger->state = DEBUGGER_PROGRAM_STATE_NONE;
debugger_set_state(debugger, DEBUGGER_PROGRAM_STATE_NONE);
if (debugger_lldb_write_req(debugger, req) == RET_OK) {
ret = debugger_lldb_dispatch_until_get_resp_simple(debugger, CMD_INITIALIZE, 3000);
}
Expand Down Expand Up @@ -508,7 +508,7 @@ static ret_t debugger_lldb_launch_app_impl(debugger_t* debugger, const char* pro
ret = debugger_lldb_dispatch_until_get_resp_simple(debugger, CMD_LAUNCH, 60000);
if (ret == RET_OK) {
debugger_lldb_simple_command(debugger, CMD_CONFIGURATION_DONE);
debugger->state = DEBUGGER_PROGRAM_STATE_RUNNING;
debugger_set_state(debugger, DEBUGGER_PROGRAM_STATE_RUNNING);
debugger_lldb_update_break_points(debugger);
}
}
Expand Down Expand Up @@ -896,7 +896,7 @@ static ret_t debugger_lldb_simple_command(debugger_t* debugger, const char* cmd)

ret_t debugger_lldb_dispatch_messages(debugger_t* debugger) {
while (debugger_lldb_dispatch_one(debugger, 10) == RET_OK) {
if (debugger->state == DEBUGGER_PROGRAM_STATE_RUNNING) {
if (debugger_get_state(debugger) == DEBUGGER_PROGRAM_STATE_RUNNING) {
break;
}
}
Expand All @@ -905,7 +905,7 @@ ret_t debugger_lldb_dispatch_messages(debugger_t* debugger) {
}

ret_t debugger_lldb_wait_for_completed(debugger_t* debugger) {
while (debugger->state == DEBUGGER_PROGRAM_STATE_RUNNING) {
while (debugger_get_state(debugger) == DEBUGGER_PROGRAM_STATE_RUNNING) {
if (debugger_lldb_dispatch_one(debugger, 100) != RET_OK) {
break;
}
Expand Down Expand Up @@ -1292,7 +1292,7 @@ static ret_t debugger_lldb_on_destroy(tk_object_t* obj) {
debugger_lldb_t* lldb = DEBUGGER_LLDB(obj);
return_value_if_fail(lldb != NULL, RET_BAD_PARAMS);

if (debugger->state == DEBUGGER_PROGRAM_STATE_RUNNING) {
if (debugger_get_state(debugger) == DEBUGGER_PROGRAM_STATE_RUNNING) {
debugger_lldb_disconnect(DEBUGGER(obj), TRUE);
}

Expand Down

0 comments on commit 1cfa5e7

Please sign in to comment.