2009-02-24 8 views
2

J'ai rencontré "SYS # 0" en haut d'une pile et je ne trouve aucune documentation sur ce que cela signifie.Sortie Solaris pstack: que signifie "SYS # 0"?

  • compilateur: g ++
  • OS: Solaris 9
  • Arch: SPARC
  • Memory Manager libhoard_32.so de Hoard 3.5.1

Nous avons utilisé "gcore" pour générer un fichier de base. En regardant la sortie de l'exécution de la commande « pstack » contre le fichier de base, le seul fil qui a fait quelque chose d'intéressant avait le suivant au sommet de sa pile d'appel:

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

pflags pour cette LWP montre:

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

Je n'ai trouvé aucune mention de cette syntaxe dans la documentation de Sun.

Editer: Le processus semble avoir été suspendu quelque temps avant d'effectuer le gcore. Est-ce que "SYS # 0" est en quelque sorte lié au processus?

Edit: ajouté de l'image suivante de la pile et un lien vers Hoard, pflags sortie

Edit: La réponse acceptée est correcte. En outre, au moins sur SPARC, le g1 registre shouldcontain le numéro d'appel système, mais cela ne semble pas être le cas dans notre fichier de base.

Le sujet "Qu'est-ce qu'un appel système indirect?" est probablement un bon matériel pour une autre question.

+0

Quel est le cadre après SYS # 0? –

+0

C'est dans la version 3.5.1 du gestionnaire de mémoire Hoard que nous utilisons. –

Répondre

2

Essayez ceci:

$ 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 est donc la chaîne qui représente appel système zéro. vous trouverez les éléments suivants Si vous regardez dans <sys/syscall.h> (la table d'appel système):

/* 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 

L'appel système indirect syscall(SYS_syscall, foo, bar, ...) est équivalent à l'appel direct syscall(foo, bar, ...).