3

Solaris 10 でプログラムを開発しています。クラッシュ時にスタック トレースを出力したいと考えています。私はこの例を見つけました:

static void pstack()
{
  char buf[256];

  sprintf(buf, "/usr/proc/bin/pstack %d |/bin/tee traceback.txt\n", (int)getpid());
  /* undefine LD_PRELOAD to avoid 64-bit problems */
  (void)putenv("LD_PRELOAD=");
  system(buf);
}
void sighanterm(int signo, siginfo_t *info, void *context) {
    ...
    pstack();
}

興味深いことに、/usr/proc/bin/pstack実行中、他のスレッドも出力を出力し続けます。が呼び出されたときにスレッドは再開しsystem()ますか、それともまったく停止しませんか? ハンドラーで明示的に停止できますか?

4

1 に答える 1

2

いいえ、ハンドルSIGSEGVが他のスレッドに影響を与えることはありません (ただし、メモリの破損や他の UB が原因である場合、その UB はもちろん他のスレッドに影響を与える可能性があります)。SIGSEGV一方、未処理はプロセス全体を終了します。

于 2012-05-24T16:39:01.257 に答える