Changeset 1196:6c31351af0c5
- Timestamp:
- 04/05/09 09:02:44
(3 years ago)
- Author:
- Christian Kamm <kamm incasoftware de>
- branch:
- default
- Message:
Apply fawzi's stacktracing update from #254.
-
Files:
-
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
| r1130 |
r1196 |
|
| 47 | 47 | import util.string; |
|---|
| 48 | 48 | import tango.stdc.stdio; // : printf, snprintf; |
|---|
| | 49 | import tango.core.Version; |
|---|
| 49 | 50 | |
|---|
| 50 | 51 | extern (C) void onOutOfMemoryError(); |
|---|
| … | … | |
| 906 | 907 | class Exception : Object |
|---|
| 907 | 908 | { |
|---|
| 908 | | struct FrameInfo{ |
|---|
| 909 | | long line; |
|---|
| 910 | | ptrdiff_t iframe; |
|---|
| 911 | | ptrdiff_t offset; |
|---|
| 912 | | size_t address; |
|---|
| 913 | | char[] file; |
|---|
| 914 | | char[] func; |
|---|
| 915 | | char[256] charBuf; |
|---|
| 916 | | void writeOut(void delegate(char[])sink){ |
|---|
| 917 | | char[25] buf; |
|---|
| 918 | | sink(func); |
|---|
| 919 | | auto len = snprintf(buf.ptr,buf.length,"@%zx ",address); |
|---|
| 920 | | sink(buf[0..len]); |
|---|
| 921 | | len = snprintf(buf.ptr,buf.length," %+td ",address); |
|---|
| 922 | | sink(buf[0..len]); |
|---|
| 923 | | if (file.length != 0 || line) { |
|---|
| | 909 | static if (Tango.Minor > 998) { |
|---|
| | 910 | struct FrameInfo{ |
|---|
| | 911 | long line; |
|---|
| | 912 | size_t iframe; |
|---|
| | 913 | ptrdiff_t offsetSymb; |
|---|
| | 914 | size_t baseSymb; |
|---|
| | 915 | ptrdiff_t offsetImg; |
|---|
| | 916 | size_t baseImg; |
|---|
| | 917 | size_t address; |
|---|
| | 918 | char[] file; |
|---|
| | 919 | char[] func; |
|---|
| | 920 | char[] extra; |
|---|
| | 921 | bool exactAddress; |
|---|
| | 922 | bool internalFunction; |
|---|
| | 923 | void writeOut(void delegate(char[])sink){ |
|---|
| | 924 | char[25] buf; |
|---|
| | 925 | if (func.length) { |
|---|
| | 926 | sink(func); |
|---|
| | 927 | } else { |
|---|
| | 928 | sink("???"); |
|---|
| | 929 | } |
|---|
| | 930 | auto len=sprintf(buf.ptr,"@%zx",baseSymb); |
|---|
| | 931 | sink(buf[0..len]); |
|---|
| | 932 | len=sprintf(buf.ptr,"%+td ",offsetSymb); |
|---|
| | 933 | sink(buf[0..len]); |
|---|
| | 934 | if (extra.length){ |
|---|
| | 935 | sink(extra); |
|---|
| | 936 | sink(" "); |
|---|
| | 937 | } |
|---|
| 924 | 938 | sink(file); |
|---|
| 925 | | len = snprintf(buf.ptr,buf.length,":%ld",line); |
|---|
| | 939 | len=sprintf(buf.ptr,":%ld ",line); |
|---|
| | 940 | sink(buf[0..len]); |
|---|
| | 941 | len=sprintf(buf.ptr,"%zx",baseImg); |
|---|
| | 942 | sink(buf[0..len]); |
|---|
| | 943 | len=sprintf(buf.ptr,"%+td ",offsetImg); |
|---|
| | 944 | sink(buf[0..len]); |
|---|
| | 945 | len=sprintf(buf.ptr,"[%zx]",address); |
|---|
| 926 | 946 | sink(buf[0..len]); |
|---|
| 927 | 947 | } |
|---|
| 928 | | } |
|---|
| 929 | | } |
|---|
| 930 | | interface TraceInfo |
|---|
| 931 | | { |
|---|
| 932 | | int opApply( int delegate( ref FrameInfo fInfo ) ); |
|---|
| | 948 | void clear(){ |
|---|
| | 949 | line=0; |
|---|
| | 950 | iframe=-1; |
|---|
| | 951 | offsetImg=0; |
|---|
| | 952 | baseImg=0; |
|---|
| | 953 | offsetSymb=0; |
|---|
| | 954 | baseSymb=0; |
|---|
| | 955 | address=0; |
|---|
| | 956 | exactAddress=true; |
|---|
| | 957 | internalFunction=false; |
|---|
| | 958 | file=null; |
|---|
| | 959 | func=null; |
|---|
| | 960 | extra=null; |
|---|
| | 961 | } |
|---|
| | 962 | } |
|---|
| | 963 | interface TraceInfo |
|---|
| | 964 | { |
|---|
| | 965 | int opApply( int delegate( ref FrameInfo fInfo ) ); |
|---|
| | 966 | void writeOut(void delegate(char[])sink); |
|---|
| | 967 | } |
|---|
| | 968 | } else static if (Tango.Minor == 998) { |
|---|
| | 969 | struct FrameInfo{ |
|---|
| | 970 | long line; |
|---|
| | 971 | ptrdiff_t iframe; |
|---|
| | 972 | ptrdiff_t offset; |
|---|
| | 973 | size_t address; |
|---|
| | 974 | char[] file; |
|---|
| | 975 | char[] func; |
|---|
| | 976 | char[256] charBuf; |
|---|
| | 977 | void writeOut(void delegate(char[])sink){ |
|---|
| | 978 | char[25] buf; |
|---|
| | 979 | sink(func); |
|---|
| | 980 | auto len = snprintf(buf.ptr,buf.length,"@%zx ",address); |
|---|
| | 981 | sink(buf[0..len]); |
|---|
| | 982 | len = snprintf(buf.ptr,buf.length," %+td ",address); |
|---|
| | 983 | sink(buf[0..len]); |
|---|
| | 984 | if (file.length != 0 || line) { |
|---|
| | 985 | sink(file); |
|---|
| | 986 | len = snprintf(buf.ptr,buf.length,":%ld",line); |
|---|
| | 987 | sink(buf[0..len]); |
|---|
| | 988 | } |
|---|
| | 989 | } |
|---|
| | 990 | } |
|---|
| | 991 | interface TraceInfo |
|---|
| | 992 | { |
|---|
| | 993 | int opApply( int delegate( ref FrameInfo fInfo ) ); |
|---|
| | 994 | } |
|---|
| | 995 | } else { |
|---|
| | 996 | static assert(0, "Don't know FrameInfo, TraceInfo definition for Tango < 0.99.8"); |
|---|
| 933 | 997 | } |
|---|
| 934 | 998 | |
|---|