有没有一种方法可以确定在编译过程中从go模块调用了哪些函数?

时间:2019-05-10 09:27:18

标签: amazon-web-services go go-modules

我正在使用Go编写许多AWS Lambda函数。常用功能分为模块,例如,我有一个模块(M1),该模块根据DynamoDB提供与后备存储的接口实现(因此依赖于AWS​​ Go SDK)。

在一个Lambda函数(F1)中,我导入M1,因此代码路径的依赖关系图如下所示:

F1 -> M1 -> SDK -> dynamodb.DynamoDB.PutItem

要成为AWS,我需要编写相应的IAM策略以允许F1执行PutItem

此刻,我将手动识别AWS开发工具包调用,并修复CloudWatch中记录的所有错误。

我的目标是确定是否有一种方法可以获取Go工具链,以识别从给定模块/导入中调用了哪些函数。

到目前为止,我可以尝试以下几种方法:

# this doesn't return much as most of my code lives within directories
# under main
go mod why "github.com/aws/aws-sdk-go"
# github.com/aws/aws-sdk-go
(main module does not need package github.com/aws/aws-sdk-go)

# this only identifies a single F1 {-> ...} -> SDK invocation
# but not all of them
grep -r github.com/aws/aws-sdk-go --include="*.go" \
  | cut -f2 -d'"' \
  | sort -u \
  | xargs go mod why

我还没有介绍go buildgo mod why的源代码,但是到目前为止,我还没有找到说服“为什么要去理解”简单的glob扩展/正则表达式以及相应的调用点。在二阶部门(即M1-> SDK)上,我也没有取得任何进展。

1 个答案:

答案 0 :(得分:2)

go mod graph将为您提供依赖关系图,但这不会告诉您正在调用什么函数。这不在依赖管理的范围内,依赖管理在模块级别运行。要查看正在调用的函数,您需要通过AST解析源代码,或者使用例如pprof