Введение
Я использую программу, которая использует X.dll. Dll имеет экспортированные функции, например, VCI_GetReceiveNum. Для правильной работы он вызывает эту функцию 1000 раз в секунду. Когда я использую X.dll все в порядке. Когда я заменяю исходную dll, написанную в C, на эту в CGO, происходит переполнение стека.
Go экспортированная функция
//export VCI_GetReceiveNum
func VCI_GetReceiveNum(DeviceType int, DeviceInd int, CANind int) int {
protocol.Log.Printf("VCI_GetReceiveNum %p %p %p\n", &DeviceType, &DeviceInd, &CANind)
return 0
}
Исключение переполнения стека
Используя внешнее приложение для мониторинга процессов, можно увидеть, что приложение закрывается с EXCEPTION_STACK_OVERFLOW в функции VCI_GetReceiveNum.
У меня нет исходный код исходного приложения, но вы можете видеть, что cgo не освобождает стек, все новые параметры функции имеют увеличенный адрес.
VCI_GetReceiveNum 0x207c9b5 c 0x207c9b60 0x207c9b64
VCI_GetReceiveNum 0x207c9b6 c 0x207c9b70 0x207c9b74
VCI_GetReceiveNum 0x207c9b7 c 0x207c9b80 0x207c9b84
1036 * есть ли в любом случае * выпуск
1036