登录
首页 >  Golang >  Go问答

Valgrind Memcheck是否兼容CGo?

来源:stackoverflow

时间:2024-03-18 09:45:29 372浏览 收藏

在使用 Valgrind Memcheck 分析包含 CGo 的 Go 应用程序时,您可能会遇到错误消息。这些消息可能是误报,因为 Go 运行时在技术上没有未定义行为。为了解决此问题,您可以将 CGo 组件构建为可执行文件,然后使用以下命令运行 Valgrind: ``` G_SLICE=always-malloc G_DEBUG=gc-friendly valgrind -v --tool=memcheck --leak-check=full --num-callers=40 --log-file=valgrind.log ./mycgoprog ``` 此命令将生成一个日志文件,其中包含 Valgrind 在链接的 C 代码中检测到的所有不检点行为。

问题内容

我们有一个主要是 go (1.17) 的应用程序,它通过 cgo (gcc 7.5) 对 arm 处理器上的 cuda 进行大量调用。我们偶尔会看到恐慌,看起来像是有什么东西对 c 端的堆做了坏事。我尝试在 valgrind 下运行整个应用程序,但收到太多消息,例如

==14869== Thread 1:
==14869== Invalid read of size 8
==14869==    at 0x4783AC: runtime.startm (proc.go:2508)
==14869==    by 0x47890B: runtime.wakep (proc.go:2584)
==14869==    by 0x47CF8F: runtime.newproc.func1 (proc.go:4261)
==14869==    by 0x4A476B: runtime.systemstack (asm_arm64.s:230)
==14869==    by 0x4A465F: runtime.mstart (asm_arm64.s:117)
==14869==  Address 0x1fff0001a8 is on thread 1's stack
==14869==  8 bytes below stack pointer

查看任何有用的内容。我假设这些都是误报,并且 go 运行时实际上并没有充满未定义的行为。我看不到抑制该检查的标志。我错过了吗?还有其他方法可以调查这个问题吗?我可以用 c++ 编写测试工具,但这会改变使用模式,我怀疑这是问题的关键。


正确答案


我将 cgo 软件构建为可执行文件

go build

它会根据您所在目录的名称生成一个可执行文件。假设它名为“mycgoprog” 然后我使用以下命令对其运行 valgrind:

G_SLICE=always-malloc G_DEBUG=gc-friendly  valgrind -v --tool=memcheck --leak-check=full --num-callers=40 --log-file=valgrind.log ./mycgoprog

然后,valgrind.log 包含 valgrind 在链接的 c 代码中检测到的所有不检点行为。

到这里,我们也就讲完了《Valgrind Memcheck是否兼容CGo?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>