Пример #1
0
void
glibtop_get_proc_kernel_s (glibtop *server, glibtop_proc_kernel *buf, pid_t pid)
{
	char buffer [BUFSIZ], *p;

	memset (buf, 0, sizeof (glibtop_proc_kernel));

	if (proc_stat_to_buffer(buffer, sizeof buffer, pid))
		return;

	p = proc_stat_after_cmd (buffer);
	if (!p) return;

	p = skip_multiple_token (p, 6);

	buf->k_flags   = strtoull (p, &p, 0);
	buf->min_flt   = strtoull (p, &p, 0);
	buf->cmin_flt  = strtoull (p, &p, 0);
	buf->maj_flt   = strtoull (p, &p, 0);
	buf->cmaj_flt  = strtoull (p, &p, 0);

	p = skip_multiple_token (p, 15);

	buf->kstk_esp = strtoull (p, &p, 0);
	buf->kstk_eip = strtoull (p, &p, 0);

	p = skip_multiple_token (p, 4);

	buf->nwchan = strtoull (p, &p, 0);

	proc_file_to_buffer(buf->wchan, sizeof buf->wchan, "/proc/%d/wchan", pid),

	buf->flags = _glibtop_sysdeps_proc_kernel;
}
Пример #2
0
gboolean
mono_debugger_libgtop_glue_get_memory (int pid, LibGTopGlueMemoryInfo *info)
{
	char buffer [BUFSIZ], *p;

	if (proc_stat_to_buffer (buffer, sizeof buffer, pid))
		return FALSE;

	p = proc_stat_after_cmd (buffer);
	if (!p) return FALSE;

	p = skip_multiple_token (p, 20);

	info->vsize    = strtoull (p, &p, 0);
	info->rss      = strtoull (p, &p, 0);
	info->rss_rlim = strtoull (p, &p, 0);

	if (proc_statm_to_buffer (buffer, sizeof buffer, pid))
		return FALSE;

	info->size     = strtoull (buffer, &p, 0);
	info->resident = strtoull (p, &p, 0);
	info->share    = strtoull (p, &p, 0);

	return TRUE;
}
Пример #3
0
void get_proc_mem (dbgov_proc_mem * buf, pid_t pid, pid_t tid)
{
  char buffer[BUFSIZ], *p;
  const size_t pagesize = get_page_size ();
  memset (buf, 0, sizeof (dbgov_proc_mem));

  int res = try_file_to_buffer (buffer, "/proc/%d/task/%d/stat", pid, tid);
  if (res == TRY_FILE_TO_BUFFER_OK_IOSTAT)
    {
      p = proc_stat_after_cmd (buffer);
      if (!p)
	return;

      p = skip_multiple_token (p, 20);

      buf->vsize = strtoull (p, &p, 0);
      buf->rss = strtoull (p, &p, 0);
      buf->rss_rlim = strtoull (p, &p, 0);

      int res = try_file_to_buffer(buffer, "/proc/%d/task/%d/statm", pid, tid);
      if (res == TRY_FILE_TO_BUFFER_OK_IOSTAT)
	{
	  buf->size = strtoull (buffer, &p, 0);
	  buf->resident = strtoull (p, &p, 0);
	  buf->share = strtoull (p, &p, 0);
	}
      buf->size *= pagesize;
      buf->resident *= pagesize;
      buf->share *= pagesize;
      buf->rss *= pagesize;
    }
}
Пример #4
0
int get_proc_time (dbgov_proc_time * buf, pid_t pid, pid_t tid)
{
  char buffer[BUFSIZ], *p;
  memset (buf, 0, sizeof (dbgov_proc_time));

  int res = try_file_to_buffer (buffer, "/proc/%d/task/%d/stat", pid, tid);
  if (res == TRY_FILE_TO_BUFFER_OK_IOSTAT)
    {
      p = proc_stat_after_cmd (buffer);
      if (!p)
	return -1;

      p = skip_multiple_token (p, 11);

      buf->utime = strtoull (p, &p, 0);
      buf->stime = strtoull (p, &p, 0);
      buf->rtime = buf->utime + buf->stime;
      buf->cutime = strtoull (p, &p, 0);
      buf->cstime = strtoull (p, &p, 0);
      p = skip_multiple_token (p, 3);
      buf->it_real_value = strtoull (p, &p, 0);
      buf->frequency = 100;

    } else {
    	return -2;
    }
  return 0;
}
Пример #5
0
void
glibtop_get_proc_segment_s (glibtop *server, glibtop_proc_segment *buf,
			    pid_t pid)
{
	char buffer [BUFSIZ], *p;
	const size_t pagesize = getpagesize();

	memset (buf, 0, sizeof (glibtop_proc_segment));

	if (proc_stat_to_buffer(buffer, sizeof buffer, pid))
		return;

	p = proc_stat_after_cmd (buffer);
	if (!p) return;

	p = skip_multiple_token (p, 23);

	buf->start_code  = strtoull (p, &p, 0);
	buf->end_code    = strtoull (p, &p, 0);
	buf->start_stack = strtoull (p, &p, 0);

	buf->flags = _glibtop_sysdeps_proc_segment;

	if (proc_statm_to_buffer(buffer, sizeof buffer, pid))
		return;

	p = skip_multiple_token (buffer, 3);

	/* This doesn't work very well due to a bug in the Linux kernel.
	 * I'll submit a patch to the kernel mailing list soon. */

	buf->text_rss   = strtoull (p, &p, 0);
	buf->shlib_rss  = strtoull (p, &p, 0);
	buf->data_rss   = strtoull (p, &p, 0);
	buf->dirty_size = strtoull (p, &p, 0);

	buf->text_rss   *= pagesize;
	buf->shlib_rss  *= pagesize;
	buf->data_rss   *= pagesize;
	buf->dirty_size *= pagesize;

	buf->flags |= _glibtop_sysdeps_proc_segment_statm;
}
Пример #6
0
void
glibtop_get_proc_uid_s (glibtop *server, glibtop_proc_uid *buf, pid_t pid)
{
	char buffer [BUFSIZ], *p;

	memset (buf, 0, sizeof (glibtop_proc_uid));

	if (proc_status_to_buffer(buffer, sizeof buffer, pid))
		return;

	/* Search substring 'Pid:' */

	p = strstr (buffer, "\nPid:");
	if (!p) return;

	p = skip_token (p); /* "Pid:" */
	buf->pid = strtol (p, &p, 0);

	p = skip_token (p); /* "PPid:" */
	buf->ppid = strtol (p, &p, 0);

	/* Maybe future Linux versions place something between
	 * "PPid" and "Uid", so we catch this here. */
	p = strstr (p, "\nUid:");
	if (!p) return;

	p = skip_token (p); /* "Uid:" */
	buf->uid  = strtol (p, &p, 0);
	buf->euid = strtol (p, &p, 0);

	/* We don't know how many entries on the "Uid:" line
	 * future Linux version will have, so we catch this here. */
	p = strstr (p, "\nGid:");
	if (!p) return;

	p = skip_token (p); /* "Gid:" */
	buf->gid  = strtol (p, &p, 0);
	buf->egid = strtol (p, &p, 0);

	buf->flags = _glibtop_sysdeps_proc_uid;

	if (proc_stat_to_buffer(buffer, sizeof buffer, pid))
		return;

	p = proc_stat_after_cmd (buffer);
	if (!p) return;

	p = skip_multiple_token (p, 2);

	buf->pgrp    = strtol (p, &p, 0);
	buf->session = strtol (p, &p, 0);
	buf->tty     = strtol (p, &p, 0);
	buf->tpgid   = strtol (p, &p, 0);

	p = skip_multiple_token (p, 9);

	buf->priority = strtol (p, &p, 0);
	buf->nice     = strtol (p, &p, 0);

	if (buf->tty == 0)
		/* the old notty val, update elsewhere bef. moving to 0 */
		buf->tty = -1;

	if (server->os_version_code < LINUX_VERSION_CODE(1,3,39)) {
		/* map old meanings to new */
		buf->priority = 2*15 - buf->priority;
		buf->nice = 15 - buf->nice;
	}
	else if (server->os_version_code < LINUX_VERSION_CODE(1,1,30) && buf->tty != -1)
		/* when tty wasn't full devno */
		buf->tty = 4*0x100 + buf->tty;

	buf->flags |= _glibtop_sysdeps_proc_uid_stat;
}