Page MenuHomeFreeBSD

Fix dtrace symbol resolution for anonymous structs/unions
ClosedPublic

Authored by jtl on Tue, Nov 17, 3:02 AM.

Details

Summary

In D27213, @ae reported that he was seeing this problem:

$ dtrace -n 'fbt::ip_input:entry { printf("%s", stringof(args[0]->m_pkthdr.rcvif->if_xname)); }'
dtrace: invalid probe specifier fbt::ip_input:entry { printf("%s", stringof(args[0]->m_pkthdr.rcvif->if_xname)); }: in action list: m_pkthdr is not a member of struct mbuf

This only occurs when ipfw.d is loaded first, which imports struct mbuf into the "D" CTF container.

As part of the import, ctf_add_type() is calling ctf_member_iter() to call membadd() on each member of the structure/union:

if (ctf_member_iter(src_fp, src_type, membadd, &dst) != 0)

ctf_member_iter() calls ctf_strptr() to convert the name index to a string. ctf_strptr() is converting a 0-index to an empty string. membadd() is then adding the member with a name of the empty string. However, that confuses other places in the code (such as _ctf_member_info), which expect empty string member names to be encoded as index 0.

Diff Detail

Repository
rS FreeBSD src repository
Lint
Automatic diff as part of commit; lint not applicable.
Unit
Automatic diff as part of commit; unit tests not applicable.

Event Timeline

jtl requested review of this revision.Tue, Nov 17, 3:02 AM

While here, update the code in ctf_add_generic() to encode empty type names with index 0. This fixes the analogous case for type names.

Could you please re-upload with context?

Updating the diff to include context.

Could you please re-upload with context?

Done. Yes, looking at the previous diffs, they weren't very obvious. The context should help clarify the proposed change.

I'd suggest running the DTrace test suite with this change if you haven't. make -C cddl/usr.sbin/dtrace WITH_DTRACE_TESTS= all install should install them to /usr/tests/cddl/usr.sbin/dtrace.

This revision is now accepted and ready to land.Thu, Nov 19, 3:52 PM

I'd suggest running the DTrace test suite with this change if you haven't. make -C cddl/usr.sbin/dtrace WITH_DTRACE_TESTS= all install should install them to /usr/tests/cddl/usr.sbin/dtrace.

Thanks for the pointer! The test results are the same before and after my change.