From dc032abffb530f52695f7f27b13e462db8ce5d71 Mon Sep 17 00:00:00 2001 From: doujiang24 Date: Wed, 17 Aug 2022 10:41:26 +0800 Subject: [PATCH 1/2] wip: test: added cgo trace parse test, should be passed in on platforms. just a test for #54458 --- src/runtime/crash_cgo_test.go | 12 +++++ src/runtime/testdata/testprogcgo/cgotrace.go | 53 ++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 src/runtime/testdata/testprogcgo/cgotrace.go diff --git a/src/runtime/crash_cgo_test.go b/src/runtime/crash_cgo_test.go index 5e5871229729ef..f44032156117b9 100644 --- a/src/runtime/crash_cgo_test.go +++ b/src/runtime/crash_cgo_test.go @@ -710,3 +710,15 @@ func TestCgoTracebackGoroutineProfile(t *testing.T) { t.Fatalf("want %s, got %s\n", want, output) } } + +func TestCgoTraceParser(t *testing.T) { + switch runtime.GOOS { + case "windows", "plan9": + t.Skipf("skipping cgo trace parser test on %s", runtime.GOOS) + } + output := runTestProg(t, "testprogcgo", "CgoTraceParser") + want := "OK\n" + if output != want { + t.Fatalf("want %s, got %s\n", want, output) + } +} diff --git a/src/runtime/testdata/testprogcgo/cgotrace.go b/src/runtime/testdata/testprogcgo/cgotrace.go new file mode 100644 index 00000000000000..fb0d95f76f6c4e --- /dev/null +++ b/src/runtime/testdata/testprogcgo/cgotrace.go @@ -0,0 +1,53 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This is for issue #29707 + +package main + +/* + #include + + extern void* callback(void*); + typedef void* (*cb)(void*); + + static void testCallback(cb cb) { + cb(NULL); + } +*/ +import "C" + +import ( + "bytes" + "fmt" + traceparser "internal/trace" + "runtime/trace" + "time" + "unsafe" +) + +func init() { + register("CgoTraceParser", CgoTraceParser) +} + +//export callback +func callback(unsafe.Pointer) unsafe.Pointer { + time.Sleep(time.Millisecond) + return nil +} + +func CgoTraceParser() { + buf := new(bytes.Buffer) + + trace.Start(buf) + C.testCallback(C.cb(C.callback)) + trace.Stop() + + _, err := traceparser.Parse(buf, "") + if err != nil { + fmt.Println("Parse error: ", err) + } else { + fmt.Println("OK") + } +} From f43bcd9b7f04d244769003e590b9ea67f45619c3 Mon Sep 17 00:00:00 2001 From: doujiang24 Date: Wed, 17 Aug 2022 13:54:09 +0800 Subject: [PATCH 2/2] added the TraceParser suffix, to avoid conflict. --- src/runtime/testdata/testprogcgo/cgotrace.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/runtime/testdata/testprogcgo/cgotrace.go b/src/runtime/testdata/testprogcgo/cgotrace.go index fb0d95f76f6c4e..685ff565a36305 100644 --- a/src/runtime/testdata/testprogcgo/cgotrace.go +++ b/src/runtime/testdata/testprogcgo/cgotrace.go @@ -9,10 +9,10 @@ package main /* #include - extern void* callback(void*); - typedef void* (*cb)(void*); + extern void* callbackTraceParser(void*); + typedef void* (*cbTraceParser)(void*); - static void testCallback(cb cb) { + static void testCallbackTraceParser(cbTraceParser cb) { cb(NULL); } */ @@ -31,8 +31,8 @@ func init() { register("CgoTraceParser", CgoTraceParser) } -//export callback -func callback(unsafe.Pointer) unsafe.Pointer { +//export callbackTraceParser +func callbackTraceParser(unsafe.Pointer) unsafe.Pointer { time.Sleep(time.Millisecond) return nil } @@ -41,7 +41,7 @@ func CgoTraceParser() { buf := new(bytes.Buffer) trace.Start(buf) - C.testCallback(C.cb(C.callback)) + C.testCallbackTraceParser(C.cbTraceParser(C.callbackTraceParser)) trace.Stop() _, err := traceparser.Parse(buf, "")