Hi all!
I’m noticing some odd behavior around collecting stack traces. When I call stacktrace()
I get some frames that look like this:
injectable_region : /Users/ashton/.julia/dev/FloatTracker/src/Injector.jl:164
should_inject : ./Base.jl:0
run_should_inject : /Users/ashton/.julia/dev/FloatTracker/test/injector_tests.jl:14
macro expansion (inlined) : /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-macmini-aarch64-4.0/build/default-macmini-aarch64-4-0/julialang/julia-release-1-dot-8/usr/share/julia/stdlib/v1.8/Test/src/Test.jl:464
…
That should_inject
function on line 2 actually lives inside the same Injector.jl
module seen on line 1. Moreover, if I add a println()
before the return, I get this (correct) stack trace:
injectable_region : /Users/ashton/.julia/dev/FloatTracker/src/Injector.jl:155
should_inject : /Users/ashton/.julia/dev/FloatTracker/src/Injector.jl:128
run_should_inject : /Users/ashton/.julia/dev/FloatTracker/test/injector_tests.jl:14
macro expansion (inlined) : /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-macmini-aarch64-4.0/build/default-macmini-aarch64-4-0/julialang/julia-release-1-dot-8/usr/share/julia/stdlib/v1.8/Test/src/Test.jl:464
…
Here’s the should_inject
function:
function should_inject(i::Injector)::Bool
i.place_counter += 1
# Are we replaying a recording?
if i.replay !== ""
go = i.place_counter === i.replay_script[i.replay_head].counter && frame_file(drop_ft_frames(stacktrace())[1]) === i.replay_script[i.replay_head].check
if go
i.replay_head += 1
end
return go
end
if i.active && i.ninject > 0 && rand(1:i.odds) == 1
if i.record !== ""
# We're recording this
did_injectp = injectable_region(i, stacktrace())
if did_injectp
fh = open(i.record, "a")
println(fh, "$(i.place_counter), $(frame_file(drop_ft_frames(stacktrace())[1]))")
close(fh)
end
return did_injectp
else
println("defer to injectable_region") # THIS IS THE CRITICAL PRINTLN CALL
return injectable_region(i, stacktrace())
end
end
println("nope way")
return false
end
For my application, I need a way to check whether or not my call originates from inside the standard library. Right now I’m just looking at the paths on the stack frame’s file
attribute. It’s a bit hacky, but it works well enough for this POC code.
Any help to determine why stacktrace()
gives me different result when print is/isn’t present would be appreciated—or if there’s some other, less-brittle way to tell if your call stack goes through the standard library, that’d be awesome too.