Выходные данные Solaris pstack: что означает "SYS#0"?
Я столкнулся с "SYS#0" на вершине стека и не могу найти никакой документации относительно того, что это значит.
- Компилятор: g++
- ОС: солярис 9
- Арка: SPARC
- Диспетчер памяти libhoard_32.so из Hoard 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" как-то взаимосвязано с зависаниями процесса?
Редактировать: Добавлен следующий кадр стека и ссылка на Hoard, вывод pflags
Изменить: принятый ответ правильный. Кроме того, по крайней мере на SPARC, g1
регистр должен содержать номер системного вызова, но в нашем основном файле это не так.
Тема "Что такое косвенный системный вызов?" вероятно, хороший материал для другого вопроса.
1 ответ
Попробуй это:
$ 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, ...)
,