Вызов функции из dll, созданной cgo, вызывает переполнение стека - PullRequest
0 голосов
/ 20 января 2020

Введение

Я использую программу, которая использует 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

...