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