Skip to content

Commit cb38ee8

Browse files
authored
Merge pull request #68 from parca-dev/lj-fixes
LuaJIT improved diagnostics and rsi/esi fix
2 parents bcc1079 + f037bd6 commit cb38ee8

File tree

5 files changed

+32
-16
lines changed

5 files changed

+32
-16
lines changed

interpreter/luajit/extractor_x86.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,8 @@ func sameReg(r1, r2 x86asm.Reg) bool {
510510
return r2 == x86asm.RDX
511511
case x86asm.EBX:
512512
return r2 == x86asm.RBX
513+
case x86asm.ESI:
514+
return r2 == x86asm.RSI
513515
default:
514516
return false
515517
}

interpreter/luajit/luajit.go

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ package luajit // import "go.opentelemetry.io/ebpf-profiler/interpreter/luajit"
1313

1414
import (
1515
"errors"
16-
"fmt"
1716
"path"
1817
"strings"
1918
"sync"
2019
"unsafe"
2120

21+
log "github.com/sirupsen/logrus"
2222
"go.opentelemetry.io/ebpf-profiler/host"
2323
"go.opentelemetry.io/ebpf-profiler/interpreter"
2424
"go.opentelemetry.io/ebpf-profiler/libpf"
@@ -285,6 +285,7 @@ func (l *luajitInstance) processVMs(ebpf interpreter.EbpfHandler, pid libpf.PID)
285285
hash, traces, err := loadTraces(g+libpf.Address(l.g2Traces), l.rm)
286286
if err != nil {
287287
// if g is bad remove it
288+
log.Warnf("LuaJIT instance (%v) deleted: %v", g, err)
288289
badVMs = append(badVMs, g)
289290
continue
290291
}
@@ -301,6 +302,7 @@ func (l *luajitInstance) processVMs(ebpf interpreter.EbpfHandler, pid libpf.PID)
301302
}
302303

303304
newPrefixes := []lpm.Prefix{}
305+
traceLoop:
304306
for i := range traces {
305307
t := traces[i]
306308
// Validate the trace
@@ -310,14 +312,16 @@ func (l *luajitInstance) processVMs(ebpf interpreter.EbpfHandler, pid libpf.PID)
310312
foundRegion = true
311313
end := t.mcode + uint64(t.szmcode)
312314
if end > reg.Vaddr+reg.Length {
313-
return fmt.Errorf("trace %v end goes beyond JIT region", t)
315+
log.Errorf("trace %v end goes beyond JIT region, bad szmcode", t)
316+
continue traceLoop
314317
}
315318
break
316319
}
317320
}
318321

319322
if !foundRegion {
320-
return fmt.Errorf("trace %v not in a JIT region", t)
323+
log.Errorf("trace %v not in a JIT region", t)
324+
continue
321325
}
322326

323327
stackDelta := uint64(t.spadjust) + uint64(cframeSizeJIT)
@@ -329,12 +333,13 @@ func (l *luajitInstance) processVMs(ebpf interpreter.EbpfHandler, pid libpf.PID)
329333
}
330334
p, err := l.addTrace(ebpf, pid, t, uint64(g), stackDelta)
331335
if err != nil {
332-
return err
336+
log.Errorf("Error adding trace(%d): %v", t.traceno, err)
337+
continue
333338
}
334339
newPrefixes = append(newPrefixes, p...)
335340
}
336341

337-
logf("lj: new traces detected pid(%v) added: %d with %d prefixes and removed %d prefixes",
342+
log.Infof("LuaJIT traces for pid(%v) added: %d with %d prefixes and removed %d prefixes",
338343
pid, len(traces), len(newPrefixes), len(prefixes))
339344

340345
l.prefixesByG[g] = newPrefixes
@@ -417,8 +422,11 @@ func (l *luajitInstance) Symbolize(symbolReporter reporter.SymbolReporter, frame
417422
g := libpf.Address(frame.Lineno)
418423
if g != 0 {
419424
unseen := l.addVM(g)
420-
if unseen && l.ebpf.CoredumpTest() {
421-
return interpreter.ErrLJRestart
425+
if unseen {
426+
log.Infof("New LuaJIT instance detected: %v", g)
427+
if l.ebpf.CoredumpTest() {
428+
return interpreter.ErrLJRestart
429+
}
422430
}
423431
}
424432
return nil

interpreter/luajit/offsets_test.go

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -165,15 +165,20 @@ func getLibFromImage(t *testing.T, name, platform, fullPath, target string) {
165165
}
166166

167167
// spot testing
168-
func TestFile(t *testing.T) {
169-
for _, target := range []string{
170-
"./testdata/libluajit-5.1-jammy.so",
171-
"./testdata/luajit-nixos"} {
172-
if _, err := os.Stat(target); os.IsNotExist(err) {
168+
func TestFiles(t *testing.T) {
169+
files, err := os.ReadDir("./testdata")
170+
require.NoError(t, err)
171+
for _, de := range files {
172+
target := "./testdata/" + de.Name()
173+
fi, err := os.Stat(target)
174+
if err != nil || fi.IsDir() {
173175
continue
174176
}
175177
ef, err := pfelf.Open(target)
176-
require.NoError(t, err)
178+
// Skip non-elf files
179+
if err != nil {
180+
continue
181+
}
177182
ljd := luajitData{}
178183

179184
// create stacktrace deltas to make sure we can find interp bounds
@@ -208,7 +213,7 @@ func TestFile(t *testing.T) {
208213
require.Equal(t, uint64(du.Address), du2)
209214
}
210215

211-
t.Logf("%+v, interp: %+v", ljd, interp)
216+
t.Logf("%s: %+v, interp: %+v", target, ljd, interp)
212217
}
213218
}
214219

interpreter/luajit/trace.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ func loadTraces(tracesAddr libpf.Address, rm remotememory.RemoteMemory) (uint64,
9393
if t.traceno > uint16(sztrace) {
9494
return 0, nil, errors.New("invalid traceno")
9595
}
96+
logf("lj: added trace(%d) from %x", t.traceno, tracesAddr)
9697
traces[t.traceno] = t
9798
}
9899
return h, traces, nil

support/types_def.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,6 @@ const (
110110
)
111111

112112
const (
113-
CustomLabelMaxKeyLen = C.CUSTOM_LABEL_MAX_KEY_LEN
114-
CustomLabelMaxValLen = C.CUSTOM_LABEL_MAX_VAL_LEN
113+
CustomLabelMaxKeyLen = C.CUSTOM_LABEL_MAX_KEY_LEN
114+
CustomLabelMaxValLen = C.CUSTOM_LABEL_MAX_VAL_LEN
115115
)

0 commit comments

Comments
 (0)