...
Run Format

Source file src/runtime/testdata/testprogcgo/traceback.go

Documentation: runtime/testdata/testprogcgo

  // Copyright 2016 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.
  
  package main
  
  // This program will crash.
  // We want the stack trace to include the C functions.
  // We use a fake traceback, and a symbolizer that dumps a string we recognize.
  
  /*
  #cgo CFLAGS: -g -O0
  
  #include <stdint.h>
  
  char *p;
  
  static int f3(void) {
  	*p = 0;
  	return 0;
  }
  
  static int f2(void) {
  	return f3();
  }
  
  static int f1(void) {
  	return f2();
  }
  
  struct cgoTracebackArg {
  	uintptr_t  context;
  	uintptr_t  sigContext;
  	uintptr_t* buf;
  	uintptr_t  max;
  };
  
  struct cgoSymbolizerArg {
  	uintptr_t   pc;
  	const char* file;
  	uintptr_t   lineno;
  	const char* func;
  	uintptr_t   entry;
  	uintptr_t   more;
  	uintptr_t   data;
  };
  
  void cgoTraceback(void* parg) {
  	struct cgoTracebackArg* arg = (struct cgoTracebackArg*)(parg);
  	arg->buf[0] = 1;
  	arg->buf[1] = 2;
  	arg->buf[2] = 3;
  	arg->buf[3] = 0;
  }
  
  void cgoSymbolizer(void* parg) {
  	struct cgoSymbolizerArg* arg = (struct cgoSymbolizerArg*)(parg);
  	if (arg->pc != arg->data + 1) {
  		arg->file = "unexpected data";
  	} else {
  		arg->file = "cgo symbolizer";
  	}
  	arg->lineno = arg->data + 1;
  	arg->data++;
  }
  */
  import "C"
  
  import (
  	"runtime"
  	"unsafe"
  )
  
  func init() {
  	register("CrashTraceback", CrashTraceback)
  }
  
  func CrashTraceback() {
  	runtime.SetCgoTraceback(0, unsafe.Pointer(C.cgoTraceback), nil, unsafe.Pointer(C.cgoSymbolizer))
  	C.f1()
  }
  

View as plain text