From f37f8592e174b035bac337ae8d5a4631c4bdf9e4 Mon Sep 17 00:00:00 2001 From: lixianjing Date: Wed, 8 May 2024 16:49:10 +0800 Subject: [PATCH] improve debugger lldb --- docs/changes.md | 2 ++ src/debugger/debugger_lldb.c | 38 +++++++++++++++++++++++++++++++++++- src/debugger/debugger_lldb.h | 2 ++ tools/fdb/awplc.py | 15 +++++--------- tools/fdb/lldb.json | 6 +++++- 5 files changed, 51 insertions(+), 12 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 4a7384cb0..1148e6475 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -1,7 +1,9 @@ # 最新动态 + 2024/05/8 * 完善value_uint32(感谢华健提供补丁) * 完善fscript iformat(感谢华健提供补丁) + * 完善debugger_lldb(感谢智明提供补丁) 2024/05/7 * 修复触摸点击edit子控件button弹出软键盘问题(感谢颖健提供补丁) diff --git a/src/debugger/debugger_lldb.c b/src/debugger/debugger_lldb.c index 15d195902..5718e8005 100644 --- a/src/debugger/debugger_lldb.c +++ b/src/debugger/debugger_lldb.c @@ -90,6 +90,8 @@ #define LLDB_KEY_TERMINATE_DEBUGGEE "terminateDebuggee" #define LLDB_KEY_VARIABLES_REFERENCE "variablesReference" +#define LLDB_KEY_ST_FIRST_CODE_BREAKPOINTS "stFirstCodeBreakPoints" + #define VARREF_LOCALS (int64_t)1 #define VARREF_GLOBALS (int64_t)2 #define VARREF_REGS (int64_t)3 @@ -133,6 +135,26 @@ static ret_t debugger_lldb_load_init_commands(debugger_lldb_t* lldb, conf_node_t return RET_OK; } +static ret_t debugger_lldb_load_st_first_code_breakpoints(debugger_lldb_t* lldb, conf_node_t* node) { + conf_node_t* iter = conf_node_get_first_child(node); + object_array_clear_props(lldb->st_first_code_breakpoints); + + while (iter != NULL) { + value_t v; + if (conf_node_get_value(iter, &v) == RET_OK) { + const char* cmd = value_str(&v); + if (cmd != NULL) { + log_debug("init command: %s\n", cmd); + object_array_push(lldb->st_first_code_breakpoints, value_set_str(&v, cmd)); + } + } + + iter = iter->next; + } + + return RET_OK; +} + static ret_t debugger_lldb_load_target_create_commands_commands(debugger_lldb_t* lldb, conf_node_t* node) { conf_node_t* iter = conf_node_get_first_child(node); @@ -167,11 +189,16 @@ static ret_t debugger_lldb_load_config(debugger_t* debugger, const char* filenam if (doc != NULL) { lldb->timeout = conf_doc_get_int(doc, "timeout", 3000); log_debug("timeout:%d\n", lldb->timeout); - node = conf_node_find_child(doc->root, "initCommands"); + node = conf_node_find_child(doc->root, LLDB_KEY_INIT_COMMANDS); if (node != NULL) { ret = debugger_lldb_load_init_commands(lldb, node); } + node = conf_node_find_child(doc->root, LLDB_KEY_ST_FIRST_CODE_BREAKPOINTS); + if (node != NULL) { + ret = debugger_lldb_load_st_first_code_breakpoints(lldb, node); + } + node = conf_node_find_child(doc->root, "targetCreateCommands"); if (node != NULL) { ret = debugger_lldb_load_target_create_commands_commands(lldb, node); @@ -532,6 +559,7 @@ static ret_t debugger_lldb_init(debugger_t* debugger) { ret = debugger_lldb_dispatch_until_get_resp_simple(debugger, LLDB_CMD_INITIALIZE, LLDB_REQUEST_TIMEOUT); } lldb->init_commands = object_array_create(); + lldb->st_first_code_breakpoints = object_array_create(); lldb->target_create_commands = object_array_create(); TK_OBJECT_UNREF(req); @@ -612,6 +640,10 @@ static tk_object_t* debugger_lldb_create_launch_req(debugger_t* debugger, const tk_object_set_prop_object(arguments, LLDB_KEY_INIT_COMMANDS, lldb->init_commands); } + if (lldb->st_first_code_breakpoints != NULL) { + tk_object_set_prop_object(arguments, LLDB_KEY_ST_FIRST_CODE_BREAKPOINTS, lldb->st_first_code_breakpoints); + } + TK_OBJECT_UNREF(args); TK_OBJECT_UNREF(arguments); @@ -695,6 +727,9 @@ static tk_object_t* debugger_lldb_create_attach_req(debugger_t* debugger, const if (lldb->init_commands != NULL) { tk_object_set_prop_object(arguments, LLDB_KEY_INIT_COMMANDS, lldb->init_commands); } + if (lldb->st_first_code_breakpoints != NULL) { + tk_object_set_prop_object(arguments, LLDB_KEY_ST_FIRST_CODE_BREAKPOINTS, lldb->st_first_code_breakpoints); + } return req; error: @@ -1543,6 +1578,7 @@ static ret_t debugger_lldb_on_destroy(tk_object_t* obj) { TK_OBJECT_UNREF(lldb->sources); TK_OBJECT_UNREF(lldb->callstack); TK_OBJECT_UNREF(lldb->init_commands); + TK_OBJECT_UNREF(lldb->st_first_code_breakpoints); TK_OBJECT_UNREF(lldb->target_create_commands); TK_OBJECT_UNREF(lldb->source_break_points); TK_OBJECT_UNREF(lldb->resps); diff --git a/src/debugger/debugger_lldb.h b/src/debugger/debugger_lldb.h index 55d90e186..542f71dd1 100644 --- a/src/debugger/debugger_lldb.h +++ b/src/debugger/debugger_lldb.h @@ -71,6 +71,8 @@ typedef struct _debugger_lldb_t { tk_object_t* source_break_points; tk_object_t* init_commands; tk_object_t* target_create_commands; + /* st 特有的首行代码断点 */ + tk_object_t* st_first_code_breakpoints; uint32_t timeout; } debugger_lldb_t; diff --git a/tools/fdb/awplc.py b/tools/fdb/awplc.py index 9e557f0d5..e979367bf 100644 --- a/tools/fdb/awplc.py +++ b/tools/fdb/awplc.py @@ -1,20 +1,15 @@ import os import lldb -if not 'AWPLC_USER_FUNCTIONS' in os.environ: - os.environ["AWPLC_USER_FUNCTIONS"] = "awplc_user_functions.txt" - -if os.path.isfile(os.environ["AWPLC_USER_FUNCTIONS"]) == False: - print("File awplc_user_functions.txt not found") - class StopHook: def __init__(self, target, extra_args1, extra_args2): self.target = target def handle_stop(self, exe_ctx, stream): name = exe_ctx.GetFrame().GetFunctionName() - print('stop in: ' + name); - if name.find('AWPLC_APP::') != -1: - return True + if name != None : + print('stop in: ' + name); + if name.find('AWPLC_APP::') != -1: + return True return False -print('load awplc.py'); +print('load awplc.py'); \ No newline at end of file diff --git a/tools/fdb/lldb.json b/tools/fdb/lldb.json index d8d8d0239..098261f4c 100644 --- a/tools/fdb/lldb.json +++ b/tools/fdb/lldb.json @@ -2,7 +2,11 @@ "timeout": 3000, "initCommands": [ "command script import \"/Users/jim/work/awtk-root/awtk/tools/fdb/awplc.py\"", - "target stop-hook add -P awplc.StopHook" + "target stop-hook add -P awplc.StopHook", + "environment AWPLC_USER_FUNCTIONS:/Users/jim/work/awtk-root/awplc/wasm-rt/awplc_user_functions.txt" + ], + "stFirstCodeBreakPoints" : [ + "/Users/jim/work/awtk-root/awplc/wasm-rt/src/main.st:5" ], "targetCreateCommands": [ "process connect -p wasm connect://192.168.31.87:1234",