On Sun, 2007-07-01 at 09:41 -0400, Kevin O'Connor wrote:
> On Fri, Jun 22, 2007 at 09:37:21PM +0200, Danny Backx wrote:
> > The null.C example however - when used with my exception handling code -
> > shows a dialog from my new exception handler, but never makes its way to
> > the C++ exception handler.
> 
> Have you figured out a way to raise a c++ exception from the wince
> handler?

Actually I was just getting there minutes ago.

> > Running the null.C program on Linux creates a coredump too, no exception
> > handler is called.
> 
> Invalid memory accesses don't cause exceptions under Linux.
> 
> Also, it appears gcc may optimize out c++ exception handlers if it
> doesn't think the code can create an exception.  It thinks it is
> running under a linux like environment and the optimizer wont even try
> to handle memory raised exceptions.
> 
> > I assumed that the goal is to have the system level exception (from use
> > of a null pointer) be caught by the C++ exception handler. Am I wrong ?
> 
> That is certainly what I'd like to see.  :-)

Ok, attached is the source of my current test program. Comments most
welcome. You'll understand that this is just a proof of concept.

I've put the executable file on
 http://danny.backx.info/download/throw.exe.gz

so the E-mail isn't too big.

You cannot compile this yet, it relies on unpublished stuff.

Let me know what you think.

        Danny
-- 
Danny Backx ; danny.backx - at - scarlet.be ; http://danny.backx.info
#include <iostream>

using namespace std;

extern "C" {
// typedef void (*handler)(void);
typedef void (*handler) (struct _EXCEPTION_RECORD *ExceptionRecord,
		void *EstablisherFrame,
		struct _CONTEXT *ContextRecord,
		struct _DISPATCHER_CONTEXT *DispatcherContext);

void CegccSetExceptionHandler(handler new_handler);
};

#ifdef	UNDER_CE
#include <windows.h>
#define	Message(title, msg)	MessageBoxW(0, L##title, L##msg, 0)
#else
#define	Message(title, msg)	cout << title << " : " << msg << endl
#endif

class WindowsException {
	struct _EXCEPTION_RECORD *ExceptionRecord;
	void *EstablisherFrame;
	struct _CONTEXT *ContextRecord;
	struct _DISPATCHER_CONTEXT *DispatcherContext;
public:
	WindowsException(struct _EXCEPTION_RECORD *ExceptionRecord,
			void *EstablisherFrame,
			struct _CONTEXT *ContextRecord,
			struct _DISPATCHER_CONTEXT *DispatcherContext);
	WindowsException();
};

class AccessViolation : public WindowsException {
};

WindowsException::WindowsException(struct _EXCEPTION_RECORD *ExceptionRecord,
				 void *EstablisherFrame,
				 struct _CONTEXT *ContextRecord,
				 struct _DISPATCHER_CONTEXT *DispatcherContext)
{
	this->ExceptionRecord = ExceptionRecord;
	this->EstablisherFrame = EstablisherFrame;
	this->ContextRecord = ContextRecord;
	this->DispatcherContext = DispatcherContext;

	static char	msg[512];
	static wchar_t	wmsg[512];

	snprintf(msg, sizeof(msg), "WindowsException(%p, %p, %p, %p)\r\n"
			"Code %x Flags %p Address %p",
			ExceptionRecord, EstablisherFrame, ContextRecord, DispatcherContext,
			ExceptionRecord->ExceptionCode,
			ExceptionRecord->ExceptionFlags,
			ExceptionRecord->ExceptionAddress);
	mbstowcs(wmsg, msg, strlen(msg)+1);
	MessageBoxW(0, wmsg, L"WindowsException", 0);
	exit(0);
}

int	i, *p;

void Handle(struct _EXCEPTION_RECORD *ExceptionRecord,
		void *EstablisherFrame,
		struct _CONTEXT *ContextRecord,
		struct _DISPATCHER_CONTEXT *DispatcherContext)
{
	throw WindowsException(ExceptionRecord, EstablisherFrame, ContextRecord, DispatcherContext);
}

main()
{
	CegccSetExceptionHandler(Handle);

	p = 0;
	*p = 123;	/* Crash */
	Message("Main", "got to the end");
}

Attachment: signature.asc
Description: This is a digitally signed message part

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Cegcc-devel mailing list
Cegcc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/cegcc-devel

Reply via email to