📄 tui-regs.c
字号:
if (data_item_win->handle == (WINDOW *) NULL) { data_item_win->height = 1; data_item_win->width = item_win_width; data_item_win->origin.x = (item_win_width * j) + 1; data_item_win->origin.y = cur_y; tui_make_window (data_item_win, DONT_BOX_WINDOW); scrollok (data_item_win->handle, FALSE); } touchwin (data_item_win->handle); /* Get the printable representation of the register and display it. */ tui_display_register (data_element_ptr, data_item_win); i++; /* next register */ } cur_y++; /* next row; */ } }}/* Function to display the registers in the content from 'start_element_no' on 'start_line_no' until the end of the register content or the end of the display height. This function checks that we won't display off the end of the register display. */voidtui_display_reg_element_at_line (int start_element_no, int start_line_no){ if (TUI_DATA_WIN->detail.data_display_info.regs_content != (tui_win_content) NULL && TUI_DATA_WIN->detail.data_display_info.regs_content_count > 0) { int element_no = start_element_no; if (start_element_no != 0 && start_line_no != 0) { int last_line_no, first_line_on_last_page; last_line_no = tui_last_regs_line_no (); first_line_on_last_page = last_line_no - (TUI_DATA_WIN->generic.height - 2); if (first_line_on_last_page < 0) first_line_on_last_page = 0; /* ** If there is no other data displayed except registers, ** and the element_no causes us to scroll past the end of the ** registers, adjust what element to really start the display at. */ if (TUI_DATA_WIN->detail.data_display_info.data_content_count <= 0 && start_line_no > first_line_on_last_page) element_no = tui_first_reg_element_no_inline (first_line_on_last_page); } tui_display_registers_from (element_no); }}/* Function to display the registers starting at line line_no in the data window. Answers the line number that the display actually started from. If nothing is displayed (-1) is returned. */inttui_display_registers_from_line (int line_no, int force_display){ if (TUI_DATA_WIN->detail.data_display_info.regs_content_count > 0) { int line, element_no; if (line_no < 0) line = 0; else if (force_display) { /* ** If we must display regs (force_display is true), then make ** sure that we don't display off the end of the registers. */ if (line_no >= tui_last_regs_line_no ()) { if ((line = tui_line_from_reg_element_no ( TUI_DATA_WIN->detail.data_display_info.regs_content_count - 1)) < 0) line = 0; } else line = line_no; } else line = line_no; element_no = tui_first_reg_element_no_inline (line); if (element_no < TUI_DATA_WIN->detail.data_display_info.regs_content_count) tui_display_reg_element_at_line (element_no, line); else line = (-1); return line; } return (-1); /* nothing was displayed */}/* This function check all displayed registers for changes in values, given a particular frame. If the values have changed, they are updated with the new value and highlighted. */voidtui_check_register_values (struct frame_info *frame){ if (TUI_DATA_WIN != NULL && TUI_DATA_WIN->generic.is_visible) { struct tui_data_info *display_info = &TUI_DATA_WIN->detail.data_display_info; if (display_info->regs_content_count <= 0 && display_info->display_regs) tui_show_registers (display_info->current_group); else { int i, j; for (i = 0; (i < display_info->regs_content_count); i++) { struct tui_data_element *data; struct tui_gen_win_info *data_item_win_ptr; int was_hilighted; data_item_win_ptr = &display_info->regs_content[i]-> which_element.data_window; data = &((struct tui_win_element *) data_item_win_ptr->content[0])->which_element.data; was_hilighted = data->highlight; tui_get_register (current_gdbarch, frame, data, data->item_no, &data->highlight); if (data->highlight || was_hilighted) { tui_display_register (data, data_item_win_ptr); } } } }}/* Display a register in a window. If hilite is TRUE, then the value will be displayed in reverse video */static voidtui_display_register (struct tui_data_element *data, struct tui_gen_win_info *win_info){ if (win_info->handle != (WINDOW *) NULL) { int i; if (data->highlight) wstandout (win_info->handle); wmove (win_info->handle, 0, 0); for (i = 1; i < win_info->width; i++) waddch (win_info->handle, ' '); wmove (win_info->handle, 0, 0); if (data->content) waddstr (win_info->handle, data->content); if (data->highlight) wstandend (win_info->handle); tui_refresh_win (win_info); }}static voidtui_reg_next_command (char *arg, int from_tty){ if (TUI_DATA_WIN != 0) { struct reggroup *group = TUI_DATA_WIN->detail.data_display_info.current_group; group = reggroup_next (current_gdbarch, group); if (group == 0) group = reggroup_next (current_gdbarch, 0); if (group) tui_show_registers (group); }}static voidtui_reg_float_command (char *arg, int from_tty){ tui_show_registers (float_reggroup);}static voidtui_reg_general_command (char *arg, int from_tty){ tui_show_registers (general_reggroup);}static voidtui_reg_system_command (char *arg, int from_tty){ tui_show_registers (system_reggroup);}static struct cmd_list_element *tuireglist;static voidtui_reg_command (char *args, int from_tty){ printf_unfiltered ("\"tui reg\" must be followed by the name of a " "tui reg command.\n"); help_list (tuireglist, "tui reg ", -1, gdb_stdout);}void_initialize_tui_regs (void){ struct cmd_list_element **tuicmd; tuicmd = tui_get_cmd_list (); add_prefix_cmd ("reg", class_tui, tui_reg_command, "TUI commands to control the register window.", &tuireglist, "tui reg ", 0, tuicmd); add_cmd ("float", class_tui, tui_reg_float_command, "Display only floating point registers\n", &tuireglist); add_cmd ("general", class_tui, tui_reg_general_command, "Display only general registers\n", &tuireglist); add_cmd ("system", class_tui, tui_reg_system_command, "Display only system registers\n", &tuireglist); add_cmd ("next", class_tui, tui_reg_next_command, "Display next register group\n", &tuireglist); if (xdb_commands) { add_com ("fr", class_tui, tui_reg_float_command, "Display only floating point registers\n"); add_com ("gr", class_tui, tui_reg_general_command, "Display only general registers\n"); add_com ("sr", class_tui, tui_reg_system_command, "Display only special registers\n"); add_com ("+r", class_tui, tui_scroll_regs_forward_command, "Scroll the registers window forward\n"); add_com ("-r", class_tui, tui_scroll_regs_backward_command, "Scroll the register window backward\n"); }}/******************************************* STATIC LOCAL FUNCTIONS ********************************************/extern int pagination_enabled;static voidtui_restore_gdbout (void *ui){ ui_file_delete (gdb_stdout); gdb_stdout = (struct ui_file*) ui; pagination_enabled = 1;}/* Get the register from the frame and make a printable representation of it in the data element. */static voidtui_register_format (struct gdbarch *gdbarch, struct frame_info *frame, struct tui_data_element *data_element, int regnum){ struct ui_file *stream; struct ui_file *old_stdout; const char *name; struct cleanup *cleanups; char *p, *s; int pos; struct type *type = gdbarch_register_type (gdbarch, regnum); name = gdbarch_register_name (gdbarch, regnum); if (name == 0) { return; } pagination_enabled = 0; old_stdout = gdb_stdout; stream = tui_sfileopen (256); gdb_stdout = stream; cleanups = make_cleanup (tui_restore_gdbout, (void*) old_stdout); if (TYPE_VECTOR (type) != 0 && 0) { char buf[MAX_REGISTER_SIZE]; int len; len = register_size (current_gdbarch, regnum); fprintf_filtered (stream, "%-14s ", name); get_frame_register (frame, regnum, buf); print_scalar_formatted (buf, type, 'f', len, stream); } else { gdbarch_print_registers_info (current_gdbarch, stream, frame, regnum, 1); } /* Save formatted output in the buffer. */ p = tui_file_get_strbuf (stream); /* Remove the possible \n. */ s = strrchr (p, '\n'); if (s && s[1] == 0) *s = 0; xfree (data_element->content); data_element->content = xstrdup (p); do_cleanups (cleanups);}/* Get the register value from the given frame and format it for the display. When changep is set, check if the new register value has changed with respect to the previous call. */static enum tui_statustui_get_register (struct gdbarch *gdbarch, struct frame_info *frame, struct tui_data_element *data, int regnum, int *changedp){ enum tui_status ret = TUI_FAILURE; if (changedp) *changedp = FALSE; if (target_has_registers) { char buf[MAX_REGISTER_SIZE]; get_frame_register (frame, regnum, buf); /* NOTE: cagney/2003-03-13: This is bogus. It is refering to the register cache and not the frame which could have pulled the register value off the stack. */ if (register_cached (regnum) >= 0) { if (changedp) { int size = register_size (gdbarch, regnum); char *old = (char*) data->value; int i; for (i = 0; i < size; i++) if (buf[i] != old[i]) { *changedp = TRUE; old[i] = buf[i]; } } /* Reformat the data content if the value changed. */ if (changedp == 0 || *changedp == TRUE) tui_register_format (gdbarch, frame, data, regnum); ret = TUI_SUCCESS; } } return ret;}static voidtui_scroll_regs_forward_command (char *arg, int from_tty){ tui_scroll (FORWARD_SCROLL, TUI_DATA_WIN, 1);}static voidtui_scroll_regs_backward_command (char *arg, int from_tty){ tui_scroll (BACKWARD_SCROLL, TUI_DATA_WIN, 1);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -