[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: