diff options
| author | Rob Pike <r@golang.org> | 2008-09-12 09:44:41 -0700 |
|---|---|---|
| committer | Rob Pike <r@golang.org> | 2008-09-12 09:44:41 -0700 |
| commit | 6e8dbc2051ab5face6278e4056eefd5aea6c329b (patch) | |
| tree | 93eeb9ec4ccb53ef9685d3f689f7fb97c3654050 /src/runtime/rt2_amd64.c | |
| parent | 96b906498abad3eea2d6ea7e401917ec431bef83 (diff) | |
| download | go-6e8dbc2051ab5face6278e4056eefd5aea6c329b.tar.xz | |
- catch trace traps
- disassemble the instructions in a trace trap to see if it's a run-time trap
- if so, print relevant info
- avoid double-printing traceback on panic
R=ken,rsc
DELTA=66 (50 added, 7 deleted, 9 changed)
OCL=15199
CL=15224
Diffstat (limited to 'src/runtime/rt2_amd64.c')
| -rw-r--r-- | src/runtime/rt2_amd64.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/runtime/rt2_amd64.c b/src/runtime/rt2_amd64.c index 91bef54340..2943ac0d36 100644 --- a/src/runtime/rt2_amd64.c +++ b/src/runtime/rt2_amd64.c @@ -86,3 +86,33 @@ traceback(uint8 *pc, uint8 *sp, void* r15) prints(", ...)\n"); } } + +/* + * For trace traps, disassemble instruction to see if it's INTB of known type. + */ +int32 +inlinetrap(int32 sig, byte* pc) +{ + extern void etext(); + extern void _rt0_amd64_darwin(); + + if(sig != 5) /* SIGTRAP */ + return 0; + if(pc-2 < (byte*)_rt0_amd64_darwin || pc >= (byte*)etext) + return 0; + if(pc[-2] != 0xcd) /* INTB */ + return 0; + switch(pc[-1]) { + case 5: + prints("\nTRAP: array out of bounds\n"); + break; + case 6: + prints("\nTRAP: leaving function with returning a value\n"); + break; + default: + prints("\nTRAP: unknown run-time trap "); + sys·printint(pc[-1]); + prints("\n"); + } + return 1; +} |
