DTrace: stack() does not print kernel module functions for i386

Konstantin Belousov kostikbel at gmail.com
Sun Nov 9 09:36:38 UTC 2014


On Sat, Nov 08, 2014 at 02:06:39PM -0800, Shrikanth Kamath wrote:
> I verified this on a FreeBSD 10.0 STABLE, the stack() feature does not
> appear to print functions from kernel modules. I believe there is a
> glitch in libdtrace in the function "dt_module_update"
> (cddl/contrib/opensolaris/lib/libdtrace/common/dt_module.c).
> 
> The section header address computation which is currently being done
> in the function dt_module_update for elf type ET_REL, a similar
> computation needs to be done for the ET_DYN maybe. I lack background
> on the elf types but for experiment sakes I changed the line
> 
> @@ -948,7 +948,7 @@ dt_module_update(dtrace_hdl_t *dtp, struct kld_fil
>  #if defined(__FreeBSD__)
>         mapbase = (uintptr_t)k_stat->address;
>         gelf_getehdr(dmp->dm_elf, &ehdr);
> -       is_elf_obj = (ehdr.e_type == ET_REL);
> +      is_elf_obj = (ehdr.e_type == ET_REL) || (ehdr.e_type == ET_DYN);
>         if (is_elf_obj) {
>                 dmp->dm_sec_offsets =
>                     malloc(ehdr.e_shnum * sizeof(*dmp->dm_sec_offsets));
> 
> So from a previous run where I was running a dtrace one liner
> %dtrace -n 'fbt:hwpmc:: { stack(); }'
> The output without the above change shows a sample as
> 
>  0  50825 pmc_find_process_descriptor:entry
>               0xc3c35bf5                                  <-- Address
> not matched to symbol
>               kernel`syscall+0x48b
>               kernel`0xc0fd2121
> 
> whereas with the above nit change to include ET_DYN for section offset
> adjustment I get the complete stack trace as
> 
>  0  50825 pmc_find_process_descriptor:entry
>               hwpmc.ko`pmc_hook_handler+0x6a5   <--address matched to symbol
>               kernel`syscall+0x48b
>               kernel`0xc0fd2121
> 
> I believe without the correct section offset adjustment the following
> check in the function dtrace_lookup_by_addr fails to match the address
> to the correct symbol
> 
>             if (addr - dmp->dm_text_va < dmp->dm_text_size ||
>                     addr - dmp->dm_data_va < dmp->dm_data_size ||
>                     addr - dmp->dm_bss_va < dmp->dm_bss_size)
> 
> because dml->dm_text_va was not setup correctly in dt_module_update.
> 
> Can somebody help clarify this?
> 
> Reference: commit revision 210425.

I have no idea about DTrace guts, but can add one note you might find
useful.

>From the backtace above I can conclude that your platform is i386.
A difference between i386 and amd64 is that i386 modules are dso's
(ET_DYN), while on amd64 modules are only linked to object files
(ET_REL).  The original author of the code probably tested on amd64.

You may want to special case amd64 by #ifdef, and use ET_DYN on other
arches.


More information about the freebsd-dtrace mailing list