Skip to content
| Marketplace
Sign in
Visual Studio Code>Other>CallTraceNew to Visual Studio Code? Get it now.
CallTrace

CallTrace

jianfengye

|
6 installs
| (0) | Free
Analyze function external dependencies for Go projects
Installation
Launch VS Code Quick Open (Ctrl+P), paste the following command, and press enter.
Copied to clipboard
More Info

CallTrace - 函数外部依赖分析插件

功能概述

这个 VS Code 插件可以帮助你分析 Go 函数的外部依赖关系,让你清楚地了解函数调用了哪些外部库和内部函数。

支持的语言

  • ✅ Go 语言:完全支持,解析 go.mod 文件识别外部依赖

主要功能

1. 右键菜单功能

  • 操作步骤:
    1. 将光标置于函数名的任意位置(或选中函数名)
    2. 右键点击,选择"查找函数外部依赖"
    3. 插件会自动识别函数名并分析该函数的依赖关系
  • 智能识别:
    • 光标在函数名任意字母上即可,无需精确选中
    • 支持函数声明、函数调用等多种情况
    • 自动提取有效的函数标识符

2. 递归深度分析 🔄

  • 核心特性:不仅分析选中函数的直接调用,还会递归分析所有内部函数的依赖
  • 工作原理:
    1. 分析选中函数的第一层调用
    2. 对于发现的内部函数,继续深入分析
    3. 重复步骤2,直到所有层级都被分析完毕
    4. 自动去重和防止循环引用

3. 依赖树视图

  • 位置:左侧资源管理器面板中的"函数外部依赖"视图
  • 功能:
    • 📊 分析摘要:显示总体统计信息和依赖来源分布
    • 🌐 外部库依赖:显示所有外部依赖(包括深层发现的)
    • 🏠 内部依赖:显示项目内部的函数调用链
    • 点击依赖项可以跳转到对应的代码位置
    • 支持刷新功能

4. 依赖分类

  • 外部库依赖:来自 go.mod 中定义的第三方依赖的函数调用
  • 内部依赖:项目内部的函数调用
  • 递归依赖:通过多层函数调用间接发现的依赖
  • 标准库过滤:Go 标准库函数(如 fmt.Printf, len, make 等)会被自动过滤,不显示为外部依赖

使用示例

Go 语言示例

假设你有以下 Go 代码:

package main

import (
    "fmt"
    "context"
    "github.com/golang/protobuf/proto"
    "github.com/your-org/project/internal/service"
)

func FetchUserStatusRecord(ctx context.Context, meetingId uint64, taskId string) error {
    proxy := rpb.NewWemeetRecordOidbClientProxy()  // 外部包构造函数
    req := &rpb.RecordFetchUserStatusReq{...}
    
    rsp, err := proxy.FetchUserStatusFromRecord(ctx, req)  // 外部实例方法
    if err != nil {
        log.ErrorContextf(ctx, "FetchUserStatusRecord failed", err)
        return err
    }
    fmt.Printf("Result: %v", rsp)
    return nil
}
  1. 将光标置于函数名 FetchUserStatusRecord 的任意位置
  2. 右键选择"查找函数外部依赖"
  3. 依赖树将显示:
    • 📊 分析摘要: FetchUserStatusRecord
      • 总依赖数: 12
      • 外部依赖: 6
      • 内部依赖: 6
      • 🔗 依赖来源分布:
        • Go 标准库 (3)
        • git.myproject.com/trpcprotocol/wemeet/wemeet_record (2)
        • github.com/golang/protobuf/proto (1)
    • 🌐 外部库依赖 (3)
      • 📦 rpb.NewWemeetRecordOidbClientProxy (来自外部模块)
      • 📦 proxy.FetchUserStatusFromRecord (外部实例方法调用) ⭐ 新功能
      • 📦 proto.String (来自 github.com/golang/protobuf/proto)
      • ~~📦 fmt.Printf (Go 标准库)~~ ❌ 已过滤
      • ~~📦 log.ErrorContextf (Go 标准库)~~ ❌ 已过滤
      • ~~📦 len, make, append~~ ❌ 已过滤
    • 🏠 内部依赖 (6)
      • 🔧 InjectMetaEnv (内部函数)
      • 🔧 trpc.GlobalConfig (内部包调用)
      • ... 更多内部调用

