亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? linux-low.c

?? 這個是LINUX下的GDB調度工具的源碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
      p_sig = malloc (sizeof (*p_sig));      p_sig->prev = process->pending_signals;      p_sig->signal = process->resume->sig;      process->pending_signals = p_sig;    }  process->resume = NULL;}/* Set DUMMY if this process has an interesting status pending.  */static intresume_status_pending_p (struct inferior_list_entry *entry, void *flag_p){  struct process_info *process = (struct process_info *) entry;  /* Processes which will not be resumed are not interesting, because     we might not wait for them next time through linux_wait.  */  if (process->resume->leave_stopped)    return 0;  /* If this thread has a removed breakpoint, we won't have any     events to report later, so check now.  check_removed_breakpoint     may clear status_pending_p.  We avoid calling check_removed_breakpoint     for any thread that we are not otherwise going to resume - this     lets us preserve stopped status when two threads hit a breakpoint.     GDB removes the breakpoint to single-step a particular thread     past it, then re-inserts it and resumes all threads.  We want     to report the second thread without resuming it in the interim.  */  if (process->status_pending_p)    check_removed_breakpoint (process);  if (process->status_pending_p)    * (int *) flag_p = 1;  return 0;}static voidlinux_resume (struct thread_resume *resume_info){  int pending_flag;  /* Yes, the use of a global here is rather ugly.  */  resume_ptr = resume_info;  for_each_inferior (&all_threads, linux_set_resume_request);  /* If there is a thread which would otherwise be resumed, which     has a pending status, then don't resume any threads - we can just     report the pending status.  Make sure to queue any signals     that would otherwise be sent.  */  pending_flag = 0;  find_inferior (&all_processes, resume_status_pending_p, &pending_flag);  if (debug_threads)    {      if (pending_flag)	fprintf (stderr, "Not resuming, pending status\n");      else	fprintf (stderr, "Resuming, no pending status\n");    }  if (pending_flag)    for_each_inferior (&all_threads, linux_queue_one_thread);  else    {      block_async_io ();      enable_async_io ();      for_each_inferior (&all_threads, linux_continue_one_thread);    }}#ifdef HAVE_LINUX_USRREGSintregister_addr (int regnum){  int addr;  if (regnum < 0 || regnum >= the_low_target.num_regs)    error ("Invalid register number %d.", regnum);  addr = the_low_target.regmap[regnum];  return addr;}/* Fetch one register.  */static voidfetch_register (int regno){  CORE_ADDR regaddr;  register int i;  char *buf;  if (regno >= the_low_target.num_regs)    return;  if ((*the_low_target.cannot_fetch_register) (regno))    return;  regaddr = register_addr (regno);  if (regaddr == -1)    return;  buf = alloca (register_size (regno));  for (i = 0; i < register_size (regno); i += sizeof (PTRACE_XFER_TYPE))    {      errno = 0;      *(PTRACE_XFER_TYPE *) (buf + i) =	ptrace (PTRACE_PEEKUSER, inferior_pid, (PTRACE_ARG3_TYPE) regaddr, 0);      regaddr += sizeof (PTRACE_XFER_TYPE);      if (errno != 0)	{	  /* Warning, not error, in case we are attached; sometimes the	     kernel doesn't let us at the registers.  */	  char *err = strerror (errno);	  char *msg = alloca (strlen (err) + 128);	  sprintf (msg, "reading register %d: %s", regno, err);	  error (msg);	  goto error_exit;	}    }  supply_register (regno, buf);error_exit:;}/* Fetch all registers, or just one, from the child process.  */static voidusr_fetch_inferior_registers (int regno){  if (regno == -1 || regno == 0)    for (regno = 0; regno < the_low_target.num_regs; regno++)      fetch_register (regno);  else    fetch_register (regno);}/* Store our register values back into the inferior.   If REGNO is -1, do this for all registers.   Otherwise, REGNO specifies which register (so we can save time).  */static voidusr_store_inferior_registers (int regno){  CORE_ADDR regaddr;  int i;  char *buf;  if (regno >= 0)    {      if (regno >= the_low_target.num_regs)	return;      if ((*the_low_target.cannot_store_register) (regno) == 1)	return;      regaddr = register_addr (regno);      if (regaddr == -1)	return;      errno = 0;      buf = alloca (register_size (regno));      collect_register (regno, buf);      for (i = 0; i < register_size (regno); i += sizeof (PTRACE_XFER_TYPE))	{	  errno = 0;	  ptrace (PTRACE_POKEUSER, inferior_pid, (PTRACE_ARG3_TYPE) regaddr,		  *(PTRACE_XFER_TYPE *) (buf + i));	  if (errno != 0)	    {	      if ((*the_low_target.cannot_store_register) (regno) == 0)		{		  char *err = strerror (errno);		  char *msg = alloca (strlen (err) + 128);		  sprintf (msg, "writing register %d: %s",			   regno, err);		  error (msg);		  return;		}	    }	  regaddr += sizeof (PTRACE_XFER_TYPE);	}    }  else    for (regno = 0; regno < the_low_target.num_regs; regno++)      usr_store_inferior_registers (regno);}#endif /* HAVE_LINUX_USRREGS */#ifdef HAVE_LINUX_REGSETSstatic intregsets_fetch_inferior_registers (){  struct regset_info *regset;  regset = target_regsets;  while (regset->size >= 0)    {      void *buf;      int res;      if (regset->size == 0)	{	  regset ++;	  continue;	}      buf = malloc (regset->size);      res = ptrace (regset->get_request, inferior_pid, 0, buf);      if (res < 0)	{	  if (errno == EIO)	    {	      /* If we get EIO on the first regset, do not try regsets again.		 If we get EIO on a later regset, disable that regset.  */	      if (regset == target_regsets)		{		  use_regsets_p = 0;		  return -1;		}	      else		{		  regset->size = 0;		  continue;		}	    }	  else	    {	      char s[256];	      sprintf (s, "ptrace(regsets_fetch_inferior_registers) PID=%d",		       inferior_pid);	      perror (s);	    }	}      regset->store_function (buf);      regset ++;    }  return 0;}static intregsets_store_inferior_registers (){  struct regset_info *regset;  regset = target_regsets;  while (regset->size >= 0)    {      void *buf;      int res;      if (regset->size == 0)	{	  regset ++;	  continue;	}      buf = malloc (regset->size);      regset->fill_function (buf);      res = ptrace (regset->set_request, inferior_pid, 0, buf);      if (res < 0)	{	  if (errno == EIO)	    {	      /* If we get EIO on the first regset, do not try regsets again.		 If we get EIO on a later regset, disable that regset.  */	      if (regset == target_regsets)		{		  use_regsets_p = 0;		  return -1;		}	      else		{		  regset->size = 0;		  continue;		}	    }	  else	    {	      perror ("Warning: ptrace(regsets_store_inferior_registers)");	    }	}      regset ++;      free (buf);    }  return 0;}#endif /* HAVE_LINUX_REGSETS */voidlinux_fetch_registers (int regno){#ifdef HAVE_LINUX_REGSETS  if (use_regsets_p)    {      if (regsets_fetch_inferior_registers () == 0)	return;    }#endif#ifdef HAVE_LINUX_USRREGS  usr_fetch_inferior_registers (regno);#endif}voidlinux_store_registers (int regno){#ifdef HAVE_LINUX_REGSETS  if (use_regsets_p)    {      if (regsets_store_inferior_registers () == 0)	return;    }#endif#ifdef HAVE_LINUX_USRREGS  usr_store_inferior_registers (regno);#endif}/* Copy LEN bytes from inferior's memory starting at MEMADDR   to debugger memory starting at MYADDR.  */static intlinux_read_memory (CORE_ADDR memaddr, char *myaddr, int len){  register int i;  /* Round starting address down to longword boundary.  */  register CORE_ADDR addr = memaddr & -(CORE_ADDR) sizeof (PTRACE_XFER_TYPE);  /* Round ending address up; get number of longwords that makes.  */  register int count    = (((memaddr + len) - addr) + sizeof (PTRACE_XFER_TYPE) - 1)      / sizeof (PTRACE_XFER_TYPE);  /* Allocate buffer of that many longwords.  */  register PTRACE_XFER_TYPE *buffer    = (PTRACE_XFER_TYPE *) alloca (count * sizeof (PTRACE_XFER_TYPE));  /* Read all the longwords */  for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE))    {      errno = 0;      buffer[i] = ptrace (PTRACE_PEEKTEXT, inferior_pid, (PTRACE_ARG3_TYPE) addr, 0);      if (errno)	return errno;    }  /* Copy appropriate bytes out of the buffer.  */  memcpy (myaddr, (char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1)), len);  return 0;}/* Copy LEN bytes of data from debugger memory at MYADDR   to inferior's memory at MEMADDR.   On failure (cannot write the inferior)   returns the value of errno.  */static intlinux_write_memory (CORE_ADDR memaddr, const char *myaddr, int len){  register int i;  /* Round starting address down to longword boundary.  */  register CORE_ADDR addr = memaddr & -(CORE_ADDR) sizeof (PTRACE_XFER_TYPE);  /* Round ending address up; get number of longwords that makes.  */  register int count  = (((memaddr + len) - addr) + sizeof (PTRACE_XFER_TYPE) - 1) / sizeof (PTRACE_XFER_TYPE);  /* Allocate buffer of that many longwords.  */  register PTRACE_XFER_TYPE *buffer = (PTRACE_XFER_TYPE *) alloca (count * sizeof (PTRACE_XFER_TYPE));  extern int errno;  if (debug_threads)    {      fprintf (stderr, "Writing %02x to %08lx\n", (unsigned)myaddr[0], (long)memaddr);    }  /* Fill start and end extra bytes of buffer with existing memory data.  */  buffer[0] = ptrace (PTRACE_PEEKTEXT, inferior_pid,		      (PTRACE_ARG3_TYPE) addr, 0);  if (count > 1)    {      buffer[count - 1]	= ptrace (PTRACE_PEEKTEXT, inferior_pid,		  (PTRACE_ARG3_TYPE) (addr + (count - 1)				      * sizeof (PTRACE_XFER_TYPE)),		  0);    }  /* Copy data to be written over corresponding part of buffer */  memcpy ((char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1)), myaddr, len);  /* Write the entire buffer.  */  for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE))    {      errno = 0;      ptrace (PTRACE_POKETEXT, inferior_pid, (PTRACE_ARG3_TYPE) addr, buffer[i]);      if (errno)	return errno;    }  return 0;}static voidlinux_look_up_symbols (void){#ifdef USE_THREAD_DB  if (using_threads)    return;  using_threads = thread_db_init ();#endif}static voidlinux_send_signal (int signum){  extern int signal_pid;  if (cont_thread > 0)    {      struct process_info *process;      process = get_thread_process (current_inferior);      kill_lwp (process->lwpid, signum);    }  else    kill_lwp (signal_pid, signum);}/* Copy LEN bytes from inferior's auxiliary vector starting at OFFSET   to debugger memory starting at MYADDR.  */static intlinux_read_auxv (CORE_ADDR offset, char *myaddr, unsigned int len){  char filename[PATH_MAX];  int fd, n;  snprintf (filename, sizeof filename, "/proc/%d/auxv", inferior_pid);  fd = open (filename, O_RDONLY);  if (fd < 0)    return -1;  if (offset != (CORE_ADDR) 0      && lseek (fd, (off_t) offset, SEEK_SET) != (off_t) offset)    n = -1;  else    n = read (fd, myaddr, len);  close (fd);  return n;}static struct target_ops linux_target_ops = {  linux_create_inferior,  linux_attach,  linux_kill,  linux_detach,  linux_thread_alive,  linux_resume,  linux_wait,  linux_fetch_registers,  linux_store_registers,  linux_read_memory,  linux_write_memory,  linux_look_up_symbols,  linux_send_signal,  linux_read_auxv,};static voidlinux_init_signals (){  /* FIXME drow/2002-06-09: As above, we should check with LinuxThreads     to find what the cancel signal actually is.  */  signal (__SIGRTMIN+1, SIG_IGN);}voidinitialize_low (void){  using_threads = 0;  set_target_ops (&linux_target_ops);  set_breakpoint_data (the_low_target.breakpoint,		       the_low_target.breakpoint_len);  init_registers ();  linux_init_signals ();}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人高清在线视频| 欧日韩精品视频| 99麻豆久久久国产精品免费 | 久久精品人人做人人爽97| 国产精品五月天| 奇米影视一区二区三区| 国产成人免费在线| 欧美高清性hdvideosex| 亚洲国产精品高清| 蜜臂av日日欢夜夜爽一区| 一本色道久久加勒比精品| 精品国产乱码久久久久久久久| 国产精品久久久久久久久久久免费看| 亚洲丰满少妇videoshd| 国产成人h网站| 精品日韩欧美在线| 天天综合色天天| 91精彩视频在线| 国产精品天天看| 国产一区在线观看麻豆| 欧美日韩国产经典色站一区二区三区 | 欧美日韩一区二区在线观看| 亚洲国产精品国自产拍av| 国产综合久久久久影院| 6080国产精品一区二区| 亚洲成人综合在线| 欧洲日韩一区二区三区| 亚洲人精品午夜| 波多野结衣精品在线| 国产日韩欧美不卡| 国产成人自拍网| 亚洲精品在线免费观看视频| 日韩成人一区二区| 在线电影欧美成精品| 婷婷中文字幕一区三区| 6080日韩午夜伦伦午夜伦| 偷偷要91色婷婷| 日韩一级高清毛片| 久久精品国产网站| 欧美电影免费提供在线观看| 美脚の诱脚舐め脚责91 | 91精品国产品国语在线不卡| 亚洲观看高清完整版在线观看| 一本色道久久综合精品竹菊| 亚洲精品乱码久久久久久日本蜜臀| 91一区二区三区在线观看| 一区二区三区国产精华| 在线观看日韩精品| 免费av成人在线| 久久综合视频网| 大陆成人av片| 亚洲激情一二三区| 在线观看91av| 国产精品一级片在线观看| 欧美精彩视频一区二区三区| 99久久er热在这里只有精品66| 亚洲欧美激情视频在线观看一区二区三区| 成人动漫av在线| 亚洲国产中文字幕| 日韩一区二区三区视频在线| 韩国女主播成人在线| 国产精品美女一区二区三区| jizzjizzjizz欧美| 亚洲成人自拍偷拍| 26uuu色噜噜精品一区二区| 成人av电影在线观看| 亚洲午夜三级在线| 精品国产精品一区二区夜夜嗨| 国产在线播放一区二区三区| 国产精品传媒在线| 欧美成人精品1314www| 成人精品视频.| 亚洲电影第三页| 久久精品在这里| 欧美色窝79yyyycom| 国产精品一卡二| 亚洲资源在线观看| 欧美韩日一区二区三区| 欧美性色黄大片| 成人综合婷婷国产精品久久蜜臀 | 丁香天五香天堂综合| 一区二区三区中文字幕电影| 精品国产91久久久久久久妲己| 在线观看三级视频欧美| 国内精品久久久久影院色| 亚洲高清免费视频| 国产精品五月天| 精品国产乱码久久久久久老虎| 91麻豆福利精品推荐| 国产揄拍国内精品对白| 亚洲h动漫在线| 国产精品理论片| 26uuu精品一区二区| 欧美艳星brazzers| av午夜精品一区二区三区| 精彩视频一区二区三区| 午夜精品视频在线观看| 亚洲欧洲av另类| 久久蜜桃av一区精品变态类天堂 | 色狠狠综合天天综合综合| 国产专区综合网| 久久精品国产第一区二区三区| 亚洲蜜桃精久久久久久久| 在线观看免费成人| 亚洲男人的天堂在线aⅴ视频| 91亚洲精品久久久蜜桃网站 | 高清视频一区二区| 国产婷婷色一区二区三区| 91麻豆福利精品推荐| 亚洲bdsm女犯bdsm网站| 极品少妇xxxx精品少妇偷拍| 精品一区二区在线视频| 蜜臀av性久久久久蜜臀av麻豆 | 国产精品色哟哟| www久久精品| 欧美一区二区三区男人的天堂| 91国产丝袜在线播放| 亚洲一区视频在线观看视频| 日韩欧美一二三区| 欧美午夜电影一区| 伊人性伊人情综合网| 国产午夜亚洲精品理论片色戒| 欧美电影免费观看高清完整版在线观看 | 99re成人在线| 91丨九色丨蝌蚪丨老版| av亚洲精华国产精华精| 亚洲一区二区三区四区五区黄| 亚洲欧美日韩中文字幕一区二区三区| 欧美日韩中文一区| 99国产欧美久久久精品| 99久久国产综合精品色伊| 亚洲乱码一区二区三区在线观看| 欧美激情一区三区| 亚洲欧洲另类国产综合| 成人欧美一区二区三区在线播放| 国产精品视频yy9299一区| 中文字幕在线不卡视频| 尤物视频一区二区| 日韩精品成人一区二区在线| 日本在线不卡视频一二三区| 久久黄色级2电影| 精品一区精品二区高清| 成人激情开心网| 91农村精品一区二区在线| 欧美日韩中文字幕一区二区| 日韩免费性生活视频播放| 欧美大度的电影原声| 久久久精品免费免费| 一区二区三区中文在线观看| 婷婷久久综合九色综合伊人色| 久久精品国产精品青草| 欧美aa在线视频| 欧美午夜在线一二页| av亚洲精华国产精华精| 国产精品第五页| 不卡视频在线观看| 欧美嫩在线观看| 国产日韩欧美综合在线| 中文无字幕一区二区三区 | 奇米色一区二区三区四区| 欧美日韩成人激情| 在线不卡的av| 亚洲成人第一页| 日本精品一级二级| 中文字幕一区二区三区四区 | 国产乱码精品一区二区三区忘忧草 | 51午夜精品国产| 韩国毛片一区二区三区| 欧美经典一区二区| 欧美日韩一区高清| 日韩成人dvd| 国产精品全国免费观看高清 | 国产精品国产三级国产普通话蜜臀 | 国产精品一区二区三区网站| 欧美国产97人人爽人人喊| 色综合激情五月| 久久99国产精品久久99 | 综合精品久久久| 欧美日韩三级视频| 成人黄色a**站在线观看| 五月激情丁香一区二区三区| 亚洲国产精品99久久久久久久久| 欧美午夜理伦三级在线观看| 蜜桃视频免费观看一区| 亚洲精品伦理在线| 国产精品麻豆网站| 久久久一区二区三区捆绑**| 欧美在线高清视频| 91久久线看在观草草青青| 风间由美性色一区二区三区| 黄色资源网久久资源365| 狠狠色丁香婷婷综合| 亚洲一区二区在线免费看| 日本一区二区三区免费乱视频| 欧美日本视频在线| 7777精品伊人久久久大香线蕉 | 精品系列免费在线观看| 久久99久久久久| 麻豆成人久久精品二区三区小说| 丝瓜av网站精品一区二区|