1// Copyright 2016 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package main
6
7// This program will crash.
8// We want the stack trace to include the C functions.
9// We use a fake traceback, and a symbolizer that dumps a string we recognize.
10
11/*
12#cgo CFLAGS: -g -O0
13
14// Defined in traceback_c.c.
15extern int crashInGo;
16int tracebackF1(void);
17void cgoTraceback(void* parg);
18void cgoSymbolizer(void* parg);
19*/
20import "C"
21
22import (
23	"runtime"
24	"unsafe"
25)
26
27func init() {
28	register("CrashTraceback", CrashTraceback)
29	register("CrashTracebackGo", CrashTracebackGo)
30}
31
32func CrashTraceback() {
33	runtime.SetCgoTraceback(0, unsafe.Pointer(C.cgoTraceback), nil, unsafe.Pointer(C.cgoSymbolizer))
34	C.tracebackF1()
35}
36
37func CrashTracebackGo() {
38	C.crashInGo = 1
39	CrashTraceback()
40}
41
42//export h1
43func h1() {
44	h2()
45}
46
47func h2() {
48	h3()
49}
50
51func h3() {
52	var x *int
53	*x = 0
54}
55