improve debugger

This commit is contained in:
lixianjing 2023-11-24 18:53:52 +08:00
parent 621a761888
commit 31bb101547
7 changed files with 70 additions and 33 deletions

View File

@ -3,6 +3,7 @@
2023/11/24
* 完善remote ui service
* 支持 combox 不需要手动写偏移文字也可以居中(感谢智明提供补丁)
* 修改 debugger 的 dispatch_messages 函数和调试下一步等按钮会修改 debugger 状态(感谢智明提供补丁)
2023/11/23
* object\_default支持设置属性时保持属性类型不变。

View File

@ -104,38 +104,63 @@ bool_t debugger_match(debugger_t* debugger, const char* code_id) {
}
ret_t debugger_step_in(debugger_t* debugger) {
ret_t ret = RET_OK;
return_value_if_fail(debugger != NULL && debugger->vt != NULL, RET_BAD_PARAMS);
return_value_if_fail(debugger->vt->step_in != NULL, RET_BAD_PARAMS);
return debugger->vt->step_in(debugger);
ret = debugger->vt->step_in(debugger);
if (ret == RET_OK) {
debugger_set_state(debugger, DEBUGGER_PROGRAM_STATE_RUNNING);
}
return ret;
}
ret_t debugger_step_out(debugger_t* debugger) {
ret_t ret = RET_OK;
return_value_if_fail(debugger != NULL && debugger->vt != NULL, RET_BAD_PARAMS);
return_value_if_fail(debugger->vt->step_out != NULL, RET_BAD_PARAMS);
return debugger->vt->step_out(debugger);
ret = debugger->vt->step_out(debugger);
if (ret == RET_OK) {
debugger_set_state(debugger, DEBUGGER_PROGRAM_STATE_RUNNING);
}
return ret;
}
ret_t debugger_step_over(debugger_t* debugger) {
ret_t ret = RET_OK;
return_value_if_fail(debugger != NULL && debugger->vt != NULL, RET_BAD_PARAMS);
return_value_if_fail(debugger->vt->step_over != NULL, RET_BAD_PARAMS);
return debugger->vt->step_over(debugger);
ret = debugger->vt->step_over(debugger);
if (ret == RET_OK) {
debugger_set_state(debugger, DEBUGGER_PROGRAM_STATE_RUNNING);
}
return ret;
}
ret_t debugger_step_loop_over(debugger_t* debugger) {
ret_t ret = RET_OK;
return_value_if_fail(debugger != NULL && debugger->vt != NULL, RET_BAD_PARAMS);
return_value_if_fail(debugger->vt->step_loop_over != NULL, RET_BAD_PARAMS);
return debugger->vt->step_loop_over(debugger);
ret = debugger->vt->step_loop_over(debugger);
if (ret == RET_OK) {
debugger_set_state(debugger, DEBUGGER_PROGRAM_STATE_RUNNING);
}
return ret;
}
ret_t debugger_continue(debugger_t* debugger) {
ret_t ret = RET_OK;
return_value_if_fail(debugger != NULL && debugger->vt != NULL, RET_BAD_PARAMS);
return_value_if_fail(debugger->vt->continve != NULL, RET_BAD_PARAMS);
return debugger->vt->continve(debugger);
ret = debugger->vt->continve(debugger);
if (ret == RET_OK) {
debugger_set_state(debugger, DEBUGGER_PROGRAM_STATE_RUNNING);
}
return ret;
}
tk_object_t* debugger_get_local(debugger_t* debugger, uint32_t frame_index) {
@ -344,9 +369,9 @@ ret_t debugger_set_current_thread_id(debugger_t* debugger, uint64_t thread_id) {
}
}
ret_t debugger_dispatch_messages(debugger_t* debugger) {
ret_t debugger_dispatch_messages(debugger_t* debugger, uint32_t timeout, uint32_t* ret_num) {
return_value_if_fail(debugger != NULL && debugger->vt != NULL, RET_BAD_PARAMS);
return_value_if_fail(debugger->vt->dispatch_messages != NULL, RET_BAD_PARAMS);
return_value_if_fail(debugger->vt->dispatch_messages != NULL && ret_num != NULL, RET_BAD_PARAMS);
return debugger->vt->dispatch_messages(debugger);
return debugger->vt->dispatch_messages(debugger, timeout, ret_num);
}

View File

@ -103,7 +103,7 @@ typedef tk_object_t* (*debugger_get_var_t)(debugger_t* debugger, const char* pat
typedef ret_t (*debugger_set_break_point_ex_t)(debugger_t* debugger, const char* position);
typedef ret_t (*debugger_remove_break_point_ex_t)(debugger_t* debugger, const char* position);
typedef ret_t (*debugger_set_current_frame_t)(debugger_t* debugger, uint32_t frame_index);
typedef ret_t (*debugger_dispatch_messages_t)(debugger_t* debugger);
typedef ret_t (*debugger_dispatch_messages_t)(debugger_t* debugger, uint32_t timeout, uint32_t* ret_num);
/*}扩展接口以支持lldb的DAP协议{*/
typedef debugger_t* (*debugger_fscript_create_t)(void);
@ -558,10 +558,12 @@ ret_t debugger_set_current_thread_id(debugger_t* debugger, uint64_t thread_id);
* @method debugger_dispatch_messages
* dispatch_messages()
* @param {debugger_t*} debugger debugger对象
* @param {uint32_t} timeout
* @param {uint32_t*} ret_num
*
* @return {ret_t} RET_OK表示成功
*/
ret_t debugger_dispatch_messages(debugger_t* debugger);
ret_t debugger_dispatch_messages(debugger_t* debugger, uint32_t timeout, uint32_t* ret_num);
/**
* @method debugger_set_state

View File

@ -131,7 +131,8 @@ static ret_t debugger_client_dispatch_one(debugger_t* debugger, debugger_resp_t*
return debugger_client_dispatch_message(debugger, resp);
}
static ret_t debugger_client_dispatch_messages(debugger_t* debugger) {
static ret_t debugger_client_dispatch_messages(debugger_t* debugger, uint32_t timeout, uint32_t* ret_num) {
ret_t ret = RET_OK;
debugger_resp_t resp;
tk_istream_t* in = NULL;
debugger_client_t* client = DEBUGGER_CLIENT(debugger);
@ -140,7 +141,8 @@ static ret_t debugger_client_dispatch_messages(debugger_t* debugger) {
memset(&resp, 0x00, sizeof(resp));
in = tk_iostream_get_istream(client->io);
while (tk_istream_wait_for_data(in, 10) == RET_OK) {
while ((ret = tk_istream_wait_for_data(in, timeout)) == RET_OK) {
*ret_num += 1;
if (debugger_client_dispatch_one(debugger, &resp) != RET_OK) {
break;
}
@ -150,7 +152,8 @@ static ret_t debugger_client_dispatch_messages(debugger_t* debugger) {
}
ret_t debugger_client_dispatch(debugger_t* debugger) {
return debugger_client_dispatch_messages(debugger);
uint32_t num = 0;
return debugger_client_dispatch_messages(debugger, 10, &num);
}
ret_t debugger_client_wait_for_completed(debugger_t* debugger) {

View File

@ -924,14 +924,16 @@ static ret_t debugger_lldb_simple_command(debugger_t* debugger, const char* cmd)
return ret;
}
ret_t debugger_lldb_dispatch_messages(debugger_t* debugger) {
while (debugger_lldb_dispatch_one(debugger, 10) == RET_OK) {
ret_t debugger_lldb_dispatch_messages(debugger_t* debugger, uint32_t timeout, uint32_t* ret_num) {
ret_t ret = RET_OK;
while ((ret = debugger_lldb_dispatch_one(debugger, timeout)) == RET_OK) {
*ret_num += 1;
if (debugger_get_state(debugger) == DEBUGGER_PROGRAM_STATE_RUNNING) {
break;
}
}
return RET_OK;
return ret;
}
ret_t debugger_lldb_wait_for_completed(debugger_t* debugger) {
@ -1105,13 +1107,14 @@ static tk_object_t* debugger_lldb_get_global(debugger_t* debugger) {
static tk_object_t* debugger_lldb_get_callstack(debugger_t* debugger) {
int32_t i = 0;
int32_t n = 0;
uint32_t num = 0;
char path[MAX_PATH + 1] = {0};
tk_object_t* ret_obj = NULL;
tk_object_t* callstack = NULL;
debugger_lldb_t* lldb = DEBUGGER_LLDB(debugger);
return_value_if_fail(lldb != NULL, NULL);
debugger_lldb_dispatch_messages(debugger);
debugger_lldb_dispatch_messages(debugger, 10, &num);
callstack = debugger_lldb_get_callstack_obj(debugger);
return_value_if_fail(callstack != NULL, NULL);
@ -1244,10 +1247,11 @@ static ret_t debugger_lldb_launch(debugger_t* debugger, const char* lang,
}
static ret_t debugger_lldb_get_code(debugger_t* debugger, binary_data_t* code) {
uint32_t num = 0;
debugger_lldb_t* lldb = DEBUGGER_LLDB(debugger);
return_value_if_fail(lldb != NULL && code != NULL, RET_BAD_PARAMS);
debugger_lldb_dispatch_messages(debugger);
debugger_lldb_dispatch_messages(debugger, 10, &num);
if (code != NULL && lldb->current_frame_source != NULL) {
code->data = (void*)(lldb->current_frame_source);

View File

@ -667,7 +667,8 @@ TEST(Debugger, event1) {
debugger_t* debugger = debugger_server_find_debugger(fscript->code_id);
ASSERT_EQ(debugger_is_paused(debugger), TRUE);
debugger_dispatch_messages(client);
uint32_t num;
debugger_dispatch_messages(client, 1, &num);
ASSERT_EQ(debugger_is_paused(client), TRUE);
ASSERT_EQ(debugger_continue(client), RET_OK);

View File

@ -551,43 +551,43 @@ static ret_t func_remove_break(app_info_t* app, tokenizer_t* tokenizer) {
}
static ret_t func_step_in(app_info_t* app, tokenizer_t* tokenizer) {
uint32_t num = 0;
debugger_step_in(app->debugger);
sleep_ms(300);
debugger_dispatch_messages(app->debugger);
debugger_dispatch_messages(app->debugger, 300, &num);
return fdb_show_code(app, FALSE);
}
static ret_t func_next(app_info_t* app, tokenizer_t* tokenizer) {
uint32_t num = 0;
debugger_step_over(app->debugger);
sleep_ms(300);
debugger_dispatch_messages(app->debugger);
debugger_dispatch_messages(app->debugger, 300, &num);
return fdb_show_code(app, FALSE);
}
static ret_t func_continue(app_info_t* app, tokenizer_t* tokenizer) {
uint32_t num = 0;
debugger_continue(app->debugger);
sleep_ms(300);
debugger_dispatch_messages(app->debugger);
debugger_dispatch_messages(app->debugger, 300, &num);
return fdb_show_code(app, FALSE);
}
static ret_t func_flush(app_info_t* app, tokenizer_t* tokenizer) {
debugger_dispatch_messages(app->debugger);
sleep_ms(300);
uint32_t num = 0;
debugger_dispatch_messages(app->debugger, 300, &num);
return RET_OK;
}
static ret_t func_step_out(app_info_t* app, tokenizer_t* tokenizer) {
uint32_t num = 0;
debugger_step_out(app->debugger);
sleep_ms(300);
debugger_dispatch_messages(app->debugger);
debugger_dispatch_messages(app->debugger, 300, &num);
return fdb_show_code(app, FALSE);
}
static ret_t func_step_loop_over(app_info_t* app, tokenizer_t* tokenizer) {
uint32_t num = 0;
debugger_step_loop_over(app->debugger);
sleep_ms(300);
debugger_dispatch_messages(app->debugger);
debugger_dispatch_messages(app->debugger, 300, &num);
return fdb_show_code(app, FALSE);
}
@ -750,20 +750,21 @@ ret_t fdb_shell_run(void) {
register_functions(obj);
while (TRUE) {
uint32_t num = 0;
char* line = aw_read_line(KMAG "[fdb] # " KNRM);
if (line == NULL) {
break;
}
if (app.debugger != NULL) {
debugger_dispatch_messages(app.debugger);
debugger_dispatch_messages(app.debugger, 16, &num);
}
if (fdb_shell_exec(&app, line) == RET_STOP) {
aw_read_line_free(line);
break;
}
if (app.debugger != NULL) {
debugger_dispatch_messages(app.debugger);
debugger_dispatch_messages(app.debugger, 16, &num);
}
aw_read_line_add_history(line);