Page MenuHomeFreeBSD

libdtrace: Implement inline function tracing for kinst
Needs ReviewPublic

Authored by christos on Feb 28 2023, 5:10 PM.
Tags
Referenced Files
F107312620: D38825.id119059.diff
Sun, Jan 12, 9:20 AM
Unknown Object (File)
Sat, Jan 11, 5:37 PM
Unknown Object (File)
Thu, Jan 9, 12:23 PM
Unknown Object (File)
Mon, Jan 6, 3:37 PM
Unknown Object (File)
Sun, Jan 5, 6:32 PM
Unknown Object (File)
Wed, Jan 1, 6:43 PM
Unknown Object (File)
Sat, Dec 21, 6:58 PM
Unknown Object (File)
Sat, Dec 14, 9:18 AM

Details

Reviewers
markj
gnn
Summary

The following code implements inline tracing for the kinst DTrace
provider.

Briefly explained, what the code does is, for each probe of the form:

kinst::<inline_func>:<entry/return>

libdtrace checks to see if <inline_func> is indeed an inline function,
where in this case it finds all inline copies of it and creates new
probes for each one of them. Otherwise, it converts the probe to an FBT
one so that we don't duplicate FBT's functionality in kinst.

Notes:

Unlike FBT, leaving the probe name empty won't trace both entry and
return. kinst goes into "inline-tracing mode" only when it sees
entry/return in the probe name, otherwise it thinks it's a regular kinst
probe, in which case the dtrace(1) invocation will fail if we try to
trace an inline function with an empty probe name.

Sponsored by: The FreeBSD Foundation
MFC after: 1 week

Diff Detail

Repository
rG FreeBSD src repository
Lint
Lint Skipped
Unit
Tests Skipped

Event Timeline

There are a very large number of changes, so older changes are hidden. Show Older Changes
  • use dt_free() instead of free()
  • add error checks after calls to dt_alloc() and dt_node_xalloc()

use dtp->bootfile in dt_sugar_do_kinst_inline() instead of hardcoding the path

fix dtrace_disx86() fail in dt_sugar_kinst_find_caller_func()

update dtrace_kinst.4 man page to mention inline tracing

remove call to dwarf_next_types_section()

Handle leaf functions with their push %rbp ommitted.

christos edited the summary of this revision. (Show Details)

Got rid of deep copying, appending to the main clause is simpler.

Handle multiple dn_pdescs properly, move handling away from
dt_sugar_visit_all().

christos edited the summary of this revision. (Show Details)

Do not always go back one instruction.

Improve example in man page.

Get rid of push %rbp check (depends on D39166).

christos edited the summary of this revision. (Show Details)

Parse all loaded modules and their debug files instead of just kernel.
Mention new bug in summary.

christos edited the summary of this revision. (Show Details)

Fix bugs, surround amd64-specific code in an #ifdef, merge flags into
dtsp_flags, handle dt_sugar_elf_init() and dwarf_elf_init() errors, use
longjmp() for dt_alloc() failures.

Fix per-module parsing. Create an additional FBT probe if a non-inline definition is
found along an inline definition in the same module.

More bug fixes. I always keep finding them after I submit the patch.

Do not exclude inline copies that have DW_AT_subprogram instead of
DW_AT_inlined_subroutine.

Add tests. kinst_test_inline() needs modification so that it can be splitted
into DW_AT_ranges.

Implement dt_sugar_elf_verify_debuglink() to make sure the debug files we're
reading are up to date, and if they're not, skip them. Also stop leaking
elf_info structs in dt_sugar_do_kinst_inline().

Fix accidental dangling brace.

Surround amd64-specific code in an ifdef.

Use dtrace_instr_size() and get rid of machine-dependent code (depends on
D39489).

Fix Makefile conflict, check if dtracetest is already loaded before attempting to load it.

Add libdwarf in Makefile.inc1 (Thanks Mark).

Bail out if kinst doesn't exist (i.e the architecture doesn't support it).

Fix return offset handling.

Fix off->val type causing a build failure.

sys/cddl/dev/dtrace/dtrace_test.c
90 ↗(On Diff #127670)

@markj do you have a good idea for this?

domagoj.stolfa_gmail.com added inline comments.
cddl/contrib/opensolaris/lib/libdtrace/common/dt_sugar.c
875

I don't see any other uses of cont, perhaps this can be done without using a goto?

cddl/contrib/opensolaris/lib/libdtrace/common/dt_sugar.c
874–878

I don't see any other uses of cont, perhaps this can be done without using a goto?

I guess it could be rewritten like this.

christos retitled this revision from libdtrace: implement inline function tracing for kinst to libdtrace: Implement inline function tracing for kinst.Wed, Jan 8, 2:04 PM
christos edited the summary of this revision. (Show Details)
christos marked an inline comment as done.
  • Remove unncessary goto.
  • Rebase on top of main.