快捷操作

  • 刷新:点击依赖树视图标题栏的刷新按钮
  • 复制为 Markdown:点击依赖树视图标题栏的复制按钮,将分析结果复制为 Markdown 格式到剪贴板
  • 跳转:点击依赖项名称可以跳转到定义位置(如果是内部依赖)

注意事项

  1. 插件主要支持 Go 项目,需要有 go.mod 文件或包含 .go 文件
  2. 分析结果基于静态代码分析,可能不包含动态调用的依赖
  3. Go 标准库函数会被自动过滤,只显示第三方外部依赖

支持的项目类型

  • ✅ Go 项目:有 go.mod 文件的 Go 项目(推荐)
  • ✅ Go 项目(无 go.mod):包含 .go 文件的项目(功能有限)

Go 语言特性

  • 📦 自动解析 go.mod:识别外部依赖库
  • 🔍 智能包识别:区分标准库、第三方库和内部包
  • 🎯 精确函数调用分析:支持 package.Function() 模式
  • 🏗️ 方法支持:支持结构体方法分析
  • 📚 标准库识别:自动识别 Go 标准库函数
  • 🔄 递归深度分析:不仅分析第一层调用,还会递归分析内部函数的依赖
  • 🛡️ 循环检测:自动防止循环引用导致的无限递归
  • 📊 详细统计:提供依赖来源分布、数量统计等详细信息
  • 🎯 变量追踪:智能识别变量赋值,正确分析结构体方法调用
  • 📦 实例方法支持:识别 proxy.Method() 形式的外部实例方法调用
  • 🚫 标准库过滤:自动过滤 Go 标准库函数,只关注真正的外部依赖

故障排除

常见问题

  • 如果无法识别函数名,请确保光标位于有效的函数标识符上
  • 如果分析结果为空,可能是因为:
    • 函数名拼写错误
    • 函数不在当前项目的源文件中
    • 函数没有调用任何其他函数
  • 确保工作区已正确打开并包含 Go 源代码文件

Go 语言问题

  • "未找到 go.mod 文件" - 确保你在 Go 模块的根目录中,或者项目至少包含 .go 文件
  • 函数找不到 - Go 函数名区分大小写,确保光标位于正确的函数名上
  • 依赖识别不准确 - 确保 go.mod 文件是最新的,运行 go mod tidy 更新依赖
  • 标准库函数被过滤 - Go 标准库函数(fmt.Printf, len, make 等)会被自动过滤,只显示真正的第三方外部依赖,这是正常行为

复制的 Markdown 格式示例

# SendTaskStateNotify - 依赖分析结果

## 📊 分析摘要

- **总依赖数**: 14
- **外部依赖**: 14
- **内部依赖**: 0

## 🔗 依赖来源分布

- **git.myproject.com/myproject.com/wemeet/wemeet_record**: 8 个依赖
- **git.myproject.com/myproject.com/trpc-go/log**: 3 个依赖
- **github.com/golang/protobuf/proto**: 3 个依赖

## 🌐 外部库依赖 (14)

### git.myproject.com/myproject.com/wemeet/wemeet_record

- `bizPb.NewWemeetRecordOidbClientProxy` - rpc/rpc_record_notify.go:25
- `proxy.NotifyRecordStatus` - rpc/rpc_record_notify.go:37

### git.myproject.com/myproject.com/myproject.com/log

- `log.InfoContext` - rpc/rpc_record_notify.go:32
- `log.ErrorContext` - rpc/rpc_record_notify.go:58

### github.com/golang/protobuf/proto

- `proto.Uint64` - rpc/rpc_record_notify.go:33
- `proto.Int32` - rpc/rpc_record_notify.go:34
- `proto.String` - rpc/rpc_record_notify.go:28
  • Contact us
  • Jobs
  • Privacy
  • Manage cookies
  • Terms of use
  • Trademarks
© 2025 Microsoft