Dtrace oddity
Christopher R. Bowman
crb at chrisbowman.com
Wed Apr 12 03:57:19 UTC 2017
Fabian,
That was hugely helpful. I should have known about the extra mmap sys calls, but sometimes your mind only sees what it expects to see. Checking for negative values on open is also the right thing to do (I had mis-read the man page to imply that zero indicated a failure to open). But the real help was putting one of the flags for mmap. I don’t think FreeBSD used to check for that as I have a vague recollection that this code used to work on a pervious version.
Thanks SO SO much for the help!
Christopher
--------
Christopher R. Bowman
email: crb at ChrisBowman.com
World Wide GSM cell: +1 (408) 476-2299
> On Apr 11, 2017, at 6:14 AM, Fabian Keil <freebsd-listen at fabiankeil.de> wrote:
>
> Christopher Bowman <crb at chrisbowman.com> wrote:
>
>> The man page lists a bunch of reasons for EINVAL so I want to
>> investigate this and I don’t quite know good strategies to debug the
>> kernel (yet) so I thought I’d experiment with Dtrace a bit. Here is the
>> oddity: when I run Dtrace and then run my test program I get the
>> following output from Dtrace:
>>
>> crb at retread:60> dtrace -n 'syscall:freebsd:mmap:entry /execname == "test"/ {}'
>> dtrace: description 'syscall:freebsd:mmap:entry ' matched 1
>> probe CPU ID FUNCTION:NAME
>> 0 63401 mmap:entry
>> 0 63401 mmap:entry
>> 0 63401 mmap:entry
>> 0 63401 mmap:entry
>> 0 63401 mmap:entry
>> 0 63401 mmap:entry
>> 0 63401 mmap:entry
>> 0 63401 mmap:entry
>> 0 63401 mmap:entry
>> 0 63401 mmap:entry
>> 0 63401 mmap:entry
>> 0 63401 mmap:entry
>>
>> I think Dtrace is indicating that the mmap syscall was called 12 times
>> by my test program yet I can see how the program below would have done
>> that.
>
> A bunch of mmap syscalls occur before main is even entered.
> Try running your program with truss to see what's going on.
>
>> Here is my program:
> [...]
>> printf("opening device %s\n", argv[1]);
>> int device = open (argv[1], O_RDWR);
>> if (device == 0) {
>
> You should check for -1 here.
>
>> void *pa = mmap (0, 4095, PROT_READ | PROT_WRITE, 0, device, 0);
>
> No flags? From the mmap man page:
>
> | [EINVAL] None of MAP_ANON, MAP_PRIVATE, MAP_SHARED, or
> | MAP_STACK was specified. At least one of these flags
> | must be included.
>
> Fabian
More information about the freebsd-hackers
mailing list