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.

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à.

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