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

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

?? linux-low.c

?? 這個是LINUX下的GDB調度工具的源碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
	      remove_inferior (&all_processes, &event_child->head);	      free (event_child);	      remove_thread (current_inferior);	      current_inferior = (struct thread_info *) all_threads.head;	      /* If we were waiting for this particular child to do something...		 well, it did something.  */	      if (child != NULL)		return wstat;	      /* Wait for a more interesting event.  */	      continue;	    }	  if (WIFSTOPPED (wstat)	      && WSTOPSIG (wstat) == SIGSTOP	      && event_child->stop_expected)	    {	      if (debug_threads)		fprintf (stderr, "Expected stop.\n");	      event_child->stop_expected = 0;	      linux_resume_one_process (&event_child->head,					event_child->stepping, 0);	      continue;	    }	  /* FIXME drow/2002-06-09: Get signal numbers from the inferior's	     thread library?  */	  if (WIFSTOPPED (wstat)	      && (WSTOPSIG (wstat) == __SIGRTMIN		  || WSTOPSIG (wstat) == __SIGRTMIN + 1))	    {	      if (debug_threads)		fprintf (stderr, "Ignored signal %d for %d (LWP %d).\n",			 WSTOPSIG (wstat), event_child->tid,			 event_child->head.id);	      linux_resume_one_process (&event_child->head,					event_child->stepping,					WSTOPSIG (wstat));	      continue;	    }	}      /* If this event was not handled above, and is not a SIGTRAP, report	 it.  */      if (!WIFSTOPPED (wstat) || WSTOPSIG (wstat) != SIGTRAP)	return wstat;      /* If this target does not support breakpoints, we simply report the	 SIGTRAP; it's of no concern to us.  */      if (the_low_target.get_pc == NULL)	return wstat;      stop_pc = get_stop_pc ();      /* bp_reinsert will only be set if we were single-stepping.	 Notice that we will resume the process after hitting	 a gdbserver breakpoint; single-stepping to/over one	 is not supported (yet).  */      if (event_child->bp_reinsert != 0)	{	  if (debug_threads)	    fprintf (stderr, "Reinserted breakpoint.\n");	  reinsert_breakpoint (event_child->bp_reinsert);	  event_child->bp_reinsert = 0;	  /* Clear the single-stepping flag and SIGTRAP as we resume.  */	  linux_resume_one_process (&event_child->head, 0, 0);	  continue;	}      if (debug_threads)	fprintf (stderr, "Hit a (non-reinsert) breakpoint.\n");      if (check_breakpoints (stop_pc) != 0)	{	  /* We hit one of our own breakpoints.  We mark it as a pending	     breakpoint, so that check_removed_breakpoint () will do the PC	     adjustment for us at the appropriate time.  */	  event_child->pending_is_breakpoint = 1;	  event_child->pending_stop_pc = stop_pc;	  /* Now we need to put the breakpoint back.  We continue in the event	     loop instead of simply replacing the breakpoint right away,	     in order to not lose signals sent to the thread that hit the	     breakpoint.  Unfortunately this increases the window where another	     thread could sneak past the removed breakpoint.  For the current	     use of server-side breakpoints (thread creation) this is	     acceptable; but it needs to be considered before this breakpoint	     mechanism can be used in more general ways.  For some breakpoints	     it may be necessary to stop all other threads, but that should	     be avoided where possible.	     If breakpoint_reinsert_addr is NULL, that means that we can	     use PTRACE_SINGLESTEP on this platform.  Uninsert the breakpoint,	     mark it for reinsertion, and single-step.	     Otherwise, call the target function to figure out where we need	     our temporary breakpoint, create it, and continue executing this	     process.  */	  if (the_low_target.breakpoint_reinsert_addr == NULL)	    {	      event_child->bp_reinsert = stop_pc;	      uninsert_breakpoint (stop_pc);	      linux_resume_one_process (&event_child->head, 1, 0);	    }	  else	    {	      reinsert_breakpoint_by_bp		(stop_pc, (*the_low_target.breakpoint_reinsert_addr) ());	      linux_resume_one_process (&event_child->head, 0, 0);	    }	  continue;	}      /* If we were single-stepping, we definitely want to report the	 SIGTRAP.  The single-step operation has completed, so also         clear the stepping flag; in general this does not matter,	 because the SIGTRAP will be reported to the client, which	 will give us a new action for this thread, but clear it for	 consistency anyway.  It's safe to clear the stepping flag         because the only consumer of get_stop_pc () after this point	 is check_removed_breakpoint, and pending_is_breakpoint is not	 set.  It might be wiser to use a step_completed flag instead.  */      if (event_child->stepping)	{	  event_child->stepping = 0;	  return wstat;	}      /* A SIGTRAP that we can't explain.  It may have been a breakpoint.	 Check if it is a breakpoint, and if so mark the process information	 accordingly.  This will handle both the necessary fiddling with the	 PC on decr_pc_after_break targets and suppressing extra threads	 hitting a breakpoint if two hit it at once and then GDB removes it	 after the first is reported.  Arguably it would be better to report	 multiple threads hitting breakpoints simultaneously, but the current	 remote protocol does not allow this.  */      if ((*the_low_target.breakpoint_at) (stop_pc))	{	  event_child->pending_is_breakpoint = 1;	  event_child->pending_stop_pc = stop_pc;	}      return wstat;    }  /* NOTREACHED */  return 0;}/* Wait for process, returns status.  */static unsigned charlinux_wait (char *status){  int w;  struct thread_info *child = NULL;retry:  /* If we were only supposed to resume one thread, only wait for     that thread - if it's still alive.  If it died, however - which     can happen if we're coming from the thread death case below -     then we need to make sure we restart the other threads.  We could     pick a thread at random or restart all; restarting all is less     arbitrary.  */  if (cont_thread > 0)    {      child = (struct thread_info *) find_inferior_id (&all_threads,						       cont_thread);      /* No stepping, no signal - unless one is pending already, of course.  */      if (child == NULL)	{	  struct thread_resume resume_info;	  resume_info.thread = -1;	  resume_info.step = resume_info.sig = resume_info.leave_stopped = 0;	  linux_resume (&resume_info);	}    }  enable_async_io ();  unblock_async_io ();  w = linux_wait_for_event (child);  stop_all_processes ();  disable_async_io ();  /* If we are waiting for a particular child, and it exited,     linux_wait_for_event will return its exit status.  Similarly if     the last child exited.  If this is not the last child, however,     do not report it as exited until there is a 'thread exited' response     available in the remote protocol.  Instead, just wait for another event.     This should be safe, because if the thread crashed we will already     have reported the termination signal to GDB; that should stop any     in-progress stepping operations, etc.     Report the exit status of the last thread to exit.  This matches     LinuxThreads' behavior.  */  if (all_threads.head == all_threads.tail)    {      if (WIFEXITED (w))	{	  fprintf (stderr, "\nChild exited with retcode = %x \n", WEXITSTATUS (w));	  *status = 'W';	  clear_inferiors ();	  free (all_processes.head);	  all_processes.head = all_processes.tail = NULL;	  return ((unsigned char) WEXITSTATUS (w));	}      else if (!WIFSTOPPED (w))	{	  fprintf (stderr, "\nChild terminated with signal = %x \n", WTERMSIG (w));	  *status = 'X';	  clear_inferiors ();	  free (all_processes.head);	  all_processes.head = all_processes.tail = NULL;	  return ((unsigned char) WTERMSIG (w));	}    }  else    {      if (!WIFSTOPPED (w))	goto retry;    }  *status = 'T';  return ((unsigned char) WSTOPSIG (w));}/* Send a signal to an LWP.  For LinuxThreads, kill is enough; however, if   thread groups are in use, we need to use tkill.  */static intkill_lwp (int lwpid, int signo){  static int tkill_failed;  errno = 0;#ifdef SYS_tkill  if (!tkill_failed)    {      int ret = syscall (SYS_tkill, lwpid, signo);      if (errno != ENOSYS)        return ret;      errno = 0;      tkill_failed = 1;    }#endif  return kill (lwpid, signo);}static voidsend_sigstop (struct inferior_list_entry *entry){  struct process_info *process = (struct process_info *) entry;  if (process->stopped)    return;  /* If we already have a pending stop signal for this process, don't     send another.  */  if (process->stop_expected)    {      process->stop_expected = 0;      return;    }  if (debug_threads)    fprintf (stderr, "Sending sigstop to process %d\n", process->head.id);  kill_lwp (process->head.id, SIGSTOP);  process->sigstop_sent = 1;}static voidwait_for_sigstop (struct inferior_list_entry *entry){  struct process_info *process = (struct process_info *) entry;  struct thread_info *saved_inferior, *thread;  int wstat, saved_tid;  if (process->stopped)    return;  saved_inferior = current_inferior;  saved_tid = ((struct inferior_list_entry *) saved_inferior)->id;  thread = (struct thread_info *) find_inferior_id (&all_threads,						    process->tid);  wstat = linux_wait_for_event (thread);  /* If we stopped with a non-SIGSTOP signal, save it for later     and record the pending SIGSTOP.  If the process exited, just     return.  */  if (WIFSTOPPED (wstat)      && WSTOPSIG (wstat) != SIGSTOP)    {      if (debug_threads)	fprintf (stderr, "Stopped with non-sigstop signal\n");      process->status_pending_p = 1;      process->status_pending = wstat;      process->stop_expected = 1;    }  if (linux_thread_alive (saved_tid))    current_inferior = saved_inferior;  else    {      if (debug_threads)	fprintf (stderr, "Previously current thread died.\n");      /* Set a valid thread as current.  */      set_desired_inferior (0);    }}static voidstop_all_processes (void){  stopping_threads = 1;  for_each_inferior (&all_processes, send_sigstop);  for_each_inferior (&all_processes, wait_for_sigstop);  stopping_threads = 0;}/* Resume execution of the inferior process.   If STEP is nonzero, single-step it.   If SIGNAL is nonzero, give it that signal.  */static voidlinux_resume_one_process (struct inferior_list_entry *entry,			  int step, int signal){  struct process_info *process = (struct process_info *) entry;  struct thread_info *saved_inferior;  if (process->stopped == 0)    return;  /* If we have pending signals or status, and a new signal, enqueue the     signal.  Also enqueue the signal if we are waiting to reinsert a     breakpoint; it will be picked up again below.  */  if (signal != 0      && (process->status_pending_p || process->pending_signals != NULL	  || process->bp_reinsert != 0))    {      struct pending_signals *p_sig;      p_sig = malloc (sizeof (*p_sig));      p_sig->prev = process->pending_signals;      p_sig->signal = signal;      process->pending_signals = p_sig;    }  if (process->status_pending_p && !check_removed_breakpoint (process))    return;  saved_inferior = current_inferior;  current_inferior = get_process_thread (process);  if (debug_threads)    fprintf (stderr, "Resuming process %d (%s, signal %d, stop %s)\n", inferior_pid,	     step ? "step" : "continue", signal,	     process->stop_expected ? "expected" : "not expected");  /* This bit needs some thinking about.  If we get a signal that     we must report while a single-step reinsert is still pending,     we often end up resuming the thread.  It might be better to     (ew) allow a stack of pending events; then we could be sure that     the reinsert happened right away and not lose any signals.     Making this stack would also shrink the window in which breakpoints are     uninserted (see comment in linux_wait_for_process) but not enough for     complete correctness, so it won't solve that problem.  It may be     worthwhile just to solve this one, however.  */  if (process->bp_reinsert != 0)    {      if (debug_threads)	fprintf (stderr, "  pending reinsert at %08lx", (long)process->bp_reinsert);      if (step == 0)	fprintf (stderr, "BAD - reinserting but not stepping.\n");      step = 1;      /* Postpone any pending signal.  It was enqueued above.  */      signal = 0;    }  check_removed_breakpoint (process);  if (debug_threads && the_low_target.get_pc != NULL)    {      fprintf (stderr, "  ");      (long) (*the_low_target.get_pc) ();    }  /* If we have pending signals, consume one unless we are trying to reinsert     a breakpoint.  */  if (process->pending_signals != NULL && process->bp_reinsert == 0)    {      struct pending_signals **p_sig;      p_sig = &process->pending_signals;      while ((*p_sig)->prev != NULL)	p_sig = &(*p_sig)->prev;      signal = (*p_sig)->signal;      free (*p_sig);      *p_sig = NULL;    }  regcache_invalidate_one ((struct inferior_list_entry *)			   get_process_thread (process));  errno = 0;  process->stopped = 0;  process->stepping = step;  ptrace (step ? PTRACE_SINGLESTEP : PTRACE_CONT, process->lwpid, 0, signal);  current_inferior = saved_inferior;  if (errno)    perror_with_name ("ptrace");}static struct thread_resume *resume_ptr;/* This function is called once per thread.  We look up the thread   in RESUME_PTR, and mark the thread with a pointer to the appropriate   resume request.   This algorithm is O(threads * resume elements), but resume elements   is small (and will remain small at least until GDB supports thread   suspension).  */static voidlinux_set_resume_request (struct inferior_list_entry *entry){  struct process_info *process;  struct thread_info *thread;  int ndx;  thread = (struct thread_info *) entry;  process = get_thread_process (thread);  ndx = 0;  while (resume_ptr[ndx].thread != -1 && resume_ptr[ndx].thread != entry->id)    ndx++;  process->resume = &resume_ptr[ndx];}/* This function is called once per thread.  We check the thread's resume   request, which will tell us whether to resume, step, or leave the thread   stopped; and what signal, if any, it should be sent.  For threads which   we aren't explicitly told otherwise, we preserve the stepping flag; this   is used for stepping over gdbserver-placed breakpoints.  */static voidlinux_continue_one_thread (struct inferior_list_entry *entry){  struct process_info *process;  struct thread_info *thread;  int step;  thread = (struct thread_info *) entry;  process = get_thread_process (thread);  if (process->resume->leave_stopped)    return;  if (process->resume->thread == -1)    step = process->stepping || process->resume->step;  else    step = process->resume->step;  linux_resume_one_process (&process->head, step, process->resume->sig);  process->resume = NULL;}/* This function is called once per thread.  We check the thread's resume   request, which will tell us whether to resume, step, or leave the thread   stopped; and what signal, if any, it should be sent.  We queue any needed   signals, since we won't actually resume.  We already have a pending event   to report, so we don't need to preserve any step requests; they should   be re-issued if necessary.  */static voidlinux_queue_one_thread (struct inferior_list_entry *entry){  struct process_info *process;  struct thread_info *thread;  thread = (struct thread_info *) entry;  process = get_thread_process (thread);  if (process->resume->leave_stopped)    return;  /* If we have a new signal, enqueue the signal.  */  if (process->resume->sig != 0)    {      struct pending_signals *p_sig;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 国产精品白丝jk黑袜喷水| 色综合色综合色综合色综合色综合| 精品美女一区二区| 国产一区二区日韩精品| 欧美变态口味重另类| 国产精品一级在线| 亚洲手机成人高清视频| 欧美性色综合网| 天堂久久一区二区三区| 欧美日韩久久久久久| 欧美96一区二区免费视频| 日韩精品一区二区三区视频| 久久精品国产**网站演员| 欧美精品一区二区不卡| 色系网站成人免费| 久久精品国产99| 亚洲黄色免费电影| 久久五月婷婷丁香社区| 欧美丝袜丝交足nylons| 日韩高清一区二区| 日韩高清一区在线| 亚洲成人动漫在线免费观看| 国产精品看片你懂得| 久久久亚洲高清| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 国产精品美女久久久久久久久| 日韩一级欧美一级| 这里只有精品免费| 日韩欧美亚洲国产精品字幕久久久| 欧美日本一道本| 欧美一级日韩免费不卡| 欧美精品乱码久久久久久按摩| 欧美日韩一级视频| 在线播放91灌醉迷j高跟美女 | 日本一区二区三区在线不卡| 日韩免费观看高清完整版在线观看| 欧美一区日韩一区| 精品免费一区二区三区| 久久久国产精品午夜一区ai换脸| 久久一日本道色综合| 中文字幕一区三区| 亚洲va在线va天堂| 国产一区二区三区国产| 91国内精品野花午夜精品| 91精品国产91久久久久久一区二区| 久久伊99综合婷婷久久伊| 中文字幕在线一区二区三区| 午夜视频一区二区| 成人免费高清在线| 日韩一二三四区| 国产精品久久久久影院色老大| 欧美成人女星排名| 一区二区三区四区在线| 国产一区二区调教| 欧美日韩中文字幕精品| 国产精品视频在线看| 蜜臀av一区二区三区| 一本大道久久a久久精二百| 久久综合狠狠综合久久综合88 | 国内不卡的二区三区中文字幕| 高清在线观看日韩| 日韩欧美一区电影| 国产欧美日本一区二区三区| 亚洲国产成人av| 国产a精品视频| 日韩欧美一级在线播放| 视频一区视频二区在线观看| 成人h动漫精品一区二区| 精品国产一区二区三区忘忧草| 日韩av中文字幕一区二区| 欧美人妇做爰xxxⅹ性高电影| 亚洲国产精品一区二区久久恐怖片 | 亚洲综合精品久久| 日本乱人伦aⅴ精品| 亚洲一区二区在线视频| 欧美体内she精高潮| 五月婷婷色综合| 欧美va亚洲va香蕉在线| 精品一区二区三区不卡| 欧美激情一区二区三区全黄| 懂色av一区二区三区免费观看 | 欧美zozozo| 风流少妇一区二区| 亚洲一区免费视频| 精品久久久影院| 99在线精品观看| 亚洲高清在线精品| 久久久影视传媒| 在线观看www91| 国产在线视频不卡二| 一区二区三区四区激情| 精品精品国产高清一毛片一天堂| 国产麻豆视频一区二区| 夜夜嗨av一区二区三区网页| 欧美大片一区二区三区| k8久久久一区二区三区 | 久久久精品中文字幕麻豆发布| 91偷拍与自偷拍精品| 美女视频黄久久| 一区二区国产视频| 综合欧美一区二区三区| 日韩美女视频在线| 欧美日韩精品一区二区天天拍小说| 国产成人av一区| 美女被吸乳得到大胸91| 亚欧色一区w666天堂| 亚洲乱码中文字幕综合| 国产目拍亚洲精品99久久精品| 欧美一区二区在线免费观看| 91福利国产成人精品照片| 91在线精品秘密一区二区| www.成人网.com| 成人午夜又粗又硬又大| 国产一区二区伦理| 高清国产一区二区| 成人久久视频在线观看| 粉嫩欧美一区二区三区高清影视| 国产美女一区二区三区| 国产成人在线色| 波多野结衣欧美| 99久久精品免费看| 欧美系列亚洲系列| 91精品国产欧美一区二区18| 91精品国产欧美日韩| 久久久不卡网国产精品二区| 欧美国产精品专区| 亚洲乱码日产精品bd| 久久精品99久久久| 91视视频在线观看入口直接观看www| 色94色欧美sute亚洲13| 欧美刺激午夜性久久久久久久| 欧美成人一区二区| 一区二区三区久久久| 麻豆高清免费国产一区| 91视频国产资源| 精品欧美黑人一区二区三区| 一区二区在线电影| 国产一区二区在线看| 欧美日韩在线播放| 欧美国产精品一区二区| 亚洲高清中文字幕| 91网上在线视频| 亚洲日本在线a| 国产成人av在线影院| 欧美一区二区国产| 婷婷久久综合九色综合绿巨人| www.日本不卡| 国产亚洲欧美日韩在线一区| 日韩制服丝袜先锋影音| 欧美主播一区二区三区| 国产精品欧美一区二区三区| 日韩高清一区在线| 国产精品视频在线看| 亚洲gay无套男同| 91亚洲精品久久久蜜桃网站| 欧美韩国日本一区| 国产一区 二区| 国产视频一区二区在线观看| 成人精品小蝌蚪| 国产一区二区三区久久久 | 大陆成人av片| 天天影视涩香欲综合网| 中文字幕乱码日本亚洲一区二区 | 一区二区三区在线影院| 久久久国产综合精品女国产盗摄| 欧美日韩免费观看一区二区三区 | 国产精品高潮久久久久无| 精品国产免费视频| 欧美不卡激情三级在线观看| 欧美日韩国产在线播放网站| 欧美影院精品一区| 欧美日韩一区二区三区不卡| 在线免费亚洲电影| 欧美性生交片4| 日韩精品一区二区三区三区免费| 欧美专区日韩专区| 日韩欧美在线网站| 欧美精品一区二区三区很污很色的| 日韩美女在线视频| 久久久精品tv| 亚洲自拍都市欧美小说| 日韩精品亚洲专区| 激情久久五月天| 丁香桃色午夜亚洲一区二区三区| 风间由美一区二区三区在线观看| www.av精品| 67194成人在线观看| 久久精品一区蜜桃臀影院| 一区二区中文视频| 日本欧美加勒比视频| 成人一区二区三区视频| 欧美日韩久久久一区| 欧美—级在线免费片| 亚洲午夜久久久| 成人亚洲一区二区一| 欧美一区国产二区| 一区二区不卡在线播放 | 国产日韩视频一区二区三区| 一区二区三区日韩精品|