Bug 4809 – Stack trace when throwing exception misses location of the throw statement
Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
druntime
Product
D
Version
D2
Platform
Other
OS
Windows
Creation time
2010-09-04T05:51:00Z
Last change time
2015-06-09T05:11:56Z
Keywords
patch
Assigned to
sean
Creator
r.sagitario
Comments
Comment #0 by r.sagitario — 2010-09-04T05:51:32Z
Under windows, the following code
void func1() {
throw new Exception("msg");
}
void main() {
func1();
}
shows this stack frame (debug info run through cv2pdb) when intercepting throwing exceptions:
kernel32.dll!_RaiseException@16() + 0x52 bytes
test.exe!_d_throw(Object & h={...}) Line 238 C++
> testexe!_Dmain() Line 7 + 0x5 bytes C++
test.exe!rt@dmain2@main@runMain() + 0xb bytes C++
test.exe!rt@dmain2@main@runAll() + 0xe bytes C++
test.exe!main(int argc=1, char * * argv=0x008a03c4) C++
test.exe!_mainCRTStartup() + 0xa9 bytes C++
kernel32.dll!_BaseProcessStart@4() + 0x23 bytes
i.e. it is missing the function actually throwing the exception.
This is caused by _d_throw not having a standard stack frame.
_d_throw is defined in deh.c and should be compiled with forcing standard stack frames using option "-S":
deh.obj : src\rt\deh.c
- $(CC) -c $(CFLAGS) src\rt\deh.c
+ $(CC) -c $(CFLAGS) -S src\rt\deh.c