segfault using _Unwind_ForcedUnwind()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I get a segfault with following app - could you verify this?

platform: i386, linux

gcc -v:
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-linux-gnu/4.6.1/lto-wrapper
Ziel: i686-linux-gnu
Konfiguriert mit: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.1-9ubuntu3' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++,go --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-plugin --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=i686-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu
Thread-Modell: posix
gcc-Version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3)

/lib/i386-linux-gnu/libc-2.13.so
GNU C Library (Ubuntu EGLIBC 2.13-20ubuntu5.1) stable release version 2.13, by Roland McGrath et al.
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.6.1.
Compiled on a Linux 3.0.17 system on 2012-03-07.
Available extensions:
	crypt add-on version 2.1 by Michael Glad and others
	GNU Libidn by Simon Josefsson
	Native POSIX Threads Library by Ulrich Drepper et al
	BIND-8.2.3-T5B
libc ABIs: UNIQUE IFUNC
For bug reporting instructions, please see:
<http://www.debian.org/Bugs/>.


#include <assert.h>
#include <stdint.h>
#include <stdio.h>
#include <ucontext.h>
#include <unwind.h>

#include <cstdlib>
#include <cstring>
#include <iostream>
#include <vector>

static int counter = 0;
static ucontext_t ucf, ucm;

struct X
{
	X()
	{ std::cout << "X()" << std::endl; }

	~X()
	{ std::cout << "~X()" << std::endl; }
};

_Unwind_Reason_Code stop(
		int version,
		_Unwind_Action actions,
		_Unwind_Exception_Class exc_class,
		_Unwind_Exception *exc,
		_Unwind_Context *context,
		void * param) {

//	std::cout << "counter == " << ++counter << std::endl;

	if ( actions & _UA_END_OF_STACK) {
		std::cout << "end of stack, jump back" << std::endl;
		_Unwind_DeleteException( exc);
		if ( ::swapcontext( & ucf, & ucm) == -1)
			::abort();
	}

	return _URC_NO_REASON;
}

void force_unwind()
{
	_Unwind_Exception * exc = new _Unwind_Exception;
	std::memset( exc, 0, sizeof( * exc) );
	_Unwind_ForcedUnwind( exc, stop, 0);
}

void f( int i) {
	if ( i > 0) {
		X x;
		f( --i);
	} else {
		force_unwind();
		std::cout << "fini" << std::endl;
	}
}

int main( int argc, char * argv[]) {
	std::vector< char > buffer(16384, '\0');
	void * fn_stack = & buffer[0];
	fprintf(stdout,"buffer : %p\n", fn_stack);
	fn_stack = ( char * )( ( ( ( ( uintptr_t) fn_stack) - 16) >> 4) << 4);
	fprintf(stdout,"aligned : %p\n", fn_stack);

	if ( ::getcontext( & ucf) == -1)
		::abort();
	ucf.uc_stack.ss_sp = fn_stack;
	ucf.uc_stack.ss_size = buffer.size();
	::makecontext( & ucf, (void(*)())( f), 1, 5);

	if ( ::swapcontext( & ucm, & ucf) == -1)
		::abort();

	std::cout << "done" << std::endl;
	return 0;
}

-- 
Empfehlen Sie GMX DSL Ihren Freunden und Bekannten und wir
belohnen Sie mit bis zu 50,- Euro! https://freundschaftswerbung.gmx.de


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux