ProFTPd 1.2.10 - Server hungup immediately after connect
Witajcie.
Mam problemik z ProFTPd taki, że co jakiś czas - niestety nieregularny - pada mi proces główny serwera ftp. Na Debianie 3.0r3 był zainstalowany z pakietu ProFTPd i co jakiś czas się wywalał. Był apt-get update i dalej to samo. Ściągnąłem źródła z proftpd.org i skompilowałem, znowu się wywalał. Skompilowałem z opcją "-ggdb" żeby móc (spróbować) się podpiąć jak padnie, padł znowu ale ciężko mi idzie z GDB i mam niewielki log dla chętnych do przejrzenia.
Sytuacja jest dość dziwna: mam ustawiony DebugLevel na 6, osobny plik na syslog, oczywiście proftpd i xferlog. Server na któym działa ProFTPd nie był zbytnio używany, raz dziennie kilka plików wpadło. Jak zaczął padać ftp to - żeby nie wyrzucili mnie z pracy ;-) - napisałem skrypcik który z innego peceta wrzuca i pobiera średniej wielkości plik na/z serwera i jak coś to wysyła mi mejla.
Logi są zapisywane gęsto ale kiedy serwer działa normalnie, kiedy następi "crash" to nic się nie zapisuje, pomimo że proces główny działa, skrypcik go bombarduje dalej co 10 minut (bo to z crona). Próba zalogowania kończy się _natychmiast_ z komunikatem że 300 sekund upłynęło.
"Remote host has closed the connection.
421. Login Timeout (300 seconds): closing control connection. Server hungup immediately after connect"
Napisałem na listę userów ProFTPd, i jeden gość mi odpisał że słyszał iż są takie problemy na Debianie. Odesłał mnie na http://bugs.debian.org/cgi-bin/pkgreport.cgi?pkg=proftpd
Na oko nic podobnego nie znalazłem, nie chcę więc wypisywać głupot. Być może będzie to trzeba zgłosić do opiekuna pakietu.
Jak możecie to zerknijcie do załączonego pliku albo powiedzcie jak skompilować tego ProFTPd żeby coś się więcej dowiedzieć. Te logi z Sysloga z DebugLevelem 6 są w takiej sytuacji nie przydatne. Z wyższysmi poziomami się bawiłem ale zbyt dużo logów i tam są całe
GNU gdb 2002-04-01-cvs
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-linux".
(gdb) at 16477
Attaching to process 16477
Reading symbols from /chroot/apache/usr/local/proftpd/sbin/proftpd...done.
Reading symbols from /lib/libcrypt.so.1...done.
Loaded symbols for /lib/libcrypt.so.1
Reading symbols from /lib/libc.so.6...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
Reading symbols from /lib/libnss_files.so.2...done.
Loaded symbols for /lib/libnss_files.so.2
Reading symbols from /lib/libnss_dns.so.2...done.
Loaded symbols for /lib/libnss_dns.so.2
Reading symbols from /lib/libresolv.so.2...done.
Loaded symbols for /lib/libresolv.so.2
Reading symbols from /lib/libnss_compat.so.2...done.
Loaded symbols for /lib/libnss_compat.so.2
Reading symbols from /lib/libnsl.so.1...done.
Loaded symbols for /lib/libnsl.so.1
0x299747ee in select () from /lib/libc.so.6
(gdb) se tep
Single stepping until exit from function select,
which has no line number information.
daemon_loop () at main.c:1453
1453 if (i == -1 && errno == EINTR) {
(gdb)
1458 if (have_dead_child) {
(gdb)
1474 if (i == -1) {
(gdb)
1493 if (i == 0)
(gdb)
1499 nconnects = 1UL;
(gdb)
1502 if (child_count()) {
(gdb)
(gdb)
child_count () at child.c:67
67 return child_listlen;
(gdb)
68 }
(gdb)
daemon_loop () at main.c:1521
1521 pr_signals_handle();
(gdb)
(gdb)
pr_signals_handle () at main.c:1569
1569 while (recvd_signal_flags) {
(gdb)
1632 }
(gdb)
daemon_loop () at main.c:1524
1524 listen_conn = pr_ipbind_accept_conn(&listenfds, &fd);
(gdb)
(gdb)
pr_ipbind_accept_conn (readfds=0x5ee6831c, listenfd=0x5ee68314) at bindings.c:94
94 conn_t *listener = listener_list;
(gdb)
95 int fd = -1;
(gdb)
96 register unsigned int i = 0;
(gdb)
99 if (!readfds) {
(gdb)
104 if (!listenfd) {
(gdb)
109 for (i = 0, listener = listener_list; i < listener_listlen;
(gdb)
111 pr_signals_handle();
(gdb)
(gdb)
pr_signals_handle () at main.c:1569
1569 while (recvd_signal_flags) {
(gdb)
1632 }
(gdb)
pr_ipbind_accept_conn (readfds=0x5ee6831c, listenfd=0x5ee68314) at bindings.c:113
113 if (FD_ISSET(listener->listen_fd, readfds) &&
(gdb)
116 if ((fd = pr_inet_accept_nowait(listener->pool, listener)) == -1) {
(gdb)
(gdb)
pr_inet_accept_nowait (p=0x8105504, c=0x810552c) at inet.c:882
882 if (c->mode == CM_LISTEN)
(gdb)
883 pr_inet_set_nonblock(c->pool, c);
(gdb)
(gdb)
pr_inet_set_nonblock (p=0x8105504, c=0x810552c) at inet.c:711
711 int res = -1;
(gdb)
713 errno = EBADF; /* Default */
(gdb)
(gdb)
Single stepping until exit from function __errno_location,
which has no line number information.
pr_inet_set_nonblock (p=0x8105504, c=0x810552c) at inet.c:715
715 if (c->mode == CM_LISTEN) {
(gdb)
716 flags = fcntl(c->listen_fd, F_GETFL);
(gdb)
(gdb)
Single stepping until exit from function fcntl,
which has no line number information.
pr_inet_set_nonblock (p=0x8105504, c=0x810552c) at inet.c:717
717 res = fcntl(c->listen_fd, F_SETFL, flags|O_NONBLOCK);
(gdb)
(gdb)
Single stepping until exit from function fcntl,
which has no line number information.
pr_inet_set_nonblock (p=0x8105504, c=0x810552c) at inet.c:719
719 } else {
(gdb)
731 return res;
(gdb)
732 }
(gdb)
pr_inet_accept_nowait (p=0x8105504, c=0x810552c) at inet.c:890
890 c->mode = CM_ACCEPT;
(gdb)
891 while (TRUE) {
(gdb)
892 pr_signals_handle();
(gdb)
(gdb)
pr_signals_handle () at main.c:1569
1569 while (recvd_signal_flags) {
(gdb)
1632 }
(gdb)
pr_inet_accept_nowait (p=0x8105504, c=0x810552c) at inet.c:893
893 fd = accept(c->listen_fd, NULL, NULL);
(gdb)
(gdb)
Single stepping until exit from function accept,
which has no line number information.
pr_inet_accept_nowait (p=0x8105504, c=0x810552c) at inet.c:895
895 if (fd == -1) {
(gdb)
910 break;
(gdb)
916 pr_inet_set_block(c->pool, c);
(gdb)
(gdb)
pr_inet_set_block (p=0x8105504, c=0x810552c) at inet.c:736
736 int res = -1;
(gdb)
738 errno = EBADF; /* Default */
(gdb)
(gdb)
Single stepping until exit from function __errno_location,
which has no line number information.
pr_inet_set_block (p=0x8105504, c=0x810552c) at inet.c:740
740 if (c->mode == CM_LISTEN) {
(gdb)
745 if (c->rfd != -1) {
(gdb)
750 if (c->wfd != -1) {
(gdb)
756 return res;
(gdb)
757 }
(gdb)
pr_inet_accept_nowait (p=0x8105504, c=0x810552c) at inet.c:918
918 return fd;
(gdb)
0x08060960 919 }
(gdb)
pr_ipbind_accept_conn (readfds=0x5ee6831c, listenfd=0x5ee68314) at bindings.c:131
131 *listenfd = fd;
(gdb)
132 return listener;
(gdb)
137 }
(gdb)
daemon_loop () at main.c:1531
1531 if (listen_conn) {
(gdb)
1534 if (ServerMaxInstances && (child_count() >= ServerMaxInstances)) {
(gdb)
(gdb)
child_count () at child.c:67
67 return child_listlen;
(gdb)
68 }
(gdb)
daemon_loop () at main.c:1553
1553 fork_server(fd, listen_conn, FALSE);
(gdb)
(gdb)
fork_server (fd=1, l=0x810552c, nofork=0 '\0') at main.c:1021
1021 conn_t *conn = NULL;
(gdb)
1022 unsigned char *ident_lookups = NULL;
(gdb)
1024 int semfds[2] = { -1, -1 };
(gdb)
1025 int xerrno = 0;
(gdb)
1031 if (!nofork) {
(gdb)
1040 if (pipe(semfds) == -1) {
(gdb)
(gdb)
Single stepping until exit from function pipe,
which has no line number information.
fork_server (fd=1, l=0x810552c, nofork=0 '\0') at main.c:1050
1050 if (semfds[1] < 3)
(gdb)
1058 sigemptyset(&sig_set);
(gdb)
(gdb)
Single stepping until exit from function sigemptyset,
which has no line number information.
fork_server (fd=1, l=0x810552c, nofork=0 '\0') at main.c:1059
1059 sigaddset(&sig_set, SIGTERM);
(gdb)
(gdb)
Single stepping until exit from function sigaddset,
which has no line number information.
fork_server (fd=1, l=0x810552c, nofork=0 '\0') at main.c:1060
1060 sigaddset(&sig_set, SIGCHLD);
(gdb)
(gdb)
Single stepping until exit from function sigaddset,
which has no line number information.
fork_server (fd=1, l=0x810552c, nofork=0 '\0') at main.c:1061
1061 sigaddset(&sig_set, SIGUSR1);
(gdb)
(gdb)
Single stepping until exit from function sigaddset,
which has no line number information.
fork_server (fd=1, l=0x810552c, nofork=0 '\0') at main.c:1062
1062 sigaddset(&sig_set, SIGUSR2);
(gdb)
(gdb)
Single stepping until exit from function sigaddset,
which has no line number information.
fork_server (fd=1, l=0x810552c, nofork=0 '\0') at main.c:1064
1064 sigprocmask(SIG_BLOCK, &sig_set, NULL);
(gdb)
(gdb)
Single stepping until exit from function sigprocmask,
which has no line number information.
warning: Cannot insert breakpoint -27:
warning: Temporarily disabling shared library breakpoints:
warning: breakpoint #-27
warning: breakpoint #-28
warning: Cannot insert breakpoint 0:
warning: Temporarily disabling shared library breakpoints:
warning: breakpoint #0
Reply to: