3

背景

我目前正在为这个编写一个 Go 接口。

作为第一步,我试图/test/test_pc.c通过 Go 包装器调用它们来运行测试。重要的是要注意,当由 GCC 编译时,测试是成功的。

重要的附加细节:值得一提的是,目前我已经拥有了我想要在上面运行的所有 C 代码import "C"。原因是relic_test.h不提供函数原型,因此 cgo 无法通过调用来识别函数,例如C.foo(). 因此,我把所有的test_pc.c代码都放在了下面的格式中:

package main
// #include<>
/*
void test1(){}
void test2(){}
.
.
void testN(){}
*/
import "C"
func main(){
  C.test1()
  C.testN()
}

问题

当我尝试从 go 中运行它们时,在一个特定的测试中执行会“卡住”(即代码正在执行中,但它只是简单地没有转到下一条指令)。如何找出代码卡住的原因?如何观察程序的执行流程?

我试过的东西

同样,如果我尝试直接使用 C(即,如果我用 GCC 编译并运行它),代码就可以工作。因此,GDB 也将起作用。我也尝试过使用go tools cgo -debug-gcc,但这只会打印预处理指令。go tools cgo -gccgo不输出任何东西。最后,Go 调试器 Delve 无法调试 C 调用。

4

1 回答 1

2

一些调查显示您唯一的实际选择如下:

  1. 广发银行。Go 程序应该可以很好地与 GDB 一起工作,但 GDB 和 cgo 可能无法相处。我认为这将适用于 *NIX 系统,但 Windows 可能会也可能不会合作。试试看?
  2. printf良好的 ol或其他日志记录的自由应用。

这两个选项都不是很好...

该文档有一个关于 cgo 调试的部分似乎表明它可以正常工作。

于 2017-07-26T16:30:24.650 回答