如何在朱莉娅回溯中显示呼叫者



有没有办法获取Julia函数调用者的文件/名称/行信息?

我找到了这种方法来获取一些堆栈跟踪信息,如果调用者是另一个函数(但不是主上下文),我会得到 file:line 信息:

module pd
   global g_bTraceOn = true
   export callerOfTraceIt
   function callerOfTraceIt()
     traceit( "hi" ) ;
   end
   function traceit( msg )
      global g_bTraceOn
      if ( g_bTraceOn )
         bt = backtrace() ;
         s = sprint(io->Base.show_backtrace(io, bt))
         println( "debug: $s: $msg" )
      end
   end
end
using pd
callerOfTraceIt( )

这表明:

$ julia bt.jl
debug:
 in traceit at C:cygwin64homePeeterjuliaHarmonicBalancebt.jl:15
 in callerOfTraceIt at C:cygwin64homePeeterjuliaHarmonicBalancebt.jl:8
 in include at boot.jl:245
 in include_from_node1 at loading.jl:128
 in process_options at client.jl:285
 in _start at client.jl:354: hi

我真的很想要第二个帧(traceit() 的调用者),并且如果可用,我也想要函数名称。

如果你在traceit里面做@show bt,你会发现它只是一个指针列表,每个指针对应于一个堆栈帧。那些来自 julia 代码(而不是 C)的堆栈帧由 show_backtrace 显示。

您可以调用Profile.lookup(uint(bt[1]))从每个元素中提取文件/函数/行信息:

julia> Profile.lookup(uint(bt[1]))
LineInfo("rec_backtrace","/home/tim/src/julia-old/usr/bin/../lib/libjulia.so",-1,true,140293228378757)
julia> names(Profile.LineInfo)
5-element Array{Symbol,1}:
 :func 
 :file 
 :line 
 :fromC
 :ip   

您可能希望忽略所有带有 fromC == true 的元素。

最新更新