Danny Backx wrote:
>
> I believe Pedro's remark would be adressed by this new implementation,
> but maybe I've not understood his remark completely.
>
My remark was that cegcc may be used on devices without a screen, or with a
screen turned off. That's how the GNUWINCE toolchain was(/is?) used by
the Voxware folks. Better let the app crash and something else restart it,
than having a message box wait for input that will never happen.
Yes, this implementation addresses my concerns.
> If you want to play with this, use regeditce or a similar tool to add
> HKEY_CURRENT_USER -> cegcc -> debug
>
> If you create this as a string, with value "dialog", then that's what
> will happen. In all other cases, the original functionality (simple
> printf) is currently preserved.
>
> As I said I welcome comments.
>
Comments to the patch below.
>> ------------------------------------------------------------------------
>>
>> Index: startup.c
>> ===================================================================
>> --- startup.c (revision 915)
>> +++ startup.c (working copy)
>> @@ -13,6 +13,10 @@
>> #include "sys/io.h"
>> #include "sys/fixpath.h"
>>
>> +/* Forward declaration */
>> +static wchar_t *_get_registry_debugflag(void);
>> +static int _get_registry_debug(void);
>> +
If possible, move the definitions here, and avoid the
forward declarations.
>> void
>> _start_process(wchar_t *exe, wchar_t *cmd)
>> {
>> @@ -36,24 +40,25 @@
>> DWORD exception;
>> int signal;
>> const char* str;
>> + const wchar_t *wstr;
>> };
>>
>> /* from pocket console */
>> struct exception_map_t __exception_map[] =
>> {
>> - { STATUS_ACCESS_VIOLATION, SIGSEGV, "Access Violation" },
>> - { STATUS_ILLEGAL_INSTRUCTION, SIGILL, "Illegal Instruction"},
>> - { STATUS_PRIVILEGED_INSTRUCTION, SIGILL, "Privileged Instruction" },
>> + { STATUS_ACCESS_VIOLATION, SIGSEGV, "Access Violation", L"Access
>> Violation"},
>> + { STATUS_ILLEGAL_INSTRUCTION, SIGILL, "Illegal Instruction",
>> L"Illegal Instruction"},
>> + { STATUS_PRIVILEGED_INSTRUCTION, SIGILL, "Privileged Instruction",
>> L"Privileged Instruction"},
>> /* { (unsigned long)STATUS_NONCONTINUABLE_EXCEPTION, NOSIG,
>> SIG_DIE }, */
>> /* { (unsigned long)STATUS_INVALID_DISPOSITION, NOSIG,
>> SIG_DIE }, */
>> - { STATUS_INTEGER_DIVIDE_BY_ZERO, SIGFPE, "Integer divide by zero" },
>> - { STATUS_FLOAT_DENORMAL_OPERAND, SIGFPE, "Float denormal operand" },
>> - { STATUS_FLOAT_DIVIDE_BY_ZERO, SIGFPE, "Float divide by zero" },
>> - { STATUS_FLOAT_INEXACT_RESULT, SIGFPE, "Float inexact result" },
>> - { STATUS_FLOAT_INVALID_OPERATION, SIGFPE, "Float invalid operation" },
>> - { STATUS_FLOAT_OVERFLOW, SIGFPE, "Float overflow" },
>> - { STATUS_FLOAT_STACK_CHECK, SIGFPE, "Float stack check" },
>> - { STATUS_FLOAT_UNDERFLOW, SIGFPE, "Float underflow" },
>> + { STATUS_INTEGER_DIVIDE_BY_ZERO, SIGFPE, "Integer divide by zero",
>> L"Integer divide by zero"},
>> + { STATUS_FLOAT_DENORMAL_OPERAND, SIGFPE, "Float denormal operand",
>> L"Float denormal operand"},
>> + { STATUS_FLOAT_DIVIDE_BY_ZERO, SIGFPE, "Float divide by zero",
>> L"Float divide by zero"},
>> + { STATUS_FLOAT_INEXACT_RESULT, SIGFPE, "Float inexact result",
>> L"Float inexact result"},
>> + { STATUS_FLOAT_INVALID_OPERATION, SIGFPE, "Float invalid operation",
>> L"Float invalid operation"},
>> + { STATUS_FLOAT_OVERFLOW, SIGFPE, "Float overflow", L"Float
>> overflow"},
>> + { STATUS_FLOAT_STACK_CHECK, SIGFPE, "Float stack check", L"Float
>> stack check"},
>> + { STATUS_FLOAT_UNDERFLOW, SIGFPE, "Float underflow", L"Float
>> underflow"},
>> /* { (unsigned long)STATUS_INTEGER_DIVIDE_BY_ZERO, NOSIG }, */
>> /* { (unsigned long)STATUS_STACK_OVERFLOW, NOSIG } */
>> };
I would ratter one didn't have to type the same string twice.
Either use a macro like:
#define EXCEPTION_MAP_ENTRY(W, U, T) \
{ W, U, T, L ## T }
struct exception_map_t __exception_map[] =
{
- { STATUS_ACCESS_VIOLATION, SIGSEGV, "Access Violation" },
+ EXCEPTION_MAP_ENTRY(STATUS_ACCESS_VIOLATION, SIGSEGV, "Access Violation"),
... or, perhaps better, simply use use mbstowcs, or similar...
>> @@ -103,6 +108,9 @@
>> {
>> // ### What is this needed for?
>> static int NestedException=0;
>> + wchar_t msg[256];
>> + int unhandled = 0;
>> +
>> if(NestedException)
>> {
>> printf("nested exception\n");
>> @@ -117,22 +125,40 @@
>> DWORD DataAddr;
>>
>> #if 0
>> - printf("Trying to handle EXCEPTION_DATATYPE_MISALIGNMENT Flags:%x
>> Addr:%x "
>> - "SP:%x LR:%x R0:%x R1:%x R2:%x R3:%x R4:%x R5:%x R12:%x FP:%x\n",
>> - ExceptionRecord->ExceptionFlags,
>> - ExceptionRecord->ExceptionAddress,
>> - ContextRecord->Sp,
>> - ContextRecord->Lr,
>> - ContextRecord->R0,
>> - ContextRecord->R1,
>> - ContextRecord->R2,
>> - ContextRecord->R3,
>> - ContextRecord->R4,
>> - ContextRecord->R5,
>> - ContextRecord->R12,
>> - EstablisherFrame
>> - );
>> + if (_get_registry_debug()) {
>> + wsprintf(msg, L"Flags:%x Addr:%x\r\nSP:%x LR:%x R0:%x R1:%x R2:%x
>> R3:%x\r\n"
>> + "R4:%x R5:%x R12:%x FP:%x\n",
>> + ExceptionRecord->ExceptionFlags,
>> + ExceptionRecord->ExceptionAddress,
>> + ContextRecord->Sp,
>> + ContextRecord->Lr,
>> + ContextRecord->R0,
>> + ContextRecord->R1,
>> + ContextRecord->R2,
>> + ContextRecord->R3,
>> + ContextRecord->R4,
>> + ContextRecord->R5,
>> + ContextRecord->R12,
>> + EstablisherFrame);
>> + MessageBoxW(0, msg, L"Datatype Misalignment Exception", 0);
>> + } else
>> #endif
>> + {
>> + printf("Trying to handle EXCEPTION_DATATYPE_MISALIGNMENT Flags:%x
>> Addr:%x "
>> + "SP:%x LR:%x R0:%x R1:%x R2:%x R3:%x R4:%x R5:%x
>> R12:%x FP:%x\n",
>> + ExceptionRecord->ExceptionFlags,
>> + ExceptionRecord->ExceptionAddress,
>> + ContextRecord->Sp,
>> + ContextRecord->Lr,
>> + ContextRecord->R0,
>> + ContextRecord->R1,
>> + ContextRecord->R2,
>> + ContextRecord->R3,
>> + ContextRecord->R4,
>> + ContextRecord->R5,
>> + ContextRecord->R12,
>> + EstablisherFrame);
>> + }
>>
... like using 'msg', on the printf version too. Perhaps you could have
a function that takes care of that? Like:
static void
excp_printf (const char* buf, ...)
{
if (use dialog box)
{
wchar_t wbuf[];
mbstowcs (wbuf, buf, ...);
MessageBoxW (0, wbuf, ...);
}
else
{
printf (...);
}
}
>> + MessageBoxW(0, msg, L"WinCE Exception a", 0);
Was this a left over?
You can commit with those changes.
Thanks,
Cheers,
Pedro Alves
-------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/cegcc-devel