diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index ca3898bc..6c8fd3c0 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -13748,11 +13748,12 @@ rd_frame(void) }break; case RD_CmdKind_State: { - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, "state:\n{\n"); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " running: %i\n", d_ctrl_targets_running()); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " run_gen: %I64u\n", d_run_gen()); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " stop_count: %I64u\n", d_stop_count()); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " ip: 0x%I64x\n", d_ctrl_last_stop_event().rip_vaddr); + String8List state_parts = {0}; + str8_list_pushf(scratch.arena, &state_parts, "state:\n{\n"); + str8_list_pushf(scratch.arena, &state_parts, " running: %i\n", d_ctrl_targets_running()); + str8_list_pushf(scratch.arena, &state_parts, " run_gen: %I64u\n", d_run_gen()); + str8_list_pushf(scratch.arena, &state_parts, " stop_count: %I64u\n", d_stop_count()); + str8_list_pushf(scratch.arena, &state_parts, " ip: 0x%I64x\n", d_ctrl_last_stop_event().rip_vaddr); { Access *access = access_open(); D_Event evt = d_ctrl_last_stop_event(); @@ -13766,28 +13767,28 @@ rd_frame(void) RDI_Symbol *procedure = rdi_procedure_from_voff(rdi, voff); String8 name = fully_qualified_str8_from_rdi_symbol(scratch.arena, rdi, procedure); name = escaped_from_raw_str8(scratch.arena, name); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " ip_module: \"%S\"\n", str8_skip_last_slash(module->string)); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " ip_voff: 0x%I64x\n", voff); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " ip_voff_symbol: \"%S\"\n", name); + str8_list_pushf(scratch.arena, &state_parts, " ip_module: \"%S\"\n", str8_skip_last_slash(module->string)); + str8_list_pushf(scratch.arena, &state_parts, " ip_voff: 0x%I64x\n", voff); + str8_list_pushf(scratch.arena, &state_parts, " ip_voff_symbol: \"%S\"\n", name); access_close(access); } { D_Event evt = d_ctrl_last_stop_event(); DR_FStrList explanation_fstrs = rd_stop_explanation_fstrs_from_ctrl_event(scratch.arena, &evt); String8 explanation_string = dr_string_from_fstrs(scratch.arena, &explanation_fstrs); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " stop_event:\n {\n"); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " arch: %S\n", string_from_arch(evt.arch)); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " vaddr_range: [0x%I64x, 0x%I64x)\n", evt.vaddr_rng.min, evt.vaddr_rng.max); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " ip_vaddr: 0x%I64x\n", evt.rip_vaddr); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " stack_base: 0x%I64x\n", evt.stack_base); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " tls_root: 0x%I64x\n", evt.tls_root); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " tls_index: 0x%I64x\n", evt.tls_index); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " timestamp: 0x%I64x\n", evt.timestamp); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " exception_code: 0x%I64x\n", (U64)evt.exception_code); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " bp_flags: 0x%I64x\n", (U64)evt.bp_flags); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " string: \"%S\"\n", escaped_from_raw_str8(scratch.arena, evt.string)); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " explanation: \"%S\"\n", escaped_from_raw_str8(scratch.arena, explanation_string)); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " }\n"); + str8_list_pushf(scratch.arena, &state_parts, " stop_event:\n {\n"); + str8_list_pushf(scratch.arena, &state_parts, " arch: %S\n", string_from_arch(evt.arch)); + str8_list_pushf(scratch.arena, &state_parts, " vaddr_range: [0x%I64x, 0x%I64x)\n", evt.vaddr_rng.min, evt.vaddr_rng.max); + str8_list_pushf(scratch.arena, &state_parts, " ip_vaddr: 0x%I64x\n", evt.rip_vaddr); + str8_list_pushf(scratch.arena, &state_parts, " stack_base: 0x%I64x\n", evt.stack_base); + str8_list_pushf(scratch.arena, &state_parts, " tls_root: 0x%I64x\n", evt.tls_root); + str8_list_pushf(scratch.arena, &state_parts, " tls_index: 0x%I64x\n", evt.tls_index); + str8_list_pushf(scratch.arena, &state_parts, " timestamp: 0x%I64x\n", evt.timestamp); + str8_list_pushf(scratch.arena, &state_parts, " exception_code: 0x%I64x\n", (U64)evt.exception_code); + str8_list_pushf(scratch.arena, &state_parts, " bp_flags: 0x%I64x\n", (U64)evt.bp_flags); + str8_list_pushf(scratch.arena, &state_parts, " string: \"%S\"\n", escaped_from_raw_str8(scratch.arena, evt.string)); + str8_list_pushf(scratch.arena, &state_parts, " explanation: \"%S\"\n", escaped_from_raw_str8(scratch.arena, explanation_string)); + str8_list_pushf(scratch.arena, &state_parts, " }\n"); } { Access *access = access_open(); @@ -13800,12 +13801,12 @@ rd_frame(void) DI_Key dbgi_key = d_dbgi_key_from_module(module); RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); E_String2NumMap *locals_map = e_push_locals_map_from_rdi_voff(scratch.arena, rdi, voff); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " locals:\n {\n"); + str8_list_pushf(scratch.arena, &state_parts, " locals:\n {\n"); for(E_String2NumMapNode *n = locals_map->first; n != 0; n = n->order_next) { - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " %S\n", n->string); + str8_list_pushf(scratch.arena, &state_parts, " %S\n", n->string); } - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " }\n"); + str8_list_pushf(scratch.arena, &state_parts, " }\n"); access_close(access); } { @@ -13819,48 +13820,50 @@ rd_frame(void) String8 dbgi_path = dbg_path->string; DI_Key dbgi_key = d_dbgi_key_from_debug_info_path(dbg_path); D_LineList lines = d_lines_from_dbgi_key_path_voff(scratch.arena, dbgi_key, dbgi_path, voff); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " lines:\n {\n"); + str8_list_pushf(scratch.arena, &state_parts, " lines:\n {\n"); for EachNode(n, D_LineNode, lines.first) { D_Line line = n->v; String8 line_file_name = str8_skip_last_slash(line.file_path); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " {\n"); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " file_name: \"%S\"\n", line_file_name); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " line_num: %I64d\n", line.pt.line); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " column_num: %I64d\n", line.pt.column); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " voff_range: [0x%I64x, 0x%I64x)\n", line.voff_range.min, line.voff_range.max); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " }\n"); + str8_list_pushf(scratch.arena, &state_parts, " {\n"); + str8_list_pushf(scratch.arena, &state_parts, " file_name: \"%S\"\n", line_file_name); + str8_list_pushf(scratch.arena, &state_parts, " line_num: %I64d\n", line.pt.line); + str8_list_pushf(scratch.arena, &state_parts, " column_num: %I64d\n", line.pt.column); + str8_list_pushf(scratch.arena, &state_parts, " voff_range: [0x%I64x, 0x%I64x)\n", line.voff_range.min, line.voff_range.max); + str8_list_pushf(scratch.arena, &state_parts, " }\n"); } - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " }\n"); + str8_list_pushf(scratch.arena, &state_parts, " }\n"); } { - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " threads:\n {\n"); + str8_list_pushf(scratch.arena, &state_parts, " threads:\n {\n"); D_EntityArray threads = d_entity_array_from_kind(D_EntityKind_Thread); for EachIndex(idx, threads.count) { D_Entity *thread = threads.v[idx]; - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " {\n"); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " name: \"%S\"\n", escaped_from_raw_str8(scratch.arena, thread->string)); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " id: %I64u\n", thread->id); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " ip: 0x%I64x\n", d_query_cached_rip_from_thread(thread)); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " }\n"); + str8_list_pushf(scratch.arena, &state_parts, " {\n"); + str8_list_pushf(scratch.arena, &state_parts, " name: \"%S\"\n", escaped_from_raw_str8(scratch.arena, thread->string)); + str8_list_pushf(scratch.arena, &state_parts, " id: %I64u\n", thread->id); + str8_list_pushf(scratch.arena, &state_parts, " ip: 0x%I64x\n", d_query_cached_rip_from_thread(thread)); + str8_list_pushf(scratch.arena, &state_parts, " }\n"); } - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " }\n"); + str8_list_pushf(scratch.arena, &state_parts, " }\n"); } { - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " modules:\n {\n"); + str8_list_pushf(scratch.arena, &state_parts, " modules:\n {\n"); D_EntityArray modules = d_entity_array_from_kind(D_EntityKind_Module); for EachIndex(idx, modules.count) { D_Entity *module = modules.v[idx]; - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " {\n"); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " name: \"%S\"\n", escaped_from_raw_str8(scratch.arena, module->string)); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " vaddr_range: [0x%I64x, 0x%I64x)\n", module->vaddr_range.min, module->vaddr_range.max); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " }\n"); + str8_list_pushf(scratch.arena, &state_parts, " {\n"); + str8_list_pushf(scratch.arena, &state_parts, " name: \"%S\"\n", escaped_from_raw_str8(scratch.arena, module->string)); + str8_list_pushf(scratch.arena, &state_parts, " vaddr_range: [0x%I64x, 0x%I64x)\n", module->vaddr_range.min, module->vaddr_range.max); + str8_list_pushf(scratch.arena, &state_parts, " }\n"); } - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " }\n"); + str8_list_pushf(scratch.arena, &state_parts, " }\n"); } - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, "}\n"); + str8_list_pushf(scratch.arena, &state_parts, "}\n"); + String8 state = str8_list_join(rd_state->cmd_output_arena, &state_parts, 0); + str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, state); }break; case RD_CmdKind_Eval: { diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index d82b85a6..72c302d4 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -843,12 +843,12 @@ entry_point(CmdLine *cmd_line) } //- rjf: receive socket data, run as IPC messages + SOCK_Protocol ipc_protocol = SOCK_Protocol_TCP; + SOCK_Endpoint ipc_endpoint = {0}; { Temp scratch = scratch_begin(0, 0); - SOCK_Protocol protocol = SOCK_Protocol_TCP; - SOCK_Endpoint endpoint = {0}; String8 msg = {0}; - if(sock_recv(scratch.arena, icp_sock_session, &protocol, &endpoint, &msg, 0)) + if(sock_recv(scratch.arena, icp_sock_session, &ipc_protocol, &ipc_endpoint, &msg, 0)) { String8List cmd_parts_of_msg = str8_split(scratch.arena, msg, (U8 *)";", 1, 0); RD_WindowState *dst_ws = rd_state->first_window_state; @@ -916,6 +916,7 @@ entry_point(CmdLine *cmd_line) } //- rjf: gather command outputs & write them +#if 0 if(ipc_command_frame) { if(ipc_main2sender_shared_memory_base != 0 && @@ -932,6 +933,15 @@ entry_point(CmdLine *cmd_line) semaphore_drop(ipc_main2sender_lock_semaphore); } } +#endif + + //- rjf: gather command outputs & send them back back to sender + if(ipc_command_frame) + { + StringJoin join = {s(""), s("\0"), s("")}; + String8 msg = str8_list_join(scratch.arena, &rd_state->cmd_outputs, &join); + sock_send(icp_sock_session, ipc_protocol, ipc_endpoint, msg, now_time_us()+5000000); + } } } diff --git a/src/win32/socket/win32_socket.c b/src/win32/socket/win32_socket.c index 417e167c..8bcfcdb9 100644 --- a/src/win32/socket/win32_socket.c +++ b/src/win32/socket/win32_socket.c @@ -165,7 +165,7 @@ sock_async_tick(void) struct SendTask { SendTask *next; - SOCK_Session session; + W32_SOCK_Session *session; SOCK_Endpoint endpoint; String8 data; }; @@ -193,10 +193,12 @@ sock_async_tick(void) SOCK_Endpoint endpoint = {0}; endpoint.address_u64[0] = header[2]; endpoint.address_u64[1] = header[3]; + endpoint.port = port; U64 data_size = header[4]; U8 *data = push_array(scratch.arena, U8, data_size); guarded_ring_read_or_wait(&g, data_size, data, max_U64); SendTask *t = push_array(scratch.arena, SendTask, 1); + t->session = s; t->endpoint = endpoint; t->data = str8(data, data_size); switch(protocol) @@ -223,7 +225,7 @@ sock_async_tick(void) // for(SendTask *t = first_tcp_send; t != 0; t = t->next) { - W32_SOCK_Session *session = (W32_SOCK_Session *)t->session.u64[0]; + W32_SOCK_Session *session = t->session; U64 hash = u64_hash_from_str8(str8_struct(&t->endpoint)); U64 slot_idx = hash%session->connection_slots_count; W32_SOCK_ConnectionSlot *slot = &session->connection_slots[slot_idx];