Thread overview | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
November 27, 2019 Exceptions on Windows being "swallowed" | ||||
---|---|---|---|---|
| ||||
Trying out exception handling. When an exception occurs, program seems to just exit. dub -a x86_mscoff Performing "debug" build using C:\D\dmd2\windows\bin\dmd.exe for x86, x86_mscoff. x ~master: target for configuration "application" is up to date. To force a rebuild of up-to-date targets, run again with --force. Running .\x.exe Program exited with code -532414463 ------- //from https://dlang.org/spec/statement.html#try-statement import std.stdio; int main(){ try { try { throw new Exception("first"); } finally { writeln("finally"); throw new Exception("second"); } } catch (Exception e) { writeln("catch %s", e.msg); } writeln("done"); return 0; } ----------- |
November 27, 2019 Re: Exceptions on Windows being "swallowed" | ||||
---|---|---|---|---|
| ||||
Posted in reply to cartland | On Wednesday, 27 November 2019 at 02:48:53 UTC, cartland wrote:
> Trying out exception handling. When an exception occurs, program seems to just exit.
>
> dub -a x86_mscoff
I compiled it with dmd and ran it directly from the command line and it worked fine:
C:\dev\D\scratch>ex
finally
catch %sfirst
done
Did you try that? And do you have the MS linker installed or are you using the lld that ships with DMD?
Two things regarding your code:
writeln does no formatting. You want writefln for that. But with writeln, you can provide multiple string arguments and they will be concatenated into the final output, like this:
writeln("catch ", e.msg);
Also, you don't need the `int main` signature if you don't actually need the return value to signify anyting:
void main() { }}
is just fine.
|
November 27, 2019 Re: Exceptions on Windows being "swallowed" | ||||
---|---|---|---|---|
| ||||
Posted in reply to Mike Parker | On Wednesday, 27 November 2019 at 04:11:44 UTC, Mike Parker wrote: > On Wednesday, 27 November 2019 at 02:48:53 UTC, cartland wrote: >> Trying out exception handling. When an exception occurs, program seems to just exit. >> >> dub -a x86_mscoff > > > I compiled it with dmd and ran it directly from the command line and it worked fine: > hmmm! > > Did you try that? And do you have the MS linker installed or are you using the lld that ships with DMD? No MS installed. Just using DMD. ----- dub -a x86_mscoff --force -v : Generating using build Configuring dependent x, deps: Performing "debug" build using C:\D\dmd2\windows\bin\dmd.exe for x86, x86_mscoff. x ~master: building configuration "application"... C:\D\dmd2\windows\bin\dmd.exe -m32mscoff -c -of.dub\build\application-debug-windows-x86.x86_mscoff-dmd_2089-6ACE9C396DEB2C31A239A4E275587962\x.obj -debug -g -w -version=Have_x -Isource source\app.d -vcolumns Linking... C:\D\dmd2\windows\bin\dmd.exe -of.dub\build\application-debug-windows-x86.x86_mscoff-dmd_2089-6ACE9C396DEB2C31A239A4E275587962\x.exe .dub\build\application-debug-windows-x86.x86_mscoff-dmd_2089-6ACE9C396DEB2C31A239A4E275587962\x.obj -m32mscoff -g Copying target from C:\tmp\x\.dub\build\application-debug-windows-x86.x86_mscoff-dmd_2089-6ACE9C396DEB2C31A239A4E275587962\x.exe to C:\tmp\x Running .\x.exe Program exited with code -532414463 -------- > > Two things regarding your code: > Thanks for the advice. It was just a quick cut and paste from the sample code to test. |
November 27, 2019 Re: Exceptions on Windows being "swallowed" | ||||
---|---|---|---|---|
| ||||
Posted in reply to cartland | This works (once I installed Microsoft Visual C++ 2010 x64 Redistributable) : dub --force -v Seems the issue is with "x86_mscoff" -------------- : Performing "debug" build using C:\D\dmd2\windows\bin\dmd.exe for x86_64. x ~master: building configuration "application"... C:\D\dmd2\windows\bin\dmd.exe -m64 -c -of.dub\build\application-debug-windows-x86_64-dmd_2089-1DF706DBEDBB125C8784D2CAFEE4D94A\x.obj -debug -g -w -version=Have_x -Isource source\app.d -vcolumns Linking... C:\D\dmd2\windows\bin\dmd.exe -of.dub\build\application-debug-windows-x86_64-dmd_2089-1DF706DBEDBB125C8784D2CAFEE4D94A\x.exe .dub\build\application-debug-windows-x86_64-dmd_2089-1DF706DBEDBB125C8784D2CAFEE4D94A\x.obj -m64 -g Copying target from C:\tmp\x\.dub\build\application-debug-windows-x86_64-dmd_2089-1DF706DBEDBB125C8784D2CAFEE4D94A\x.exe to C:\tmp\x Running .\x.exe finally catch %sfirst done ------------ |
November 27, 2019 Re: Exceptions on Windows being "swallowed" | ||||
---|---|---|---|---|
| ||||
Posted in reply to cartland | On Wednesday, 27 November 2019 at 05:15:10 UTC, cartland wrote:
>
> No MS installed. Just using DMD.
> -----
> dub -a x86_mscoff --force -v
> :
So please try it without dub
dmd -m32mscoff x.d
If that works, add some debug flags like dub does:
dmd -m32mscoff -debug -g x.d
And see what happens.
|
November 27, 2019 Re: Exceptions on Windows being "swallowed" | ||||
---|---|---|---|---|
| ||||
Posted in reply to Mike Parker | On Wednesday, 27 November 2019 at 05:43:33 UTC, Mike Parker wrote:
> On Wednesday, 27 November 2019 at 05:15:10 UTC, cartland wrote:
> *snip*
>
> dmd -m32mscoff -debug -g x.d
>
> And see what happens.
No difference between "dmd -m32mscoff -debug -g x.d" and "dmd -m32mscoff x.d"
--------
C:\tmp\x>dmd -m32mscoff -debug -g x.d
C:\tmp\x>x
hello
C:\tmp\x>dmd x.d
C:\tmp\x>x
hello
finally
catch first
done
----------
x.d contents
--------
import std.stdio;
void main() {
writeln("hello");
try {
try {
throw new Exception("first");
} finally{
writeln("finally");
throw new Exception("second");
}
} catch (Exception e) {
writeln("catch ", e.msg);
}
writeln("done");
}
-----------
|
November 27, 2019 Re: Exceptions on Windows being "swallowed" | ||||
---|---|---|---|---|
| ||||
Posted in reply to cartland | On 27/11/2019 06:55, cartland wrote: > On Wednesday, 27 November 2019 at 05:43:33 UTC, Mike Parker wrote: >> On Wednesday, 27 November 2019 at 05:15:10 UTC, cartland wrote: *snip* >> >> dmd -m32mscoff -debug -g x.d >> >> And see what happens. > > No difference between "dmd -m32mscoff -debug -g x.d" and "dmd -m32mscoff x.d" > > -------- > C:\tmp\x>dmd -m32mscoff -debug -g x.d > > C:\tmp\x>x > hello > > C:\tmp\x>dmd x.d > > C:\tmp\x>x > hello > finally > catch first > done > ---------- > > x.d contents > -------- > import std.stdio; > void main() { > writeln("hello"); > try { > try { > throw new Exception("first"); > } finally{ > writeln("finally"); > throw new Exception("second"); > } > } catch (Exception e) { > writeln("catch ", e.msg); > } > writeln("done"); > } > ----------- > In a debugger, I get: Unhandled exception at 0x004010EF in x.exe: 0xC00001A5: An invalid exception handler routine has been detected (parameters: 0x00000001). This seems to happen when lld is used instead of the Microsoft linker. Maybe related: https://bugs.llvm.org/show_bug.cgi?id=42221 Using lld from LLVM 9 spits out errors "not compatible with SEH", but links using /SAFESEH:NO. The resulting executable then works. I have created an issue: https://issues.dlang.org/show_bug.cgi?id=20421 |
November 27, 2019 Re: Exceptions on Windows being "swallowed" | ||||
---|---|---|---|---|
| ||||
Posted in reply to cartland | Not sure if related to OP's issue, but quite often on Windows I get mystery crashes with no stack trace, so I typically use WinDbg Preview (modern version of WinDbg) to locate the problem. Seems to work every time. |
Copyright © 1999-2021 by the D Language Foundation