Golang неверный адрес памяти вызывает сбой приложения do tnet - PullRequest
0 голосов
/ 28 мая 2020

Я запускаю код go из приложения do tnet и возился с defer в go (я пытаюсь вызвать различные типы сбоев). У меня есть один случай, неверный доступ к памяти, когда pani c фактически вылетает из всего приложения do tnet (на Windows 10 не на Linux). Не могу понять, упускаю ли я что-то.

Примечание: если я принудительно использую «целочисленное деление на ноль» или «pani c ()», оно не треснет sh do tnet application.

Приведенные ниже примеры выполняются в Windows 10:

package main
import "C"
import "fmt"

type HelloFunc func(string)
//export Hello
func Hello() {
    defer func() {
        fmt.Println("defer start")
        if r := recover(); r != nil {
            fmt.Println("hello from the deferred function!")
        }
        fmt.Println("defer end")
    }()

    fmt.Println("Hello")
    var hf HelloFunc
    hf("world")
    fmt.Println("don't print me")
}

func main() {
    Hello()
}

Сборка DLL (кросс-компиляция в системе Linux)

env GOOS=windows GOARCH=amd64 CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc CXX=x86_64-w64-mingw32-g++ go build -o test.dll -i -v -buildmode=c-shared test.go
using System;
using System.Runtime.InteropServices;

namespace native_lib
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("-->> 1");
            try {
                GoFunctions.Hello();
            } catch (Exception e) {
                Console.WriteLine($"-->> {e}");
            } finally {
                Console.WriteLine("-->> 2");
            }
        }
    }
}
static class GoFunctions
{
    [DllImport("./test.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
    public static extern void Hello();
}

Вывод:

> dotnet run
-->> 1
Hello
> echo $?
False
...