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