Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 13 Jun 1997 13:56:40 -0700
From:      "Jin Guojun[ITG]" <jin@george.lbl.gov>
To:        smp@csn.net
Cc:        bugs@FreeBSD.ORG, smp@FreeBSD.ORG
Subject:   Re: (kern/3827) : was ASUS P/I-P65UP5 with C-P55T2D
Message-ID:  <199706132056.NAA22863@george.lbl.gov>

next in thread | raw e-mail | index | archive | help
The problem has been narrowed to a very small program at below.
It appears to happen at subroutine level. That is, the open/freopn works
in main() program, but fails in subroutine. To replace the subroutine call
at line 7 in main(), marked /* replace HERE */, with the body of openread() ,
then, program works. So, what can cause this problem?

----------------------------------------------
/* openread.c   */

#include <stdio.h>

main(int argc, char **argv)
{
	openread(argc > 1 ? argv[1] : "openread.c");	/* replace HERE */
}

openread(char *fn)	/* if put body below into main, then it works */
{
FILE *  fp = stdin;
int     c;

if (!(fp=fopen(fn, "rb")))
        exit(1);
while( (c = fgetc(fp)) != EOF)
        fputc(c, stdout);
if (!(fp=freopen(fn, "rb", stdin)))
        exit(2);
while (fread(&c, sizeof(c), 1, fp) == 1)
        fwrite(&c, sizeof(c), 1, stdout);
fclose(fp);
}

------------------------------------------------

to load:
	cc -g openread.c -lc_r

------------------------------------------------

xxgdb can't trace this program, but gdb can.
It hangs at _thread_sys_sigprocmask() call.
Because I am not fimilar with thread_sys_calls(),
would some one help me on solving it?
Any information, hints, and comments are appreciated.

thanks,

-Jin

=======================================
Below is the gdb tracing:

gdb a.out
GDB is free software and you are welcome to 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.
GDB 4.16 (i386-unknown-freebsd), 
Copyright 1996 Free Software Foundation, Inc...
(gdb) l
1       /* openread.c   */
2
3       #include <stdio.h>
4
5       main(int argc, char **argv)
6       {
7       openread(argc > 1 ? argv[1] : "openread.c");
8       }
9
10      openread(char *fn)
(gdb) b 7
Breakpoint 1 at 0x1594: file openread.c, line 7.
(gdb) run
Starting program: /export/src/ccs-lib/tools/x11/tuner/FreeBSD/a.out 

Breakpoint 1, main (argc=1, argv=0xefbfda5c) at openread.c:7
7       openread(argc > 1 ? argv[1] : "openread.c");
(gdb) s
openread (fn=0x1580 "openread.c") at openread.c:12
12      FILE *  fp = stdin;
(gdb) s
15      if (!(fp=fopen(fn, "rb")))
(gdb) s
fopen (file=0x1580 "openread.c", mode=0x15b4 "rb")
    at /usr/src/lib/libc_r/../libc/stdio/fopen.c:57
57              if ((flags = __sflags(mode, &oflags)) == 0)
(gdb) s
__sflags (mode=0x15b4 "rb", optr=0xefbfda0c)
    at /usr/src/lib/libc_r/../libc/stdio/flags.c:63
63              switch (*mode++) {
(gdb) s
66                      ret = __SRD;
(gdb) s
67                      m = O_RDONLY;
(gdb) s
68                      o = 0;
(gdb) s
69                      break;
(gdb) s
89              if (*mode == '+' || (*mode == 'b' && mode[1] == '+')) {
(gdb) s
93              *optr = m | o;
(gdb) s
95      }
(gdb) s
fopen (file=0x1580 "openread.c", mode=0x15b4 "rb")
    at /usr/src/lib/libc_r/../libc/stdio/fopen.c:59
59              if ((fp = __sfp()) == NULL)
(gdb) s
__sfp () at /usr/src/lib/libc_r/../libc/stdio/findfp.c:105
105             if (!__sdidinit)
(gdb) s
106                     __sinit();
(gdb) s
__sinit () at /usr/src/lib/libc_r/../libc/stdio/findfp.c:173
173             __cleanup = _cleanup;           /* conservative */
(gdb) s
174             __sdidinit = 1;
(gdb) s
175     }
(gdb) s
__sfp () at /usr/src/lib/libc_r/../libc/stdio/findfp.c:107
107             for (g = &__sglue;; g = g->next) {
(gdb) s
108                     for (fp = g->iobs, n = g->niobs; --n >= 0; fp++)
(gdb) s
109                             if (fp->_flags == 0)
(gdb) s
108                     for (fp = g->iobs, n = g->niobs; --n >= 0; fp++)
(gdb) s
109                             if (fp->_flags == 0)
(gdb) s
108                     for (fp = g->iobs, n = g->niobs; --n >= 0; fp++)
(gdb) s
109                             if (fp->_flags == 0)
(gdb) s
108                     for (fp = g->iobs, n = g->niobs; --n >= 0; fp++)
(gdb) s
111                     if (g->next == NULL && (g->next = moreglue(NDYNAMIC)) == NULL)
(gdb) s
107             for (g = &__sglue;; g = g->next) {
(gdb) s
108                     for (fp = g->iobs, n = g->niobs; --n >= 0; fp++)
(gdb) s
109                             if (fp->_flags == 0)
(gdb) s
116             fp->_flags = 1;         /* reserve this slot; caller sets real flags */
(gdb) s
117             fp->_p = NULL;          /* no current pointer */
(gdb) s
118             fp->_w = 0;             /* nothing to read or write */
(gdb) s
119             fp->_r = 0;
(gdb) s
120             fp->_bf._base = NULL;   /* no buffer */
(gdb) s
121             fp->_bf._size = 0;
(gdb) s
122             fp->_lbfsize = 0;       /* not line buffered */
(gdb) s
123             fp->_file = -1;         /* no file */
(gdb) s
125             fp->_ub._base = NULL;   /* no ungetc buffer */
(gdb) s
126             fp->_ub._size = 0;
(gdb) s
127             fp->_lb._base = NULL;   /* no line buffer */
(gdb) s
128             fp->_lb._size = 0;
(gdb) s
130     }
(gdb) s
fopen (file=0x1580 "openread.c", mode=0x15b4 "rb")
    at /usr/src/lib/libc_r/../libc/stdio/fopen.c:61
61              if ((f = open(file, oflags, DEFFILEMODE)) < 0) {
(gdb) s
open (path=0x1580 "openread.c", flags=0)
    at /usr/src/lib/libc_r/uthread/uthread_open.c:45
45              int             mode = 0;
(gdb) s
50              _thread_kern_sig_block(&status);
(gdb) s
_thread_kern_sig_block (status=0xefbfd9ec)
    at /usr/src/lib/libc_r/uthread/uthread_kern.c:952
952             _thread_sys_sigprocmask(SIG_SETMASK, &sig_to_block, &oset);
(gdb) s

Hanging HERE !!!



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199706132056.NAA22863>