⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mi-main.c

📁 这个是LINUX下的GDB调度工具的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
  char word_format;  long word_size;  /* FIXME: ezannoni 2000-02-17 LONGEST could possibly not be big     enough when using a compiler other than GCC. */  LONGEST value;  void *buffer;  struct cleanup *old_chain;  long offset = 0;  int optind = 0;  char *optarg;  enum opt    {      OFFSET_OPT    };  static struct mi_opt opts[] =  {    {"o", OFFSET_OPT, 1},    0  };  while (1)    {      int opt = mi_getopt ("mi_cmd_data_write_memory", argc, argv, opts,			   &optind, &optarg);      if (opt < 0)	break;      switch ((enum opt) opt)	{	case OFFSET_OPT:	  offset = atol (optarg);	  break;	}    }  argv += optind;  argc -= optind;  if (argc != 4)    {      mi_error_message = xstrprintf ("mi_cmd_data_write_memory: Usage: [-o COLUMN_OFFSET] ADDR FORMAT WORD-SIZE VALUE.");      return MI_CMD_ERROR;    }  /* Extract all the arguments. */  /* Start address of the memory dump. */  addr = parse_and_eval_address (argv[0]);  /* The format character to use when displaying a memory word. See     the ``x'' command. */  word_format = argv[1][0];  /* The size of the memory word. */  word_size = atol (argv[2]);  /* Calculate the real address of the write destination. */  addr += (offset * word_size);  /* Get the value as a number */  value = parse_and_eval_address (argv[3]);  /* Get the value into an array */  buffer = xmalloc (word_size);  old_chain = make_cleanup (xfree, buffer);  store_signed_integer (buffer, word_size, value);  /* Write it down to memory */  write_memory (addr, buffer, word_size);  /* Free the buffer.  */  do_cleanups (old_chain);  return MI_CMD_DONE;}/* Execute a command within a safe environment.   Return <0 for error; >=0 for ok.   args->action will tell mi_execute_command what action   to perfrom after the given command has executed (display/supress   prompt, display error). */static intcaptured_mi_execute_command (struct ui_out *uiout, void *data){  struct captured_mi_execute_command_args *args =    (struct captured_mi_execute_command_args *) data;  struct mi_parse *context = args->command;  switch (context->op)    {    case MI_COMMAND:      /* A MI command was read from the input stream */      if (mi_debug_p)	/* FIXME: gdb_???? */	fprintf_unfiltered (raw_stdout, " token=`%s' command=`%s' args=`%s'\n",			    context->token, context->command, context->args);      /* FIXME: cagney/1999-09-25: Rather than this convoluted         condition expression, each function should return an         indication of what action is required and then switch on         that. */      args->action = EXECUTE_COMMAND_DISPLAY_PROMPT;      args->rc = mi_cmd_execute (context);      if (!target_can_async_p () || !target_executing)	{	  /* print the result if there were no errors	     Remember that on the way out of executing a command, you have	     to directly use the mi_interp's uiout, since the command could 	     have reset the interpreter, in which case the current uiout 	     will most likely crash in the mi_out_* routines.  */	  if (args->rc == MI_CMD_DONE)	    {	      fputs_unfiltered (context->token, raw_stdout);	      fputs_unfiltered ("^done", raw_stdout);	      mi_out_put (uiout, raw_stdout);	      mi_out_rewind (uiout);	      fputs_unfiltered ("\n", raw_stdout);	    }	  else if (args->rc == MI_CMD_ERROR)	    {	      if (mi_error_message)		{		  fputs_unfiltered (context->token, raw_stdout);		  fputs_unfiltered ("^error,msg=\"", raw_stdout);		  fputstr_unfiltered (mi_error_message, '"', raw_stdout);		  xfree (mi_error_message);		  fputs_unfiltered ("\"\n", raw_stdout);		}	      mi_out_rewind (uiout);	    }	  else if (args->rc == MI_CMD_CAUGHT_ERROR)	    {	      mi_out_rewind (uiout);	      args->action = EXECUTE_COMMAND_DISPLAY_ERROR;	      return 1;	    }	  else	    mi_out_rewind (uiout);	}      else if (sync_execution)	{	  /* Don't print the prompt. We are executing the target in	     synchronous mode. */	  args->action = EXECUTE_COMMAND_SUPRESS_PROMPT;	  return 1;	}      break;    case CLI_COMMAND:      /* A CLI command was read from the input stream */      /* This will be removed as soon as we have a complete set of         mi commands */      /* echo the command on the console. */      fprintf_unfiltered (gdb_stdlog, "%s\n", context->command);      mi_execute_cli_command (context->command, 0, NULL);      /* If we changed interpreters, DON'T print out anything. */      if (current_interp_named_p (INTERP_MI)	  || current_interp_named_p (INTERP_MI1)	  || current_interp_named_p (INTERP_MI2)	  || current_interp_named_p (INTERP_MI3))	{	  /* print the result */	  /* FIXME: Check for errors here. */	  fputs_unfiltered (context->token, raw_stdout);	  fputs_unfiltered ("^done", raw_stdout);	  mi_out_put (uiout, raw_stdout);	  mi_out_rewind (uiout);	  fputs_unfiltered ("\n", raw_stdout);	  args->action = EXECUTE_COMMAND_DISPLAY_PROMPT;	  args->rc = MI_CMD_DONE;	}      break;    }  return 1;}voidmi_execute_command (char *cmd, int from_tty){  struct mi_parse *command;  struct captured_mi_execute_command_args args;  struct ui_out *saved_uiout = uiout;  int result;  /* This is to handle EOF (^D). We just quit gdb. */  /* FIXME: we should call some API function here. */  if (cmd == 0)    quit_force (NULL, from_tty);  command = mi_parse (cmd);  if (command != NULL)    {      /* FIXME: cagney/1999-11-04: Can this use of catch_exceptions either         be pushed even further down or even eliminated? */      args.command = command;      result = catch_exceptions (uiout, captured_mi_execute_command, &args, "",				 RETURN_MASK_ALL);      if (args.action == EXECUTE_COMMAND_SUPRESS_PROMPT)	{	  /* The command is executing synchronously.  Bail out early	     suppressing the finished prompt. */	  mi_parse_free (command);	  return;	}      if (args.action == EXECUTE_COMMAND_DISPLAY_ERROR || result < 0)	{	  char *msg = error_last_message ();	  struct cleanup *cleanup = make_cleanup (xfree, msg);	  /* The command execution failed and error() was called	     somewhere */	  fputs_unfiltered (command->token, raw_stdout);	  fputs_unfiltered ("^error,msg=\"", raw_stdout);	  fputstr_unfiltered (msg, '"', raw_stdout);	  fputs_unfiltered ("\"\n", raw_stdout);	}      mi_parse_free (command);    }  fputs_unfiltered ("(gdb) \n", raw_stdout);  gdb_flush (raw_stdout);  /* print any buffered hook code */  /* ..... */}static enum mi_cmd_resultmi_cmd_execute (struct mi_parse *parse){  if (parse->cmd->argv_func != NULL      || parse->cmd->args_func != NULL)    {      /* FIXME: We need to save the token because the command executed         may be asynchronous and need to print the token again.         In the future we can pass the token down to the func         and get rid of the last_async_command */      /* The problem here is to keep the token around when we launch         the target, and we want to interrupt it later on.  The         interrupt command will have its own token, but when the         target stops, we must display the token corresponding to the         last execution command given. So we have another string where         we copy the token (previous_async_command), if this was         indeed the token of an execution command, and when we stop we         print that one. This is possible because the interrupt         command, when over, will copy that token back into the         default token string (last_async_command). */      if (target_executing)	{	  if (!previous_async_command)	    previous_async_command = xstrdup (last_async_command);	  if (strcmp (parse->command, "exec-interrupt"))	    {	      fputs_unfiltered (parse->token, raw_stdout);	      fputs_unfiltered ("^error,msg=\"", raw_stdout);	      fputs_unfiltered ("Cannot execute command ", raw_stdout);	      fputstr_unfiltered (parse->command, '"', raw_stdout);	      fputs_unfiltered (" while target running", raw_stdout);	      fputs_unfiltered ("\"\n", raw_stdout);	      return MI_CMD_ERROR;	    }	}      last_async_command = xstrdup (parse->token);      make_exec_cleanup (free_current_contents, &last_async_command);      /* FIXME: DELETE THIS! */      if (parse->cmd->args_func != NULL)	return parse->cmd->args_func (parse->args, 0 /*from_tty */ );      return parse->cmd->argv_func (parse->command, parse->argv, parse->argc);    }  else if (parse->cmd->cli.cmd != 0)    {      /* FIXME: DELETE THIS. */      /* The operation is still implemented by a cli command */      /* Must be a synchronous one */      mi_execute_cli_command (parse->cmd->cli.cmd, parse->cmd->cli.args_p,			      parse->args);      return MI_CMD_DONE;    }  else    {      /* FIXME: DELETE THIS. */      fputs_unfiltered (parse->token, raw_stdout);      fputs_unfiltered ("^error,msg=\"", raw_stdout);      fputs_unfiltered ("Undefined mi command: ", raw_stdout);      fputstr_unfiltered (parse->command, '"', raw_stdout);      fputs_unfiltered (" (missing implementation)", raw_stdout);      fputs_unfiltered ("\"\n", raw_stdout);      return MI_CMD_ERROR;    }}/* FIXME: This is just a hack so we can get some extra commands going.   We don't want to channel things through the CLI, but call libgdb directly *//* Use only for synchronous commands */voidmi_execute_cli_command (const char *cmd, int args_p, const char *args){  if (cmd != 0)    {      struct cleanup *old_cleanups;      char *run;      if (args_p)	run = xstrprintf ("%s %s", cmd, args);      else	run = xstrdup (cmd);      if (mi_debug_p)	/* FIXME: gdb_???? */	fprintf_unfiltered (gdb_stdout, "cli=%s run=%s\n",			    cmd, run);      old_cleanups = make_cleanup (xfree, run);      execute_command ( /*ui */ run, 0 /*from_tty */ );      do_cleanups (old_cleanups);      return;    }}enum mi_cmd_resultmi_execute_async_cli_command (char *mi, char *args, int from_tty){  struct cleanup *old_cleanups;  char *run;  char *async_args;  if (target_can_async_p ())    {      async_args = (char *) xmalloc (strlen (args) + 2);      make_exec_cleanup (free, async_args);      strcpy (async_args, args);      strcat (async_args, "&");      run = xstrprintf ("%s %s", mi, async_args);      make_exec_cleanup (free, run);      add_continuation (mi_exec_async_cli_cmd_continuation, NULL);      old_cleanups = NULL;    }  else    {      run = xstrprintf ("%s %s", mi, args);      old_cleanups = make_cleanup (xfree, run);    }  if (!target_can_async_p ())    {      /* NOTE: For synchronous targets asynchronous behavour is faked by         printing out the GDB prompt before we even try to execute the         command. */      if (last_async_command)	fputs_unfiltered (last_async_command, raw_stdout);      fputs_unfiltered ("^running\n", raw_stdout);      fputs_unfiltered ("(gdb) \n", raw_stdout);      gdb_flush (raw_stdout);    }  else    {      /* FIXME: cagney/1999-11-29: Printing this message before         calling execute_command is wrong.  It should only be printed         once gdb has confirmed that it really has managed to send a         run command to the target. */      if (last_async_command)	fputs_unfiltered (last_async_command, raw_stdout);      fputs_unfiltered ("^running\n", raw_stdout);    }  execute_command ( /*ui */ run, 0 /*from_tty */ );  if (!target_can_async_p ())    {      /* Do this before doing any printing.  It would appear that some         print code leaves garbage around in the buffer. */      do_cleanups (old_cleanups);      /* If the target was doing the operation synchronously we fake         the stopped message. */      if (last_async_command)	fputs_unfiltered (last_async_command, raw_stdout);      fputs_unfiltered ("*stopped", raw_stdout);      mi_out_put (uiout, raw_stdout);      mi_out_rewind (uiout);      fputs_unfiltered ("\n", raw_stdout);      return MI_CMD_QUIET;    }  return MI_CMD_DONE;}voidmi_exec_async_cli_cmd_continuation (struct continuation_arg *arg){  if (last_async_command)    fputs_unfiltered (last_async_command, raw_stdout);  fputs_unfiltered ("*stopped", raw_stdout);  mi_out_put (uiout, raw_stdout);  fputs_unfiltered ("\n", raw_stdout);  fputs_unfiltered ("(gdb) \n", raw_stdout);  gdb_flush (raw_stdout);  do_exec_cleanups (ALL_CLEANUPS);}voidmi_load_progress (const char *section_name,		  unsigned long sent_so_far,		  unsigned long total_section,		  unsigned long total_sent,		  unsigned long grand_total){  struct timeval time_now, delta, update_threshold;  static struct timeval last_update;  static char *previous_sect_name = NULL;  int new_section;  if (!current_interp_named_p (INTERP_MI)      && !current_interp_named_p (INTERP_MI1))    return;  update_threshold.tv_sec = 0;  update_threshold.tv_usec = 500000;  gettimeofday (&time_now, NULL);  delta.tv_usec = time_now.tv_usec - last_update.tv_usec;  delta.tv_sec = time_now.tv_sec - last_update.tv_sec;  if (delta.tv_usec < 0)    {      delta.tv_sec -= 1;      delta.tv_usec += 1000000;    }  new_section = (previous_sect_name ?		 strcmp (previous_sect_name, section_name) : 1);  if (new_section)    {      struct cleanup *cleanup_tuple;      xfree (previous_sect_name);      previous_sect_name = xstrdup (section_name);      if (last_async_command)	fputs_unfiltered (last_async_command, raw_stdout);      fputs_unfiltered ("+download", raw_stdout);      cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);      ui_out_field_string (uiout, "section", section_name);      ui_out_field_int (uiout, "section-size", total_section);      ui_out_field_int (uiout, "total-size", grand_total);      do_cleanups (cleanup_tuple);      mi_out_put (uiout, raw_stdout);      fputs_unfiltered ("\n", raw_stdout);      gdb_flush (raw_stdout);    }  if (delta.tv_sec >= update_threshold.tv_sec &&      delta.tv_usec >= update_threshold.tv_usec)    {      struct cleanup *cleanup_tuple;      last_update.tv_sec = time_now.tv_sec;      last_update.tv_usec = time_now.tv_usec;      if (last_async_command)	fputs_unfiltered (last_async_command, raw_stdout);      fputs_unfiltered ("+download", raw_stdout);      cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);      ui_out_field_string (uiout, "section", section_name);      ui_out_field_int (uiout, "section-sent", sent_so_far);      ui_out_field_int (uiout, "section-size", total_section);      ui_out_field_int (uiout, "total-sent", total_sent);      ui_out_field_int (uiout, "total-size", grand_total);      do_cleanups (cleanup_tuple);      mi_out_put (uiout, raw_stdout);      fputs_unfiltered ("\n", raw_stdout);      gdb_flush (raw_stdout);    }}voidmi_setup_architecture_data (void){  old_regs = xmalloc ((NUM_REGS + NUM_PSEUDO_REGS) * MAX_REGISTER_SIZE + 1);  memset (old_regs, 0, (NUM_REGS + NUM_PSEUDO_REGS) * MAX_REGISTER_SIZE + 1);}void_initialize_mi_main (void){  DEPRECATED_REGISTER_GDBARCH_SWAP (old_regs);  deprecated_register_gdbarch_swap (NULL, 0, mi_setup_architecture_data);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -