unhandled C++ exceptions not propagating
David McFarland
corngood@gmail.com
Sun Aug 16 14:17:53 GMT 2020
Takashi Yano <takashi.yano@nifty.ne.jp> writes:
> On Sat, 15 Aug 2020 20:38:01 -0300
> David McFarland via Cygwin <cygwin@cygwin.com> wrote:
>>
>> I was just debugging a c++ app (b2 build system from boost), and noticed
>> that it would appear to exit unexpectedly without an error. This turned
>> out to be when an unhandled C++ exception was thrown.
>>
>> On a fresh install of cygwin with gcc-g++, this program will throw an
>> exception from the std::string constructor:
>>
>> c++ -x c++ - <<END
>> #include <string>
>> int main() { std::string str(nullptr); return 0; }
>> END
>>
>> When it's executed from the shell it returns zero, but execution stops
>> at the exception.
>>
>> $ ./a; echo $?
>> 0
>>
>> When executed under gdb, the exception is caught, and the process exits
>> non-zero when continued:
>>
>> (gdb) r
>> Starting program: /home/corngood/a
>> [New Thread 4300.0x1390]
>> [New Thread 4300.0x1d24]
>> [New Thread 4300.0x1d48]
>> [New Thread 4300.0x80c]
>> gdb: unknown target exception 0x20474343 at 0x7ff8d2cfa799
>> Thread 1 "a" received signal ?, Unknown signal.
>> 0x00007ff8d2cfa799 in RaiseException () from /cygdrive/c/WINDOWS/System32/KERNELBASE.dll
>> (gdb) c
>> Continuing.
>> [Thread 4300.0x1d24 exited with code 541541187]
>> [Thread 4300.0x1870 exited with code 541541187]
>> [Thread 4300.0x1d48 exited with code 541541187]
>> [Thread 4300.0x1390 exited with code 541541187]
>> [Inferior 1 (process 4300) exited with code 04021641503]
>> (gdb)
>>
>> When executed under strace, it exits with an error as expected:
>>
>> $ strace -o /dev/null a; echo $?
>> 67
>>
>> That's as far as I've investigated so far.
>
> Is this the same issue with
> https://cygwin.com/pipermail/cygwin/2019-October/242795.html ?
>
> As far as I tested, this does not occur in 32-bit cygwin.
Yeah, it seems to be. Thanks for tracking that down.
I tried using ProcessMonitor, and when I run the test program from a
shell (where it appears to return 0) I get:
a.exe 7096 Process Exit SUCCESS Exit Status: 541541187, User Time: 0.0000000 seconds, Kernel Time: 0.0000000 seconds, Private Bytes: 4,661,248, Peak Private Bytes: 4,661,248, Working Set: 4,255,744, Peak Working Set: 4,259,840
So the win32 process does appear to be exiting non-zero.
Did you find out anything else when you investigated it? My next step
was going to be digging into why it behaves differently under strace.
More information about the Cygwin
mailing list