github.com/zebozhuang/go@v0.0.0-20200207033046-f8a98f6f5c5d/src/runtime/testdata/testprogcgo/traceback.go (about)

     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  
     5  package 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  #include <stdint.h>
    15  
    16  char *p;
    17  
    18  static int f3(void) {
    19  	*p = 0;
    20  	return 0;
    21  }
    22  
    23  static int f2(void) {
    24  	return f3();
    25  }
    26  
    27  static int f1(void) {
    28  	return f2();
    29  }
    30  
    31  struct cgoTracebackArg {
    32  	uintptr_t  context;
    33  	uintptr_t  sigContext;
    34  	uintptr_t* buf;
    35  	uintptr_t  max;
    36  };
    37  
    38  struct cgoSymbolizerArg {
    39  	uintptr_t   pc;
    40  	const char* file;
    41  	uintptr_t   lineno;
    42  	const char* func;
    43  	uintptr_t   entry;
    44  	uintptr_t   more;
    45  	uintptr_t   data;
    46  };
    47  
    48  void cgoTraceback(void* parg) {
    49  	struct cgoTracebackArg* arg = (struct cgoTracebackArg*)(parg);
    50  	arg->buf[0] = 1;
    51  	arg->buf[1] = 2;
    52  	arg->buf[2] = 3;
    53  	arg->buf[3] = 0;
    54  }
    55  
    56  void cgoSymbolizer(void* parg) {
    57  	struct cgoSymbolizerArg* arg = (struct cgoSymbolizerArg*)(parg);
    58  	if (arg->pc != arg->data + 1) {
    59  		arg->file = "unexpected data";
    60  	} else {
    61  		arg->file = "cgo symbolizer";
    62  	}
    63  	arg->lineno = arg->data + 1;
    64  	arg->data++;
    65  }
    66  */
    67  import "C"
    68  
    69  import (
    70  	"runtime"
    71  	"unsafe"
    72  )
    73  
    74  func init() {
    75  	register("CrashTraceback", CrashTraceback)
    76  }
    77  
    78  func CrashTraceback() {
    79  	runtime.SetCgoTraceback(0, unsafe.Pointer(C.cgoTraceback), nil, unsafe.Pointer(C.cgoSymbolizer))
    80  	C.f1()
    81  }