#include #include #include /* idea stolen from ccmalloc */ #define RA(x) case x: return __builtin_return_address(x); static void *return_address(int frame) { switch(frame) { RA(0); RA(1);RA(2);RA(3);RA(4);RA(5);RA(6);RA(7);RA(8);RA(9); RA(10);RA(11);RA(12);RA(13);RA(14);RA(15);RA(16);RA(17);RA(18);RA(19); RA(20);RA(21);RA(22);RA(23);RA(24);RA(25);RA(26);RA(27);RA(28);RA(29); RA(30);RA(31);RA(32);RA(33);RA(34);RA(35);RA(36);RA(37);RA(38);RA(39); RA(40);RA(41);RA(42);RA(43);RA(44);RA(45);RA(46);RA(47);RA(48);RA(49); RA(50);RA(51);RA(52);RA(53);RA(54);RA(55);RA(56);RA(57);RA(58);RA(59); RA(60);RA(61);RA(62);RA(63);RA(64);RA(65);RA(66);RA(67);RA(68);RA(69); RA(70);RA(71);RA(72);RA(73);RA(74);RA(75);RA(76);RA(77);RA(78);RA(79); RA(80);RA(81);RA(82);RA(83);RA(84);RA(85);RA(86);RA(87);RA(88);RA(89); RA(90);RA(91);RA(92);RA(93);RA(94);RA(95);RA(96);RA(97);RA(98);RA(99); default: return NULL; } } void ret3(void) { /* waste all the registers to be doubly sure to kill the frame pointer */ register int i, waste2, waste3; void *t; void *bt[6]; #if 0 for(i=waste2=waste3=0; t = return_address(i); i++, waste2++, waste3++) { fprintf(stderr, "\tcalled from "); backtrace_symbols_fd( (void **)&t, 1, 1); } #endif backtrace(bt, 6); backtrace_symbols_fd(bt, 6, 1); } void ret2() { ret3(); } void ret1() { ret2(); } int main() { ret1(); }