Skip to content

Commit 879cd57

Browse files
authored
Merge pull request #19 from parca-dev/add_modes
Add keep-only-debug mode as default
2 parents 9698205 + 5f5b908 commit 879cd57

File tree

3 files changed

+191
-176
lines changed

3 files changed

+191
-176
lines changed

cmd/parca-debuginfo/main.go

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,13 @@ import (
3333
"github.com/klauspost/compress/zstd"
3434
grun "github.com/oklog/run"
3535
"github.com/parca-dev/parca-agent/pkg/buildid"
36-
"github.com/parca-dev/parca-agent/pkg/debuginfo"
36+
"github.com/parca-dev/parca-agent/pkg/elfwriter"
3737
debuginfopb "github.com/parca-dev/parca/gen/proto/go/parca/debuginfo/v1alpha1"
3838
parcadebuginfo "github.com/parca-dev/parca/pkg/debuginfo"
3939
"github.com/parca-dev/parca/pkg/hash"
4040
"github.com/prometheus/client_golang/prometheus"
4141
"github.com/rzajac/flexbuf"
42+
"go.opentelemetry.io/otel/trace"
4243
"google.golang.org/grpc"
4344
"google.golang.org/grpc/credentials"
4445
"google.golang.org/grpc/credentials/insecure"
@@ -69,7 +70,9 @@ type flags struct {
6970
Extract struct {
7071
OutputDir string `kong:"help='Output directory path to use for extracted debug information files.',default='out'"`
7172

72-
Paths []string `kong:"required,arg,name='path',help='Paths to extract debug information.',type:'path'"`
73+
Paths []string `kong:"required,arg,name='path',help='Paths to extract debug information.',type:'path'"`
74+
CompressDWARFSections bool `kong:"default=false,help:'Compress debuginfo files DWARF sections before uploading.'"`
75+
Mode string `kong:"default='keep-only-debug',enum='keep-only-debug,strip-debug'"`
7376
} `cmd:"" help:"Extract debug information."`
7477

7578
Buildid struct {
@@ -99,7 +102,11 @@ type uploadInfo struct {
99102
}
100103

101104
func run(kongCtx *kong.Context, flags flags) error {
102-
extractor := debuginfo.NewExtractor(log.NewNopLogger())
105+
opts := []elfwriter.Option{}
106+
if flags.Extract.CompressDWARFSections {
107+
opts = append(opts, elfwriter.WithCompressDWARFSections())
108+
}
109+
extractor := elfwriter.NewExtractor(log.NewNopLogger(), trace.NewNoopTracerProvider().Tracer("noop"), opts...)
103110

104111
var g grun.Group
105112
ctx, cancel := context.WithCancel(context.Background())
@@ -126,7 +133,7 @@ func run(kongCtx *kong.Context, flags flags) error {
126133
}
127134
defer ef.Close()
128135

129-
buildID, err := buildid.BuildID(&buildid.ElfFile{Path: path, File: ef})
136+
buildID, err := buildid.FromELF(ef)
130137
if err != nil {
131138
return fmt.Errorf("get Build ID for %q: %w", path, err)
132139
}
@@ -145,7 +152,7 @@ func run(kongCtx *kong.Context, flags flags) error {
145152
return errors.New("failed to find actionable files")
146153
}
147154

148-
if err := extractor.ExtractAll(ctx, srcDst); err != nil {
155+
if err := extractAll(ctx, extractor, flags.Extract.Mode, srcDst); err != nil {
149156
return fmt.Errorf("failed to extract debug information: %w", err)
150157
}
151158
for _, upload := range uploads {
@@ -168,7 +175,7 @@ func run(kongCtx *kong.Context, flags flags) error {
168175
}
169176
defer ef.Close()
170177

171-
buildID, err = buildid.BuildID(&buildid.ElfFile{Path: path, File: ef})
178+
buildID, err = buildid.FromELF(ef)
172179
if err != nil {
173180
return fmt.Errorf("get Build ID for %q: %w", path, err)
174181
}
@@ -288,7 +295,7 @@ func run(kongCtx *kong.Context, flags flags) error {
288295
}
289296
defer ef.Close()
290297

291-
buildID, err := buildid.BuildID(&buildid.ElfFile{Path: path, File: ef})
298+
buildID, err := buildid.FromELF(ef)
292299
if err != nil {
293300
return fmt.Errorf("get Build ID for %q: %w", path, err)
294301
}
@@ -315,7 +322,7 @@ func run(kongCtx *kong.Context, flags flags) error {
315322
return errors.New("failed to find actionable files")
316323
}
317324

318-
return extractor.ExtractAll(ctx, srcDst)
325+
return extractAll(ctx, extractor, flags.Extract.Mode, srcDst)
319326
}, func(error) {
320327
cancel()
321328
})
@@ -328,7 +335,7 @@ func run(kongCtx *kong.Context, flags flags) error {
328335
}
329336
defer ef.Close()
330337

331-
buildID, err := buildid.BuildID(&buildid.ElfFile{Path: flags.Buildid.Path, File: ef})
338+
buildID, err := buildid.FromELF(ef)
332339
if err != nil {
333340
return fmt.Errorf("get Build ID for %q: %w", flags.Buildid.Path, err)
334341
}
@@ -445,6 +452,34 @@ func run(kongCtx *kong.Context, flags flags) error {
445452
return g.Run()
446453
}
447454

455+
// extractAll extracts debug information from the given executables.
456+
// It consumes a map of file sources to extract and a destination io.Writer.
457+
func extractAll(ctx context.Context, e *elfwriter.Extractor, mode string, srcDsts map[string]io.WriteSeeker) error {
458+
var result error
459+
for src, dst := range srcDsts {
460+
f, err := os.Open(src)
461+
if err != nil {
462+
fmt.Fprintf(os.Stderr, "failed to open file: %s, %v", src, err)
463+
result = errors.Join(result, err)
464+
continue
465+
}
466+
defer f.Close()
467+
468+
var extractFn func(context.Context, io.WriteSeeker, io.ReaderAt) error
469+
if mode == "strip-debug" {
470+
extractFn = e.StripDebug
471+
} else {
472+
extractFn = e.OnlyKeepDebug
473+
}
474+
475+
if err := extractFn(ctx, dst, f); err != nil {
476+
fmt.Fprintf(os.Stderr, "failed to extract debug information: %s, %v", src, err)
477+
result = errors.Join(result, err)
478+
}
479+
}
480+
return result
481+
}
482+
448483
func grpcConn(reg prometheus.Registerer, flags flags) (*grpc.ClientConn, error) {
449484
met := grpc_prometheus.NewClientMetrics()
450485
met.EnableClientHandlingTimeHistogram()

go.mod

Lines changed: 34 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,29 @@
11
module github.com/parca-dev/parca-debuginfo
22

3-
go 1.20
3+
go 1.21.1
4+
5+
toolchain go1.21.3
46

57
require (
6-
github.com/alecthomas/kong v0.8.0
8+
github.com/alecthomas/kong v0.8.1
79
github.com/go-kit/log v0.2.1
810
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
9-
github.com/klauspost/compress v1.16.7
11+
github.com/klauspost/compress v1.17.2
1012
github.com/oklog/run v1.1.0
11-
github.com/parca-dev/parca v0.18.1-0.20230816074650-c9b9bed904c3
12-
github.com/parca-dev/parca-agent v0.12.1-0.20230216133018-8dd5ccaeef0f
13-
github.com/prometheus/client_golang v1.16.0
13+
github.com/parca-dev/parca v0.20.0
14+
github.com/parca-dev/parca-agent v0.26.1-0.20231030161640-40aeb6d1fa15
15+
github.com/prometheus/client_golang v1.17.0
1416
github.com/rzajac/flexbuf v0.14.0
15-
google.golang.org/grpc v1.57.0
17+
go.opentelemetry.io/otel/trace v1.19.0
18+
google.golang.org/grpc v1.59.0
1619
)
1720

1821
require (
19-
cloud.google.com/go v0.110.6 // indirect
22+
cloud.google.com/go v0.110.7 // indirect
2023
cloud.google.com/go/compute v1.23.0 // indirect
2124
cloud.google.com/go/compute/metadata v0.2.3 // indirect
2225
cloud.google.com/go/iam v1.1.1 // indirect
23-
cloud.google.com/go/storage v1.31.0 // indirect
26+
cloud.google.com/go/storage v1.33.0 // indirect
2427
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0 // indirect
2528
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 // indirect
2629
github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect
@@ -48,26 +51,22 @@ require (
4851
github.com/go-logfmt/logfmt v0.6.0 // indirect
4952
github.com/go-logr/logr v1.2.4 // indirect
5053
github.com/go-logr/stdr v1.2.2 // indirect
51-
github.com/goburrow/cache v0.1.4 // indirect
5254
github.com/gofrs/flock v0.8.1 // indirect
5355
github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
5456
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
5557
github.com/golang/protobuf v1.5.3 // indirect
56-
github.com/google/go-cmp v0.5.9 // indirect
58+
github.com/google/go-cmp v0.6.0 // indirect
5759
github.com/google/go-querystring v1.1.0 // indirect
58-
github.com/google/pprof v0.0.0-20230811205829-9131a7e9cc17 // indirect
59-
github.com/google/s2a-go v0.1.5 // indirect
60-
github.com/google/uuid v1.3.0 // indirect
60+
github.com/google/s2a-go v0.1.7 // indirect
61+
github.com/google/uuid v1.3.1 // indirect
6162
github.com/googleapis/enterprise-certificate-proxy v0.2.5 // indirect
6263
github.com/googleapis/gax-go/v2 v2.12.0 // indirect
63-
github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.2 // indirect
64-
github.com/hashicorp/errwrap v1.1.0 // indirect
65-
github.com/hashicorp/go-multierror v1.1.1 // indirect
64+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 // indirect
6665
github.com/huaweicloud/huaweicloud-sdk-go-obs v3.23.3+incompatible // indirect
6766
github.com/json-iterator/go v1.1.12 // indirect
6867
github.com/klauspost/cpuid/v2 v2.2.5 // indirect
6968
github.com/kylelemons/godebug v1.1.0 // indirect
70-
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
69+
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect
7170
github.com/minio/md5-simd v1.1.2 // indirect
7271
github.com/minio/minio-go/v7 v7.0.61 // indirect
7372
github.com/minio/sha256-simd v1.0.1 // indirect
@@ -79,32 +78,31 @@ require (
7978
github.com/oracle/oci-go-sdk/v65 v65.41.1 // indirect
8079
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect
8180
github.com/pkg/errors v0.9.1 // indirect
82-
github.com/prometheus/client_model v0.4.0 // indirect
83-
github.com/prometheus/common v0.44.0 // indirect
84-
github.com/prometheus/procfs v0.11.0 // indirect
81+
github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 // indirect
82+
github.com/prometheus/common v0.45.0 // indirect
83+
github.com/prometheus/procfs v0.12.0 // indirect
8584
github.com/rs/xid v1.5.0 // indirect
8685
github.com/sirupsen/logrus v1.9.3 // indirect
8786
github.com/sony/gobreaker v0.5.0 // indirect
8887
github.com/tencentyun/cos-go-sdk-v5 v0.7.40 // indirect
89-
github.com/thanos-io/objstore v0.0.0-20230804084840-c042a6a16c58 // indirect
88+
github.com/thanos-io/objstore v0.0.0-20230913122821-eb06103887ab // indirect
9089
go.opencensus.io v0.24.0 // indirect
91-
go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.42.0 // indirect
92-
go.opentelemetry.io/otel v1.16.0 // indirect
93-
go.opentelemetry.io/otel/metric v1.16.0 // indirect
94-
go.opentelemetry.io/otel/trace v1.16.0 // indirect
95-
golang.org/x/crypto v0.12.0 // indirect
96-
golang.org/x/net v0.14.0 // indirect
97-
golang.org/x/oauth2 v0.11.0 // indirect
98-
golang.org/x/sync v0.3.0 // indirect
99-
golang.org/x/sys v0.11.0 // indirect
100-
golang.org/x/text v0.12.0 // indirect
90+
go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.45.0 // indirect
91+
go.opentelemetry.io/otel v1.19.0 // indirect
92+
go.opentelemetry.io/otel/metric v1.19.0 // indirect
93+
golang.org/x/crypto v0.14.0 // indirect
94+
golang.org/x/net v0.17.0 // indirect
95+
golang.org/x/oauth2 v0.12.0 // indirect
96+
golang.org/x/sync v0.4.0 // indirect
97+
golang.org/x/sys v0.13.0 // indirect
98+
golang.org/x/text v0.13.0 // indirect
10199
golang.org/x/time v0.3.0 // indirect
102100
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect
103-
google.golang.org/api v0.137.0 // indirect
101+
google.golang.org/api v0.141.0 // indirect
104102
google.golang.org/appengine v1.6.7 // indirect
105-
google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect
106-
google.golang.org/genproto/googleapis/api v0.0.0-20230803162519-f966b187b2e5 // indirect
107-
google.golang.org/genproto/googleapis/rpc v0.0.0-20230807174057-1744710a1577 // indirect
103+
google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d // indirect
104+
google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect
105+
google.golang.org/genproto/googleapis/rpc v0.0.0-20230911183012-2d3300fd4832 // indirect
108106
google.golang.org/protobuf v1.31.0 // indirect
109107
gopkg.in/ini.v1 v1.67.0 // indirect
110108
gopkg.in/yaml.v2 v2.4.0 // indirect

0 commit comments

Comments
 (0)