Need help profiling with Valgrind

Björn Döbel doebel at os.inf.tu-dresden.de
Sun Nov 9 22:49:46 CET 2014


Hi,

> i run into an Error in my l4re-App.
> Till now, i did printf()-Debugging, but it is at its limit in this case.
>
> The Error message is the following:
>> L4Re[rm]: unhandled write page fault @7ffff300 pc=15c7a8

This error message tells you that your program is trying to execute an 
instruction at PC value 0x15c7a8. This instruction causes a write page 
fault at address 0x7ffff300 and L4re does not know what to do about it.

This usually happens when you try to access an address with no memory 
mapped. From the address it looks like you are accessing an address 
right below your stack, i.e., you are exceeding L4Re's default stack 
size. Most likely you have a function with a large buffer on the stack 
or you are recursing very deeply?

> However, with printf() i can't make it up to specific code.
> But, there is a function with some if-else stuff, and if i comment some
> lines out, the Error doesnt appear. Funny, printf() tells me, that the
> commented code never executes. i.e. the else-part is never ever
> executed, but the program still fails when it is not commented out.
>
> So, i'm not sure what to try next.
> Does Valgrind work here?

Probably it would. Valgrind tracks allocated memory regions and could at 
least tell you what I told you above: you are accessing memory out of 
any allocated region.

> And what about the Valgrind in the Snapshot?
> It has some strange Makefile. Does this work for a ARM system?
>> SYSTEMS = x86-l4f
>>
>> all::
>>        if [ ! -e $(PKGDIR)/broken ]; then PWD=$(PWD)/build make -C
>> build; fi
>
> Or can i run my bootstrap.raw on an standard ARM Linux?

Nope, we only ported it to x86/32, never tried ARM.

> Anything else to try besides Valgrind?

As suggested above, check for deep recursion or arrays allocated on the 
stack. If that does not help, try increasing L4Re's default stack size 
for your application using the L4RE_ELF_AUX_ELEM_T macro defined in 
l4/re/elf_aux.h. For this, place something like this anywhere in your 
compilation unit:

#include <l4/re/elf_aux.h>
L4RE_ELF_AUX_ELEM_T(l4re_elf_aux_mword_t, stack_size,
                     L4RE_ELF_AUX_T_STACK_SIZE, 65536);

(This example sets the stack size to 64k.)

Hth,
Bjoern




More information about the l4-hackers mailing list