Logging/printf's in RT env

Rene Wittmann Rene.B.Wittmann at informatik.stud.uni-erlangen.de
Mon Aug 8 20:28:16 CEST 2005


Hi,

first of all: sorry for my late answer, I've been away...

On Thu, Aug 04, 2005 at 03:09:12PM +0200, Adam Lackorzynski wrote:
> On Thu Aug 04, 2005 at 13:45:12 +0200, Rene Wittmann wrote:
> > I have also the problem that I want to output some of my symbols+values
> > during the execution of my application.
> > Furthermore I'm working in the RT scheduling mode (with APIC one shot
> > mode).
> > 
> > I have three timeslices:
> >    1. mandatory
> >    2. optional
> >    3. "mandatory" (if part of optional was executed)
> > 
> > The preempter recognizes timeslice overruns and sets a
> > global variable, the working thread checks this variable and therefore
> > knows about those "events".
> > 
> > This works fine if my priorites are set to 50,30,50, 
> > but fails after a few periods with a pagefault if setting the priorities to 
> > 200,190,200.
> > 
> > In each part I use some calls to LOG() to output a few things I'm
> > interested in. If I leave out those LOG()-calls, it works also with the
> > high priorites (200,190,200).
> > So I assume, there's a LOG-buffer overflow (as the LOG priority is not
> > that high)?
> > 
> > Could I prevent this by using printf instead of LOG or is LOG just a
> > kind of macro for printf?
> 
> printf is usually also a log function.
> 
> The priorities of the logserver are at 32, so in the first example
> they're inbetween and in the latter one completely below.
> 
> Does the PF go away when you add --prio 210 (or similar) as an argument
> to log?
> 
Yes, it goes away.
But I thought that, if you have a real-time application running it will
not be influenced by some "time-sharing" application as the logserver
should be.

> Can you send me a backtrace with unstripped binaries when the PF
> happens? Thanks.
> 
Sure, I can if you tell me how to do it...

The exact error message is:

app| L4RM: [PF] write at 0x01306f58, eip 0380e48b, src 9.02
app| [9.0] l4rm/lib/src/pagefault.c:78:__unknown_pf():
app|  unhandled page fault

And then it enters the kernel debugger.
I've compiled my program with "CFLAGS = -g" so it should be unstripped,
right?

But when typing "bt<CR>" in the kernel debugger, there are no symbols
and the output just looks like this

 #4  f000763b
 #5  f0027332
 #6  f000e718
 #7  f000627a
 #8  f000e1fd
 #9  f000627a
#10  f000e1fd
#11  f000acb0
#12  f0005f6d
#13  f000627a
#14  f0006280
#15  f0005c3f
#16  f000627a
#17  f0006280
#18  f0005aec
#19  f999c5f5
#20  f00176ed
#21  f0006d54
#22  f0027300
#23  f000cfa5
#24  f0006a5a
#25  f000784b
#26  f00272dc

So I don't expect any helpful information in there or is it?


BTW:
my grub config looks like this:

title llv1_decode (all layers, log locally)
	root (hd0,2)
	kernel  /drops/bin/x86_586/l4v2/rmgr -sigma0
	modaddr 0x08000000
	module  /l4/kernel/fiasco/build/fiasco_apic -nokdb -nowait -serial -serial_esc
	module  /drops/bin/x86_586/l4v2/sigma0
	module  /drops/bin/x86_586/l4v2/log_net -net -local -ip 131.188.36.211 -buffer 4096
	module /drops/bin/x86_586/l4v2/names
	module /drops/bin/x86_586/l4v2/dm_phys
	module /drops/bin/x86_586/l4v2/simple_ts
	module /drops/bin/x86_586/l4v2/app

OK, this modaddr seems huge, but my data is just linked to the binary
and I need this huge value...

So how would one produce a useful backtrace inside fiasco? Or is there a
way to use another debugger (gdb?)?

Greetings,
Rene





More information about the l4-hackers mailing list