如何利用Tcl的trace命令获取被跟踪过程的完整调用父级链?
获取Tcl过程调用完整调用链解决方案
以下是修改后的完整代码,可在跟踪::C过程时输出目标格式的完整调用链:
proc A {} {B ; return 1} proc B {} {C ; return 1} proc C {} {return 1} proc track {args} { set call_chain [list] set current_level -2 while {1} { # 遍历上层栈帧,直到触及栈顶 if {[catch {info frame $current_level} frame_list]} { break } # 将帧信息转为字典,方便提取字段 set frame_dict [dict create {*}$frame_list] # 仅处理过程调用类型的栈帧 if {[dict get $frame_dict type] eq "proc"} { lappend call_chain "[dict get $frame_dict proc] call" } incr current_level -1 } # 反转列表调整调用顺序,添加被跟踪的::C set call_chain [lreverse $call_chain] lappend call_chain "::C" # 输出目标格式的调用链 puts [join $call_chain " > "] } # 跟踪::C过程的leave事件 trace add execution C leave track # 触发调用链 A
代码说明
- 从
-2层级开始遍历栈帧,跳过track自身的栈帧 - 将
info frame返回的键值对列表转为字典,精准提取过程名称 - 反转收集到的栈帧列表,把调用顺序调整为从外层到内层
- 拼接成目标格式的调用链并输出
内容的提问来源于stack exchange,提问作者Mkn
相关产品推荐
相关产品推荐

