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

📄 core.c

📁 早期freebsd实现
💻 C
字号:
/* Core dump and executable file functions above target vector, for GDB.   Copyright 1986, 1987, 1989, 1991, 1992 Free Software Foundation, Inc.This file is part of GDB.This program is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2 of the License, or(at your option) any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free SoftwareFoundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */#include "defs.h"#include <errno.h>#include <signal.h>#include <fcntl.h>#include "frame.h"  /* required by inferior.h */#include "inferior.h"#include "symtab.h"#include "command.h"#include "bfd.h"#include "target.h"#include "gdbcore.h"extern char registers[];/* Hook for `exec_file_command' command to call.  */void (*exec_file_display_hook) PARAMS ((char *)) = NULL;/* Binary file diddling handle for the core file.  */bfd *core_bfd = NULL;/* Backward compatability with old way of specifying core files.  */voidcore_file_command (filename, from_tty)     char *filename;     int from_tty;{#ifdef NOCOREFILE  error ("GDB can't read core files on this machine.");#else  extern struct target_ops core_ops;  struct target_ops *t = &core_ops;  dont_repeat ();			/* Either way, seems bogus. */  if (!filename)    (t->to_detach) (filename, from_tty);  else    (t->to_open) (filename, from_tty);#endif}/* Call this to specify the hook for exec_file_command to call back.   This is called from the x-window display code.  */voidspecify_exec_file_hook (hook)     void (*hook) PARAMS ((char *));{  exec_file_display_hook = hook;}/* The exec file must be closed before running an inferior.   If it is needed again after the inferior dies, it must   be reopened.  */voidclose_exec_file (){#ifdef FIXME  if (exec_bfd)    bfd_tempclose (exec_bfd);#endif}voidreopen_exec_file (){#ifdef FIXME  if (exec_bfd)    bfd_reopen (exec_bfd);#endif}/* If we have both a core file and an exec file,   print a warning if they don't go together.  */voidvalidate_files (){  if (exec_bfd && core_bfd)    {      if (!core_file_matches_executable_p (core_bfd, exec_bfd))	warning ("core file may not match specified executable file.");      else if (bfd_get_mtime(exec_bfd) > bfd_get_mtime(core_bfd))	warning ("exec file is newer than core file.");    }}/* Return the name of the executable file as a string.   ERR nonzero means get error if there is none specified;   otherwise return 0 in that case.  */char *get_exec_file (err)     int err;{  if (exec_bfd) return bfd_get_filename(exec_bfd);  if (!err)     return NULL;  error ("No executable file specified.\n\Use the \"file\" or \"exec-file\" command.");  return NULL;}/* Report a memory error with error().  */voidmemory_error (status, memaddr)     int status;     CORE_ADDR memaddr;{  if (status == EIO)    {      /* Actually, address between memaddr and memaddr + len	 was out of bounds. */      error ("Cannot access memory at address %s.", local_hex_string(memaddr));    }  else    {      error ("Error accessing memory address %s: %s.",	     local_hex_string (memaddr), safe_strerror (status));    }}/* Same as target_read_memory, but report an error if can't read.  */voidread_memory (memaddr, myaddr, len)     CORE_ADDR memaddr;     char *myaddr;     int len;{  int status;  status = target_read_memory (memaddr, myaddr, len);  if (status != 0)    memory_error (status, memaddr);}/* Same as target_write_memory, but report an error if can't write.  */voidwrite_memory (memaddr, myaddr, len)     CORE_ADDR memaddr;     char *myaddr;     int len;{  int status;  status = target_write_memory (memaddr, myaddr, len);  if (status != 0)    memory_error (status, memaddr);}/* Read an integer from debugged memory, given address and number of bytes.  */longread_memory_integer (memaddr, len)     CORE_ADDR memaddr;     int len;{  char cbuf;  short sbuf;  int ibuf;  long lbuf;  if (len == sizeof (char))    {      read_memory (memaddr, &cbuf, len);      return cbuf;    }  if (len == sizeof (short))    {      read_memory (memaddr, (char *)&sbuf, len);      SWAP_TARGET_AND_HOST (&sbuf, sizeof (short));      return sbuf;    }  if (len == sizeof (int))    {      read_memory (memaddr, (char *)&ibuf, len);      SWAP_TARGET_AND_HOST (&ibuf, sizeof (int));      return ibuf;    }  if (len == sizeof (lbuf))    {      read_memory (memaddr, (char *)&lbuf, len);      SWAP_TARGET_AND_HOST (&lbuf, sizeof (lbuf));      return lbuf;    }  error ("Cannot handle integers of %d bytes.", len);  return -1;	/* for lint */}void_initialize_core(){  add_com ("core-file", class_files, core_file_command,	   "Use FILE as core dump for examining memory and registers.\n\No arg means have no core file.  This command has been superseded by the\n\`target core' and `detach' commands.");}

⌨️ 快捷键说明

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