Hans,

        This is a bug in the OS X dtrace:

        <rdar://problem/7037927> Dtrace finishes execution of binary before 
creating probes when using -c option

        There is a "workaround" of sorts, which is adding the following flags:

        -xevaltime=exec -Z

        That tells dtrace to start tracing from the very beginning of the 
target process spawn, which is why you need the -Z flag, because the process 
will not have loaded any libraries at that time, and normally probes won't be 
matching that are expected to match.

        In your case, using pid$target:::entry, you might get away with the -Z 
flag :-)

        James M

On Dec 7, 2010, at 8:28 PM, Hans Stimer wrote:

> Interesting. My expectation was that it would work like gdb i.e. that the app 
> would not run until gdb was in full control. For me, -c implies that behavior.
> 
> I tried putting in a sleep for 10 seconds; still nothing:
> 
>      $ sudo dtrace -n 'pid$target:::entry { trace(arg0); }' -c ./out
> 
> On Tue, Dec 7, 2010 at 6:53 PM, Jim Mauro <james.ma...@oracle.com> wrote:
> 
> I am cross-posting back to dtrace-discuss, since the Apple folks listen...
> 
> I'm not sure what your hello world program is doing. I tried the same thing
> with compiled C code.
> 
> The problem I ran into with hello world, and with the date example, is
> the program is executing and completing before dtrace can
> instrument it. Adding a sleep(1); to the hello world program and
> I get expected output.
> 
> This does not happen on Solaris. I expect it's due to implementation
> differences in the pid provider between the operating systems.
> 
> In any event, it seems on OS X using the pid provider on a binary
> the runs for less than a second does not give the pid provider 
> time to instrument the code.
> 
> That's not necessarily an issue (at least for me), since I never need
> to chase performance problems on something that runs in
> a few hundred milliseconds....
> 
> ;^)
> 
> /jim
> 
> dtrace'ing hello world with a 1 second sleep;
> 
> macosx> dtrace -n 'pid$target:::entry' -c ./hw
> dtrace: description 'pid$target:::entry' matched 7950 probes
> Hello World
> dtrace: pid 16109 has exited
> CPU     ID                    FUNCTION:NAME
>   0  27974 ImageLoaderMachO::getExportedSymbolAddress(ImageLoader::Symbol 
> const*, ImageLoader::LinkContext const&, ImageLoader const*) con:entry 
>   0  27973 ImageLoaderMachO::getSymbolAddress(ImageLoader::Symbol const*, 
> ImageLoader const*, ImageLoader::LinkContext const&) const:entry 
>   0  28101 
> ImageLoaderMachOCompressed::exportedSymbolAddress(ImageLoader::Symbol const*) 
> const:entry 
>   0  27982 ImageLoaderMachO::bindLocation(ImageLoader::LinkContext const&, 
> unsigned long, unsigned long, ImageLoader const*, unsigned char:entry 
>   0  30491                       puts:entry 
>   0  28559                     strlen:entry 
>   0  28719                 __sfvwrite:entry 
>   0  29640                  __swsetup:entry 
>   0  28749                    __sinit:entry 
>   0  28571                    sysconf:entry 
>   0  28750                  getrlimit:entry 
>   0  28751                __getrlimit:entry 
>   0  29641                 __smakebuf:entry 
>   0  29642                 __swhatbuf:entry 
>   0  28684              fstat$INODE64:entry 
>   0  29812                     isatty:entry 
>   0  28723                      ioctl:entry 
>   0  28724                    __ioctl:entry 
>   0  28549                     malloc:entry 
>   0  28574         malloc_zone_malloc:entry 
>   0  28575               szone_malloc:entry 
>   0  28576  szone_malloc_should_clear:entry 
>   0  28640 small_malloc_from_free_list:entry 
>   0  28553             allocate_pages:entry 
>   0  28554                       mmap:entry 
>   0  28555                     __mmap:entry 
>   0  28578                     munmap:entry 
>   0  28578                     munmap:entry 
>   0  29393                     memchr:entry 
>   0  28523                     memcpy:entry 
>   0  29393                     memchr:entry 
>   0  28523                     memcpy:entry 
>   0  29719                   __fflush:entry 
>   0  29643                   __sflush:entry 
>   0  29644                    _swrite:entry 
>   0  29645                   __swrite:entry 
>   0  29646             write$NOCANCEL:entry 
>   0  28463               stub helpers:entry 
>   0  51054           dyld_stub_binder:entry 
>   0  28697 _dyld_fast_stub_entry(void*, long):entry 
>   0  27717 dyld::fastBindLazySymbol(ImageLoader**, unsigned long):entry 
>   0  28106 ImageLoaderMachOCompressed::doBindFastLazySymbol(unsigned int, 
> ImageLoader::LinkContext const&):entry 
>   0  28010 ImageLoaderMachO::segActualLoadAddress(unsigned int) const:entry 
>   0  28074 ImageLoaderMachOCompressed::segmentCommandOffsets() const:entry 
>   0  28090 ImageLoaderMachOCompressed::resolve(ImageLoader::LinkContext 
> const&, char const*, unsigned char, int, ImageLoader const**, Imag:entry 
>   0  28075 ImageLoaderMachOCompressed::libImage(unsigned int) const:entry 
>   0  28088 
> ImageLoaderMachOCompressed::resolveTwolevel(ImageLoader::LinkContext const&, 
> ImageLoader const*, bool, char const*, ImageLoader:entry 
>   0  28002 ImageLoaderMachO::findExportedSymbol(char const*, bool, 
> ImageLoader const**) const:entry 
>   0  28102 ImageLoaderMachOCompressed::findExportedSymbol(char const*, 
> ImageLoader const**) const:entry 
>   0  27974 ImageLoaderMachO::getExportedSymbolAddress(ImageLoader::Symbol 
> const*, ImageLoader::LinkContext const&, ImageLoader const*) con:entry 
>   0  27973 ImageLoaderMachO::getSymbolAddress(ImageLoader::Symbol const*, 
> ImageLoader const*, ImageLoader::LinkContext const&) const:entry 
>   0  28101 
> ImageLoaderMachOCompressed::exportedSymbolAddress(ImageLoader::Symbol const*) 
> const:entry 
>   0  27982 ImageLoaderMachO::bindLocation(ImageLoader::LinkContext const&, 
> unsigned long, unsigned long, ImageLoader const*, unsigned char:entry 
>   0  28726                       exit:entry 
>   0  28727             __cxa_finalize:entry 
>   0  27719 dyld::runTerminators(void*):entry 
>   0  27701 dyld::notifyBatchPartial(dyld_image_states, bool, char const* 
> (*)(dyld_image_states, unsigned int, dyld_image_info const*)):entry 
>   0  28728         pthread_key_delete:entry 
>   0 126037                    __tcf_0:entry 
>   0  29716                   _cleanup:entry 
>   0  29717                     _fwalk:entry 
>   0  29643                   __sflush:entry 
>   0  29643                   __sflush:entry 
>   0  29643                   __sflush:entry 
>   0  28729                      _exit:entry 
>   2  50753                     cerror:entry 
>   2  28752     cthread_set_errno_self:entry 
>   2  28614                    __error:entry 
>   2  28614                    __error:entry 
>   2  28463               stub helpers:entry 
>   2  51054           dyld_stub_binder:entry 
>   2  28697 _dyld_fast_stub_entry(void*, long):entry 
>   2  27717 dyld::fastBindLazySymbol(ImageLoader**, unsigned long):entry 
>   2  28106 ImageLoaderMachOCompressed::doBindFastLazySymbol(unsigned int, 
> ImageLoader::LinkContext const&):entry 
>   2  28010 ImageLoaderMachO::segActualLoadAddress(unsigned int) const:entry 
>   2  28074 ImageLoaderMachOCompressed::segmentCommandOffsets() const:entry 
>   2  28090 ImageLoaderMachOCompressed::resolve(ImageLoader::LinkContext 
> const&, char const*, unsigned char, int, ImageLoader const**, Imag:entry 
>   2  28075 ImageLoaderMachOCompressed::libImage(unsigned int) const:entry 
>   2  28088 
> ImageLoaderMachOCompressed::resolveTwolevel(ImageLoader::LinkContext const&, 
> ImageLoader const*, bool, char const*, ImageLoader:entry 
>   2  28002 ImageLoaderMachO::findExportedSymbol(char const*, bool, 
> ImageLoader const**) const:entry 
>   2  28102 ImageLoaderMachOCompressed::findExportedSymbol(char const*, 
> ImageLoader const**) const:entry 
> 
> On Dec 7, 2010, at 5:09 PM, Hans Stimer wrote:
> 
>> Thank you for the quick response. I tried a number of things and got some 
>> interesting results. In short:
>> 
>> 1) pid doesn't work with -c date, but does seem to work with other 
>> executables. On osx date is an executable and not a script or built in.
>> 2) pid doesn't let you instrument all entries; I created a hello world 
>> program and dtrace didn't return for over 5 minutes
>> 
>> * Modify to point to hello world program:
>> $ sudo dtrace -n 'pid$target:::entry { trace(arg0); }' -c ./out
>> dtrace: description 'pid$target:::entry ' matched 7947 probes
>> ^C
>> I gave it over 5 minutes and it didn't return
>> 
>> * Trace everything connected to date:
>> $ sudo dtrace -n 'pid$target:::entry { trace(arg0); }' -c date
>> Tue Dec  7 13:49:34 PST 2010
>> dtrace: invalid probe specifier pid$target:::entry { trace(arg0); }: failed 
>> to create entry probe for 'stub_binding_helper': No such process
>> 
>> * Find entry points for date
>> $ sudo dtrace -ln 'pid$target:::entry,pid$target:::return' -c date
>> Tue Dec  7 13:52:55 PST 2010
>> dtrace: invalid probe specifier pid$target:::entry,pid$target:::return: 
>> failed to create entry probe for 'stub_binding_helper': No such process
>> 
>> * Find entry points for hello world program:
>> $ sudo dtrace -ln 'pid$target:::entry,pid$target:::return' -c ./out
>>    ID   PROVIDER            MODULE                          FUNCTION NAME
>> 144623   pid95634              dyld               stub_binding_helper entry
>> 144624   pid95634              dyld                  dyld_func_lookup entry
>> 144625   pid95634              dyld    offset_to_dyld_all_image_infos entry
>> 144626   pid95634              dyld                       _dyld_start entry
>> 144627   pid95634              dyld                  dyld_fatal_error entry
>> .
>> .
>> .
>> 
>> * Find entry points for top:
>> $ sudo dtrace -ln 'pid$target:::entry,pid$target:::return' -c top
>>    ID   PROVIDER            MODULE                          FUNCTION NAME
>> 36684   pid95691              dyld                       _dyld_start entry
>> 36685   pid95691              dyld std::vector<dyld_image_info, 
>> std::allocator<dyld_image_info> 
>> >::erase(__gnu_cxx::__normal_iterator<dyld_image_info*, std::vecto entry
>> 36686   pid95691              dyld std::_Vector_base<dyld_image_info, 
>> std::allocator<dyld_image_info> >::~_Vector_base() entry
>> 36687   pid95691              dyld                  dyld_fatal_error entry
>> .
>> .
>> .
>> 
>> 
>> 
>> On Tue, Dec 7, 2010 at 12:27 PM, Jim Mauro <james.ma...@oracle.com> wrote:
>> 
>> When you say "straight from the dtrace book", I assume you mean
>> the soon-to-be-published book?
>> 
>> If that is the case, please allow me to clarify. Not every invocation of 
>> dtrace,
>> both one-liners and scripts, that are in the book (and there are hundreds) is
>> tested and guaranteed to work under all three operating systems
>> (Solaris, OS X, FreeBSD). In fact, some will not work across different 
>> Solaris
>> releases, depending on (for example) which provider is used.
>> 
>> We are very clear in the book with our examples about the differences in
>> the underlying implementations. There are a great many scripts and one-liners
>> in the book that will only work on Solaris.
>> 
>> The good news is that, in addition to the actual examples, there is a lot of
>> emphasis on methodology in the book, such that you can use DTrace
>> to figure out which probes/modules, etc, you should be instrumenting
>> based on the problem you are trying to solve or what you are trying
>> to observe.
>> 
>> For example, if you change your D to;
>> 
>> pid$target:::entry { @[probemod] = count(); }'
>> 
>> You will see what the actual module names are available for you
>> to instrument.
>> 
>> Binaries on OS X link to libSystem.B.dylib for common functions.
>> 
>> Thanks
>> /jim
>> 
>> On Dec 7, 2010, at 3:09 PM, Hans Stimer wrote:
>> 
>> > Under osx 10.6.5:
>> >
>> > ~ $ sudo dtrace -n 'pid$target:libc::entry { @[probefunc] = count(); }' -c 
>> > date
>> > Tue Dec  7 11:40:59 PST 2010
>> > dtrace: invalid probe specifier pid$target:libc::entry { @[probefunc] = 
>> > count(); }: probe description pid94942:libc::entry does not match any 
>> > probes
>> >
>> > This is an example straight from the dtrace book which claims to test 
>> > under osx, so I'm guessing that something broke in osx?
>> > _______________________________________________
>> > dtrace-discuss mailing list
>> > dtrace-discuss@opensolaris.org
>> 
>> 
> 
> 
> _______________________________________________
> dtrace-discuss mailing list
> dtrace-discuss@opensolaris.org

_______________________________________________
dtrace-discuss mailing list
dtrace-discuss@opensolaris.org

Reply via email to