如何调试使用cgo调用的C代码?

时间:2017-07-26 13:28:00

标签: c debugging go cgo gccgo

背景

我目前正在为此library编写Go界面。

作为第一步,我尝试通过Go包装器调用/test/test_pc.c来运行测试。值得注意的是,GCC编译时测试成功。

重要的其他详细信息:值得一提的是,目前我想要在import "C"之上运行所有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中运行它们时,执行得到了#34;卡住了#34; (即代码正在执行,但它只是在一个特定的测试中没有进入下一条指令)。 如何找出代码被卡住的原因?如何观察程序的执行流程?

我尝试过

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

1 个答案:

答案 0 :(得分:1)

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

  1. GDB。 Go程序应该可以正常使用GDB,但是GDB和cgo可能不会相处。我认为这将适用于* NIX系统,但Windows可能会也可能不会合作。试一下,看看?
  2. 自由应用好的printf或其他伐木。
  3. 这些选项都不是很好......

    This document has a section on cgo debugging似乎表明它运作正常。