Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
fc6891a
chore(deps): update googleapis to 200df99 (#2384)
renovate[bot] May 28, 2025
de91c6f
fix(deps): update google.golang.org/grpc/examples digest to ec4810c (…
renovate[bot] May 28, 2025
28be5d9
chore(deps): update module github.com/abirdcfly/dupword to v0.1.5 (#2…
renovate[bot] May 29, 2025
215ff3f
chore(deps): update module github.com/go-logr/logr to v1.4.3 (#2385)
renovate[bot] May 29, 2025
b3b6842
chore(deps): update bitnami/kafka:latest docker digest to a5182b6 (#2…
renovate[bot] May 29, 2025
b48d419
chore(deps): update module github.com/abirdcfly/dupword to v0.1.6 (#2…
renovate[bot] May 29, 2025
6db8575
fix(deps): update module github.com/docker/docker to v28.2.1+incompat…
renovate[bot] May 29, 2025
99ab5db
fix(deps): update google.golang.org/grpc/examples digest to 4275c5b (…
renovate[bot] May 30, 2025
99ff03c
chore(deps): update module go.opentelemetry.io/proto/otlp to v1.7.0 (…
renovate[bot] May 30, 2025
4bd9c4a
chore(deps): update bitnami/kafka:latest docker digest to 6cd4f5e (#2…
renovate[bot] May 30, 2025
2371b29
chore(deps): update golang.org/x to 65e9200 (#2394)
renovate[bot] May 30, 2025
bc34ea1
chore(deps): update ossf/scorecard-action action to v2.4.2 (#2395)
renovate[bot] May 30, 2025
4767f44
fix(deps): update module github.com/docker/docker to v28.2.2+incompat…
renovate[bot] May 30, 2025
73d2ac6
Remove stuff not used by Pixie. Add crypto/tls template app and ensur…
ddelnano Mar 14, 2025
02a87f6
Test working for c argument. b's offset incorrect
ddelnano Mar 14, 2025
c0ee4e0
Updates to get c and b working. return args still need work
ddelnano Mar 14, 2025
2ed555b
Bail on attempt to recreate DWARF logic in this repo
ddelnano Mar 17, 2025
10b2a28
Add all of Pixie's fields to the offset tracker
ddelnano Mar 17, 2025
4e98b7d
Add changes to support funcfields with a placeholder for the funcfiel…
ddelnano Mar 18, 2025
f53ccb6
Replace Pixie based func argument finding with Go based implementation
ddelnano Mar 19, 2025
46c271f
Regenerate offsets with Go based func argument offset finder
ddelnano May 29, 2025
8422ecf
Apply changes to fix non deterministic sorting
ddelnano May 30, 2025
3c97d8f
Clean up comments. Use addr size from binary instead of hard coded value
ddelnano May 30, 2025
f3957ab
Fix grpc versions for google.golang.org/grpc/internal/transport bufWr…
ddelnano May 30, 2025
95973ce
Add integration tests for GoFuncFieldArgs
ddelnano Jun 2, 2025
074c3e3
Add ctags file to .gitignore
ddelnano Jun 2, 2025
d476950
Update golang.org/x/net template to work with all structs and func fi…
ddelnano Jun 2, 2025
0791826
Remove px specific template since upstream grpc one works
ddelnano Jun 2, 2025
3fe009a
Use Go stdlib dwarf functions to simplify DIE type handling logic. Us…
ddelnano Jun 2, 2025
a304f8f
Revert changes to prevent app cleanup
ddelnano Jun 2, 2025
1b8858d
Regenerate offset results from scratch
ddelnano Jun 4, 2025
7bc288d
Commit original
ddelnano Jun 6, 2025
c819b07
Fix Go 1.24 http2bufferedWriter field changes
ddelnano Jun 25, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ossf-scorecard.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:
with:
persist-credentials: false

- uses: ossf/scorecard-action@f49aabe0b5af0936a0987cfb85d86b75731b0186 # v2.4.1
- uses: ossf/scorecard-action@05b42c624433fc40578a4040d5cf5e36ddca8cde # v2.4.2
with:
results_file: results.sarif
results_format: sarif
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
.tools/
**/internal/test/e2e/*/main

# ctags file
tags

# Python pip cache.
.cache/

Expand Down
5 changes: 4 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,11 @@ $(BEAR): $(TOOLS)
rm -rf /tmp/Bear; \
fi

# Compiled in the Pixie repo via `bazel build //src/stirling/binaries:go_func_dwarf_dump`
DWARF_READER_DUMPER = internal/tools/inspect/go_func_dwarf_dump

.PHONY: tools
tools: $(GOLICENSES) $(MULTIMOD) $(GOLANGCI_LINT) $(DBOTCONF) $(OFFSETGEN) $(SYNCLIBBPF) $(CROSSLINK) $(BEAR)
tools: $(GOLICENSES) $(MULTIMOD) $(GOLANGCI_LINT) $(DBOTCONF) $(OFFSETGEN) $(SYNCLIBBPF) $(CROSSLINK) $(BEAR) $(DWARF_READER_DUMPER)

TEST_TARGETS := test-verbose test-ebpf test-race
.PHONY: $(TEST_TARGETS) test
Expand Down
2 changes: 1 addition & 1 deletion examples/kafka-go/consumer/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ require (
)

require (
github.com/go-logr/logr v1.4.2 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/klauspost/compress v1.18.0 // indirect
github.com/pierrec/lz4/v4 v4.1.22 // indirect
Expand Down
4 changes: 2 additions & 2 deletions examples/kafka-go/consumer/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
Expand Down
2 changes: 1 addition & 1 deletion examples/rolldice/user/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ require (
)

require (
github.com/go-logr/logr v1.4.2 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
go.opentelemetry.io/otel/metric v1.36.0 // indirect
Expand Down
4 changes: 2 additions & 2 deletions examples/rolldice/user/go.sum
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
Expand Down
8 changes: 4 additions & 4 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ require (
github.com/cenkalti/backoff/v5 v5.0.2 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/go-logr/logr v1.4.2 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/google/uuid v1.6.0 // indirect
Expand Down Expand Up @@ -70,12 +70,12 @@ require (
go.opentelemetry.io/otel/metric v1.36.0 // indirect
go.opentelemetry.io/otel/sdk/log v0.12.2 // indirect
go.opentelemetry.io/otel/sdk/metric v1.36.0 // indirect
go.opentelemetry.io/proto/otlp v1.6.0 // indirect
go.opentelemetry.io/proto/otlp v1.7.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
golang.org/x/net v0.40.0 // indirect
golang.org/x/text v0.25.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250528174236-200df99c418a // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a // indirect
google.golang.org/protobuf v1.36.6 // indirect
)

Expand Down
16 changes: 8 additions & 8 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-quicktest/qt v1.101.1-0.20240301121107-c6c8733fa1e6 h1:teYtXy9B7y5lHTp8V9KPxpYRAVA7dozigQcMiBust1s=
Expand Down Expand Up @@ -122,8 +122,8 @@ go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFw
go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4=
go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w=
go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA=
go.opentelemetry.io/proto/otlp v1.6.0 h1:jQjP+AQyTf+Fe7OKj/MfkDrmK4MNVtw2NpXsf9fefDI=
go.opentelemetry.io/proto/otlp v1.6.0/go.mod h1:cicgGehlFuNdgZkcALOCh3VE6K/u2tAjzlRhDwmVpZc=
go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os=
go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
Expand Down Expand Up @@ -163,10 +163,10 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237 h1:Kog3KlB4xevJlAcbbbzPfRG0+X9fdoGM+UBRKVz6Wr0=
google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237/go.mod h1:ezi0AVyMKDWy5xAncvjLWH7UcLBB5n7y2fQ8MzjJcto=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237 h1:cJfm9zPbe1e873mHJzmQ1nwVEeRDU/T1wXDK2kUSU34=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
google.golang.org/genproto/googleapis/api v0.0.0-20250528174236-200df99c418a h1:SGktgSolFCo75dnHJF2yMvnns6jCmHFJ0vE4Vn2JKvQ=
google.golang.org/genproto/googleapis/api v0.0.0-20250528174236-200df99c418a/go.mod h1:a77HrdMjoeKbnd2jmgcWdaS++ZLZAEq3orIOAEIKiVw=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a h1:v2PbRU4K3llS09c7zodFpNePeamkAwG3mPrAery9VeE=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
google.golang.org/grpc v1.72.2 h1:TdbGzwb82ty4OusHWepvFWGLgIbNo1/SUynEN0ssqv8=
google.golang.org/grpc v1.72.2/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM=
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
Expand Down
193 changes: 193 additions & 0 deletions internal/pkg/funcfield/funcfield.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,193 @@
package funcfield

import (
"errors"
"fmt"
"sort"
"strings"
"sync"

"github.com/Masterminds/semver/v3"
)

// // ID identifies a function argument or return value.
type ID struct {
// ModPath is the module path containing the struct field package.
//
// If set to "std", the struct field belongs to the standard Go library.
ModPath string
// PkgPath package import path containing the struct field.
PkgPath string
// Struct is the name of the struct containing the field.
Func string
// Field is the field name.
Arg string
}

// NewID returns a new ID using pkg for the PkgPath, strct for the Struct, and
// field for the Field.
func NewID(mod, pkg, fn, arg string) ID {
return ID{ModPath: mod, PkgPath: pkg, Func: fn, Arg: arg}
}

type UniqueOffset struct {
Value uint64
Location Location
Valid bool
}

// Offsets holds byte offsets for function arguments and return values.
type Offsets struct {
Mu sync.RWMutex
Values map[VerKey]OffsetVersion
Ua UniqueOffset
}

func (o *Offsets) GetLatest() (OffsetKey, VerKey) {
o.Mu.RLock()
defer o.Mu.RUnlock()

latestVersion := VerKey{}
val := OffsetKey{}
for verKey, ov := range o.Values {
// TODO(ddelnano): This needs to handle differences in the Location as well.
// for now this doesn't matter since for the ABIInternal (more recent Go ABI)
// would have to pass many arguments to spill over to the stack.
if verKey.GreaterThan(latestVersion) && ov.Offset.Valid {
latestVersion = verKey
val = ov.Offset
}
}

return val, latestVersion
}

func (o *Offsets) Index() map[OffsetKey][]*semver.Version {
o.Mu.RLock()
defer o.Mu.RUnlock()

out := make(map[OffsetKey][]*semver.Version)
for _, ov := range o.Values {
vers, ok := out[ov.Offset]
if ok {
i := sort.Search(len(vers), func(i int) bool {
return vers[i].GreaterThanEqual(ov.Version)
})
vers = append(vers, nil)
copy(vers[i+1:], vers[i:])
vers[i] = ov.Version
} else {
vers = append(vers, ov.Version)
}
out[ov.Offset] = vers
}
return out
}

func (v VerKey) GreaterThan(other VerKey) bool {
return v.Version.GreaterThan(&other.Version)
}

// NewOffsets initializes an empty Offsets structure.
func NewOffsets() *Offsets {
return &Offsets{Values: make(map[VerKey]OffsetVersion)}
}

// Get retrieves an offset and location for a given version.
func (o *Offsets) Get(ver *semver.Version) (OffsetKey, bool) {
if o == nil {
return OffsetKey{}, false
}
o.Mu.RLock()
v, ok := o.Values[NewVerKey(ver)]
o.Mu.RUnlock()

// TODO(ddelnano): The Location should be checked here. For now this doesn't
// matter since for the ABIInternal (more recent Go ABI) would have to pass
// many arguments to spill over to the stack.
if strings.HasPrefix(ver.String(), "0.0.0") && !ok && o.Ua.Valid {
return OffsetKey{Offset: o.Ua.Value, Valid: true, Location: o.Ua.Location}, true
}

return v.Offset, ok
}

// // Put stores an offset and location type for a given version.
func (o *Offsets) Put(ver *semver.Version, offset OffsetKey) {
ov := OffsetVersion{Offset: offset, Version: ver}
o.Mu.Lock()
defer o.Mu.Unlock()

if o.Values == nil {
o.Values = map[VerKey]OffsetVersion{NewVerKey(ver): ov}
o.Ua.Valid = ov.Offset.Valid
o.Ua.Value = ov.Offset.Offset
o.Ua.Location = ov.Offset.Location
return
}

o.Values[NewVerKey(ver)] = ov
if o.Ua.Valid && (o.Ua.Value != ov.Offset.Offset || o.Ua.Location != ov.Offset.Location) {
o.Ua.Valid = false
}
}

// // Struct for version comparison.
type VerKey struct {
semver.Version
}

func NewVerKey(v *semver.Version) VerKey {
stripped := semver.New(v.Major(), v.Minor(), v.Patch(), v.Prerelease(), v.Metadata())
return VerKey{Version: *stripped}
}

type Location int

const (
Unknown Location = iota
Stack Location = iota
Registers Location = iota
)

func (l *Location) UnmarshalJSON(data []byte) error {
switch string(data) {
case `"kStack"`:
fallthrough
case `"stack"`:
*l = Stack
case `"kRegister"`:
fallthrough
case `"registers"`:
*l = Registers
case `"kUnknown"`:
fallthrough
case `"unknown"`:
*l = Unknown
default:
return errors.New(fmt.Sprintf("invalid location %s", string(data)))
}
return nil
}

func (l *Location) MarshalJSON() ([]byte, error) {
if *l == Unknown {
return []byte(`"unknown"`), nil
} else if *l == Stack {
return []byte(`"stack"`), nil
} else if *l == Registers {
return []byte(`"registers"`), nil
}
return nil, errors.New(fmt.Sprintf("invalid location %d", *l))
}

type OffsetKey struct {
Offset uint64
Location Location
Valid bool
}

type OffsetVersion struct {
Offset OffsetKey
Version *semver.Version
}
2 changes: 1 addition & 1 deletion internal/pkg/inject/consts.go
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ func FindOffset(id structfield.ID, info *process.Info) (structfield.OffsetKey, e
return structfield.OffsetKey{}, err
}

v, err := process.DWARF{Reader: data.Reader()}.GoStructField(id)
v, err := process.NewDWARF(data).GoStructField(id)
if err != nil {
return structfield.OffsetKey{}, err
}
Expand Down
Loading