Выходные данные Solaris pstack: что означает «SYS # 0»? - PullRequest
2 голосов
/ 25 февраля 2009

Я столкнулся с "SYS # 0" на вершине стека и не могу найти никакой документации относительно того, что это значит.

  • Компилятор: g ++
  • ОС: Solaris 9
  • Арка: SPARC
  • Диспетчер памяти libhoard_32.so из Запас 3.5.1

Мы использовали «gcore» для генерации файла ядра. Если посмотреть на результат выполнения команды "pstack" для основного файла, единственный поток, который делал что-нибудь интересное, имел следующее в самом верху своего стека вызовов:

ff309858 SYS#0    ()
ff309848 void MyHashMap<const void*,unsigned,AlignedMmapInstance<65536U>::SourceHeap>::set(const void*,unsigned) (ff31eed4, 9bf20000, 10000, 40, 9bf1fff0, ff31e738) + 134
...

pflags для этого LWP показывает:

/8:   flags = PR_STOPPED|PR_ISTOP|PR_ASLEEP
why = PR_REQUESTED
sigmask = 0xfffffeff,0x00003fff

Я не смог найти упоминаний об этом синтаксисе в документации Sun.

Редактировать: Кажется, что процесс завис перед тем, как выполнить gcore. "SYS # 0" как-то взаимосвязано с зависаниями процесса?

Редактировать: Добавлен следующий кадр стека и ссылка на запас, вывод pflags

Редактировать: Принятый ответ правильный. Кроме того, по крайней мере в SPARC регистр g1 должен содержать номер системного вызова, но в нашем основном файле этого не произошло.

Тема "что такое косвенный системный вызов?" вероятно, хороший материал для другого вопроса.

1 Ответ

2 голосов
/ 28 февраля 2009

Попробуйте это:

$ cat foo.c
#include <stdio.h>

int main(int argc, char *argv[]) {

    char buf[1024];
    proc_sysname(0, buf, 1024);
    printf("%s\n", buf);

}
$ gcc -ofoo -lproc foo.c
$ ./foo
SYS#0
$

SYS#0, следовательно, строка, представляющая нулевой системный вызов. Если вы посмотрите в <sys/syscall.h> (таблица системных вызовов), вы найдете следующее:

/* syscall enumeration MUST begin with 1 */

/*
 * SunOS/SPARC uses 0 for the indirect system call SYS_syscall
 * but this doesn't count because it is just another way
 * to specify the real system call number.
 */

#define SYS_syscall 0

Косвенный системный вызов syscall(SYS_syscall, foo, bar, ...) эквивалентен прямому вызову syscall(foo, bar, ...).

...