2017-07-26 713 views
2

背景如何調試用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

回答

0

一些調查顯示你的唯一真正的選擇如下:

  1. GDB。 Go程序應該和GDB一起工作,但是GDB和cgo可能不會相處。我認爲這將適用於* NIX系統,但Windows可能會或可能不會合作。試試看看?
  2. 自由申請好ol printf或其他日誌。

這些選項都不是非常好...

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