2

スタックの一番上に「SYS#0」がありましたが、それが何を意味するかについてのドキュメントが見つかりません。

  • コンパイラ: g++
  • OS: ソラリス 9
  • アーチ: SPARC
  • Hoard 3.5.1のメモリ マネージャー libhoard_32.so

「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
...

その LWP の pflags は次を示します。

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

Sun のドキュメントには、この構文についての言及は見つかりませんでした。

編集: gcore を実行する前に、プロセスがハングしたようです。「SYS#0」はプロセスのハングと何らかの関係がありますか?

編集:次のスタック フレームと Hoard へのリンク、pflags 出力を追加しました

編集:受け入れられた答えは正しいです。さらに、少なくとも SPARC では、g1レジスタにシステム コール番号が含まれている必要 がありますが、コア ファイルではそうではないようです。

トピック「間接システムコールとは?」おそらく別の質問の良い材料です。

4

1 に答える 1

2

これを試して:

$ 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, ...)です。

于 2009-02-28T12:21:20.770 に答える