General PTY and CONSOLE question--SOLVED
Gene Smith
gds at chartertn.net
Mon Sep 22 15:09:47 UTC 2008
Joel Sherrill wrote, On 09/22/2008 09:50 AM:
> Gene Smith wrote:
>> Gene Smith wrote, On 09/21/2008 08:23 PM:
>>
>>> failed internally with no CONSOLE driver enabled. You end up with a
>>> stack like this:
>>>
>>> Kbhit() <--- my function
>>> rtems_panic
>>> rtems_verror
>>> _exit
>>> newlibc_exit
>>> close(stdin/stdout/stderr)
>>> soisdisconnected <--sets SS_CANTRCVMORE bit that accept() fails on.
>>>
>>>
>> The stack actually looks like this (eventually you reach
>> soisdisconnected() as shown above):
>>
>> (arm-gdb) bt
>> #0 rtems_bsdnet_close (iop=0x202ca83c) at
>> ../../../../../../rtems-4.8.0/c/src/../../cpukit/libnetworking/rtems/rtems_syscall.c:672
>> #1 0x201b2f9c in close (fd=0) at
>> ../../../../../../rtems-4.8.0/c/src/../../cpukit/libcsupport/src/close.c:33
>> #2 0x201b302c in _close_r (ptr=0x2022d70c, fd=0) at
>> ../../../../../../rtems-4.8.0/c/src/../../cpukit/libcsupport/src/close.c:56
>> #3 0x2021b2cc in _fclose_r (rptr=0x2022d70c, fp=0x2022da54) at
>> ../../../../../gcc-4.2.4/newlib/libc/stdio/fclose.c:93
>> #4 0x201b6370 in libc_wrapup () at
>> ../../../../../../rtems-4.8.0/c/src/../../cpukit/libcsupport/src/newlibc_exit.c:88
>> #5 0x201b63f4 in _exit (status=0) at
>> ../../../../../../rtems-4.8.0/c/src/../../cpukit/libcsupport/src/newlibc_exit.c:131
>> #6 0x201b32e4 in rtems_verror (error_flag=536870912,
>> printf_format=0x202325d8 "bad tcgetattr", arglist=0x202523b0) at
>> ../../../../../../rtems-4.8.0/c/src/../../cpukit/libcsupport/src/error.c:162
>> #7 0x201b33d0 in rtems_panic (printf_format=0x20164304 "") at
>> ../../../../../../rtems-4.8.0/c/src/../../cpukit/libcsupport/src/error.c:210
>> #8 0x2016af00 in kbhit () at
>> /home/gene/4.8.0-rtems/tools/network-demos-4.8.0/adapter/ertek209/cep/src/linux_conio.c:102
>> #9 0x201663ac in eip_cycle () at
>> /home/gene/4.8.0-rtems/tools/network-demos-4.8.0/adapter/ertek209/cep/src/EepSample.c:515
>> #10 0x201583cc in Init (ignored=0) at
>> /home/gene/4.8.0-rtems/tools/network-demos-4.8.0/adapter/ertek209/mgt/src/init.c:99
>> #11 0x2021aeb4 in _Thread_Handler () at
>> ../../../../../../rtems-4.8.0/c/src/../../cpukit/score/src/threadhandler.c:137
>> #12 0x2021adf0 in _Thread_Is_heir (the_thread=0x202522b0) at
>> ../../cpukit/../../../csb337/lib/include/rtems/score/thread.inl:60
>>
>>
>
> I think newlib/exit is doing what we expect it to do -- close stdin, out
> and error. The system is not in an unusual state (critical section or
> shutting down).
>
> Is it possible that these sequences are not in the same thread? Or are
> we closing a socket that is not completely/correctly initialized?
>
> I can't connect the pieces in my head to see what went wrong. Is
> the socket closed twice? Not completely initialized?
>
> Can you put some traces into soclose() at uipc_socket.c:156 so
> we can tell if this is the first or second close?
>
> The malloc message is often indicative of a double free.
>
> During symbol reading, incomplete CFI data; unspecified registers (e.g.,
>> r0) at 0x201b5e7c.
>> 0x0) at
>> ../../../../../../rtems-4.8.0/c/src/../../cpukit/libcsupport/src/malloc.c:495
>> 495 printk( "Program heap: free of bad pointer %p -- range %p -
>> %p \n",
>> Current language: auto; currently c
>> (arm-gdb) bt
>> #0 free (ptr=0x2031d150) at
>> ../../../../../../rtems-4.8.0/c/src/../../cpukit/libcsupport/src/malloc.c:495
>> #1 0x201cd798 in rtems_bsdnet_free (addr=0x2031d150, type=3) at
>> ../../../../../../rtems-4.8.0/c/src/../../cpukit/libnetworking/rtems/rtems_glue.c:137
>> #2 0x201e5cac in sofree (so=0x201ce8b8) at
>> ../../../../../../rtems-4.8.0/c/src/../../cpukit/libnetworking/kern/uipc_socket.c:156
>> #3 0x02000000 in ?? ()
>> Backtrace stopped: previous frame inner to this frame (corrupt stack?)
>>
>> (arm-gdb)
Joel,
Here is my understanding (possibly over simplified) of what is
happening: Yes, there are two threads here, 1) my application still
containing kbhit() function and 2) the standard 4.8.0 telnetd. Since I
have no CONSOLE driver enabled, the first socket() call returns 0 which
is the "des_socket" used in telnetd. This gets opened OK. Then my task
runs and fails on the kbhit() due to no CONSOLE driver. I call
rtems_panic() which eventually reaches the point where stdin (also FD 0,
I think) is called. The chain of code realizes FD 0 is a socket and
closes it, freeing some memory and setting the SS_CANTRCVMORE bit in the
so_state for socket 0. After this, but before everything shuts down, the
accept() call in telnetd sees this SS_CANTRCVMORE flag and returns a -1.
This causes the endless loop to exit and the "des_socket" 0 is closed.
Since FD 0 was already closed by the _fclose(stdin) this caused the
malloc/free error that I see in telnetd.
So I think the problem is:
1) socket allocation starts at 0 when there is no console driver
(instead of 3 when there is).
2) _fclose(stdin=0) occurs when there is no console (I assume stdin was
never opened?)
3) I called rtems_panic() in my user program.
Not doing 3 fixes the situation for me.
-gene
More information about the users
mailing list