Sometimes it may already be helpful to capture a translator's stdout and stderr, for example in this situation where pfinet was silently dying all the time, without any console output:

$ sudo settrans -fgap ↩
  /servers/socket/2 ↩
  /bin/sh -c 'exec >> /root/pfinet.log 2>&1 && date && ↩
    /hurd/pfinet -i /dev/eth0 -a [...]'
$ [...]
$ cat /root/pfinet.log
[date]
NET4: Linux TCP/IP 1.0 for NET4.0
IP Protocols: ICMP, UDP, TCP
TCP: Hash tables configured (ehash 65536 bhash 65536)
pfinet: ../../hurd.work/pfinet/ethernet.c:196: ethernet_xmit: Unexpected error: (os/device) invalid IO size.

(Trying to run GDB in this case was of no help -- due to a bug in GDB (supposedly) it wouldn't catch the fault.)

Be made aware that both stdout and stderr will be block bufferend and no longer line buffered when doing such a redirection, so you'll have to arrange for appropriate fflushes on these, or force them to be line buffered again using the appropriate glibc magic (setvbuf). Otherwise you'll see text in the output files only if either glibc herself decides to flush (after some KiB of text) the after translator exits.

There is also a related open issue.

Posted 2008-11-20 22:50:42 CET
License:

GFDL 1.2+

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled GNU Free Documentation License.

gdb

Say you want to try running file system server (ext2fs, ?jfs, ...) against a modified version of libpager and debug the latter one using GDB.

On Debian you need the hurd-dbgsym and libc0.3-dbg packages installed.

Set the translator like this:

$ settrans -fgap ↩
  jfs.img.i ↩
  /usr/bin/env ↩
    LD_LIBRARY_PATH=~tschwinge/tmp/hurd/hurd.ogi/build/libpager ↩
  "$PWD"/jfs.obj/jfs ↩
    "$PWD"/jfs.img

Then, when starting GDB, start it like this (or use an equivalent method, of course):

$ LD_LIBRARY_PATH=~tschwinge/tmp/hurd/hurd.ogi/build/libpager ↩
  gdb ↩
    ~tschwinge/tmp/jfs/jfs.obj/jfs 15436
GNU gdb 6.5-debian
[...]
Reading symbols from /lib/libdiskfs.so.0.3...Reading symbols from /lib/debug/lib/libdiskfs.so.0.3...done.
done.
Loaded symbols for /lib/libdiskfs.so.0.3
Reading symbols from /devel4/tschwinge/tmp/hurd/hurd.ogi/build/libpager/libpager.so.0.3...done.
Loaded symbols for /devel4/tschwinge/tmp/hurd/hurd.ogi/build/libpager/libpager.so.0.3
Reading symbols from /lib/libstore.so.0.3...Reading symbols from /lib/debug/lib/libstore.so.0.3...done.
done.
Loaded symbols for /lib/libstore.so.0.3
[...]
(gdb) break pager_demuxer
Breakpoint 1 at 0x105c98d: file ../../libpager/demuxer.c, line 27.
[...]
Breakpoint 1, pager_demuxer (inp=0x12bded0, outp=0x12bbec0) at ../../libpager/demuxer.c:27
27      {
(gdb) list
22      /* Demultiplex a single message directed at a pager port; INP is the
23         message received; fill OUTP with the reply.  */
24      int
25      pager_demuxer (mach_msg_header_t *inp,
[...]

Voilà.

If you need to debug the initialization of the translator, start the translator like

$ settrans -Pa /foo /hurd/foofs

The -P option will make it pause and you will be able to attach GDB to the process.

Posted 2008-11-20 22:33:22 CET