aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/rt2_amd64.c
diff options
context:
space:
mode:
authorRob Pike <r@golang.org>2008-09-12 09:44:41 -0700
committerRob Pike <r@golang.org>2008-09-12 09:44:41 -0700
commit6e8dbc2051ab5face6278e4056eefd5aea6c329b (patch)
tree93eeb9ec4ccb53ef9685d3f689f7fb97c3654050 /src/runtime/rt2_amd64.c
parent96b906498abad3eea2d6ea7e401917ec431bef83 (diff)
downloadgo-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.c30
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;
+}