Hi all,

We've got a sophisticated system which relies heavily on the power of ansistrings. I'm 
now introducing exception handling into the system, and am running into problems with 
the pascal call stack.

Without exception handling, I get a nice pascal stack, such as the following (produced 
by a test program, source below):


Runtime error 200 at $004010A8
  $004010A8  TEST_DIVISION_BY_ZERO,  line 13 of e:/c/test/t.pas
  $00401179  PLAY_WITH_STRINGS,  line 23 of e:/c/test/t.pas
  $004011B1  main,  line 28 of e:/c/test/t.pas


However, if I include the sysutils unit, and catch (and reraise) all exceptions, I get 
the following -- which not only lacks the complete call stack, but includes lots of 
junk:


An unhandled exception occurred at 0x004010A8 :
EDivByZero : Division by zero
  $004010A8  TEST_DIVISION_BY_ZERO,  line 13 of e:/c/test/t.pas
  $666F2033
An unhandled exception occurred at 0x004088FB :
EAccessViolation : Access violation
  $004088FB
  $00406278
  $005CFDA0
  $666F2033
An unhandled exception occurred at 0x004088FB :
EAccessViolation : Access violation
  $004088FB
  $00406278
  $005CFB30
  $00406278
  $005CFDA0
  $666F2033
An unhandled exception occurred at 0x004088FB :
EAccessViolation : Access violation
  $004088FB
  $00406278
  $005CF8C0
  $00406278
  $005CFB30
  $00406278
  $005CFDA0
  $666F2033
An unhandled exception occurred at 0x004088FB :
EAccessViolation : Access violation
  $004088FB
  $00406278
  $005CF650
  $00406278
  $005CF8C0
  $00406278
  $005CFB30
  $00406278
  $005CFDA0
  $666F2033



I noticed in my test program that if I change the ansistring_param to a normal string 
I get the call stack back:


An unhandled exception occurred at 0x00401078 :
EDivByZero : Division by zero
  $00401078  TEST_DIVISION_BY_ZERO,  line 13 of e:/c/test/t.pas
  $004010F3  PLAY_WITH_STRINGS,  line 23 of e:/c/test/t.pas
  $0040116B  main,  line 30 of e:/c/test/t.pas


(compared to the first: notice exception handling is now working, and the third line 
has changed from "main, line 28" to line 30 -- where raise is called, rather than 
where play_with_strings is called)


Here's the test source:


        {$mode objfpc}   // (line 1)

        uses sysutils;

        procedure do_nothing_with_an_ansistring (ansistring_param : string);
           begin   end;

        procedure test_division_by_zero;
           var
              zero : integer;
           begin
              zero := 0;
              write (5 div zero);
           end;

        procedure play_with_strings;
           var
              short_string : string;
           begin
              short_string := 'HELLO';
              if (lowercase(short_string)='hello')
                 then do_nothing_with_an_ansistring (short_string);
              test_division_by_zero;
           end;

        begin
           try
              play_with_strings;   // (line 28)
           except
              on exception do raise;   // (line 30)
              end; // try
        end.



The only change I've made to fpc.cfg is uncommenting the -gl switch.

Perhaps there's another switch that I need to set in order to make ansistrings and 
exceptions work harmoniously?

Thanks,
David




_______________________________________________
fpc-pascal maillist  -  [EMAIL PROTECTED]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to