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

问题描述:

背景如何调试用cgo调用的C代码?

我目前在写一Go接口为这个library的过程。

作为第一步,我试图在/test/test_pc.c中通过Go包装器调用它们来运行测试。请注意,由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() 
} 

问题

Whenn我尝试从去运行它们,执行被“卡住”(即代码在执行,但它只是简单地不去下一条指令)在一个特定的测试。 如何找出代码卡住的原因?我如何观察程序的执行流程?

件事我已经试过

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

+0

如果你知道如何使用GDB,你不能用它来调试go程序吗?在钻石被认为是可以接受的解决方案之前。我认为甚至会附带一些GDB支持脚本... –

+2

最简单的解决方案通常是'printf'的自由应用程序 – JimB

一些调查显示你的唯一真正的选择如下:

  1. GDB。 Go程序应该和GDB一起工作,但是GDB和cgo可能不会相处。我认为这将适用于* NIX系统,但Windows可能会或可能不会合作。试试看看?
  2. 自由申请好ol printf或其他日志。

这些选项都不是非常好...

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