如题,想搞个这功能,增强failmalloc,不知道能否解决问题,有时间搞下,后续会跟进报道进展~—_—~
Although it's not very efficient and will affect your program's timing, one way is to compile your program with its symbol table (gcc -g ...), call the gcc function __builtin_return_address() as described by Kalyan and then call addr2line externally to decode it. Alternatively, you could probably incorporate the functionality of addr2line directly into your program to provide this natively.
Example:
gcc -g -o print_caller print_caller.c
./print_caller
f1
print_caller.c:28
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
/* print_caller.c */
#include <stdio.h>
void
print_function(void *p) { char cmd[128]; FILE *fp;
snprintf(cmd, sizeof(cmd), "addr2line -e %s -f %p", "print_caller", p); fp = popen(cmd, "r"); if (fp) { char buf[128]; while (fgets(buf, sizeof(buf), fp)) { printf("%s", buf); } } }
void
f2(void) { print_function(__builtin_return_address(0)); }
void
f1(void) { f2(); }
int
main(int argc, char *argv[]) { f1(); return(0); }
|
As far as I think I know, I don't think there is a macro like __FUNCTI