0

何年も前に、バックグラウンドで動作する UNIX デーモン ( wsqueryd) を作成しました。

pid_t pid;

pid = fork();
if (pid < 0)
  misc_log_error_and_exit("Could not fork parent process");

if (pid > 0) // => this is the parent process
  exit(EXIT_SUCCESS); // terminates it

// Creates an new session for the process.
if (setsid() < 0)
  misc_log_error_and_exit("Cannot create new session");

ここで、デーモンがスタックすることがあることに気付きました。添付しましたgdb

$ cd $DAEMON_SRC_PATH
$ ps aux | grep wsqueryd
apache   20735  [...]
$ sudo gdb wsqueryd # daemon runs as different user
[...]
(gdb) attach 20735
Attaching to program: [...]/wsqueryd, process 20735
warning: .dynamic section for "/lib/libk5crypto.so.3" is not at the expected address (wrong library or version mismatch?)
warning: .dynamic section for "/lib/libkrb5support.so.0" is not at the expected address (wrong library or version mismatch?)
Reading symbols from /usr/lib/libcurl.so.4...Reading symbols from /usr/lib/debug/usr/lib/libcurl.so.4.2.0.debug...done.
done.
Loaded symbols for /usr/lib/libcurl.so.4
Reading symbols from /usr/lib/libev.so.4...Reading symbols from /usr/lib/debug/usr/lib/libev.so.4.0.0.debug...done.
done.
Loaded symbols for /usr/lib/libev.so.4
Reading symbols from /lib/libz.so.1...Reading symbols from /usr/lib/debug/lib/libz.so.1.2.5.debug...done.
done.
[...]
(gdb) list
1       // (C) [...]
2
3       #include <stdlib.h>
4       #include <stdio.h>
5       #include "daemon.h"
6       #include "misc.h"
7       #include "retrieval.h"
8
9       int main(int argc, char *argv[]) {
10        misc_init(argv[0]); // to be called at the very beginning

デーモンが動かなくなった場所を見つけるにはどうすればよいですか? (周囲のコードを使用し、それをステップ実行する機能を使用)

4

0 に答える 0