如何调试用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调用。
答
一些调查显示你的唯一真正的选择如下:
- GDB。 Go程序应该和GDB一起工作,但是GDB和cgo可能不会相处。我认为这将适用于* NIX系统,但Windows可能会或可能不会合作。试试看看?
- 自由申请好ol
printf
或其他日志。
这些选项都不是非常好...
This document has a section on cgo debugging似乎表明,它工作正常。
如果你知道如何使用GDB,你不能用它来调试go程序吗?在钻石被认为是可以接受的解决方案之前。我认为甚至会附带一些GDB支持脚本... –
最简单的解决方案通常是'printf'的自由应用程序 – JimB