diff options
author | Holger Hans Peter Freyther <zecke@selfish.org> | 2009-10-28 09:12:43 +0100 |
---|---|---|
committer | Holger Hans Peter Freyther <zecke@selfish.org> | 2009-11-19 09:40:03 +0100 |
commit | 25f30ba00ae7a5be50724a77bdf7484886726b9b (patch) | |
tree | 415550c118a242f7fad8f7b21bda7144eb3093cd /openbsc | |
parent | a8dffc512b0595d23c11af7e93bc9346ad136bc7 (diff) |
misc: Add routine to generate backtrace from within the application
E.g. to analyze the subscr_get/subscr_put behavior one can place
the generate_backtrace into the functions, recompile and then filter
the output with contrib/bt.py to get the function name, file and line.
Diffstat (limited to 'openbsc')
-rwxr-xr-x | openbsc/contrib/bt.py | 33 | ||||
-rw-r--r-- | openbsc/include/openbsc/gsm_utils.h | 2 | ||||
-rw-r--r-- | openbsc/src/gsm_utils.c | 19 |
3 files changed, 54 insertions, 0 deletions
diff --git a/openbsc/contrib/bt.py b/openbsc/contrib/bt.py new file mode 100755 index 000000000..1b111efc8 --- /dev/null +++ b/openbsc/contrib/bt.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python + +import os + +f = open("unbalanced") +lines = [] +for line in f: + lines.append(line) + +filenames = {} + +output = [] +for line in lines: + if "[0x" in line: + start = line.find("[") + end = line.find("]") + addr = line[start+1:end] + try: + file = filenames[addr] + except KeyError: + r = os.popen("addr2line -fs -e ./bsc_hack %s" % addr) + all = r.read().replace("\n", ",") + file = all + filenames[addr] = file + + line = line.replace(addr, file) + output.append(line) + +g = open("unbalanced.2", "w") +g.write("".join(output)) + + + diff --git a/openbsc/include/openbsc/gsm_utils.h b/openbsc/include/openbsc/gsm_utils.h index 7cd0578ad..1bd1bc55a 100644 --- a/openbsc/include/openbsc/gsm_utils.h +++ b/openbsc/include/openbsc/gsm_utils.h @@ -32,4 +32,6 @@ int gsm_7bit_encode(u_int8_t *result, const char *data); int ms_pwr_ctl_lvl(enum gsm_band band, unsigned int dbm); int ms_pwr_dbm(enum gsm_band band, u_int8_t lvl); + +void generate_backtrace(); #endif diff --git a/openbsc/src/gsm_utils.c b/openbsc/src/gsm_utils.c index de18dba26..ddfd7f3de 100644 --- a/openbsc/src/gsm_utils.c +++ b/openbsc/src/gsm_utils.c @@ -23,8 +23,10 @@ #include <openbsc/gsm_data.h> #include <openbsc/gsm_utils.h> +#include <execinfo.h> #include <stdlib.h> #include <string.h> +#include <stdio.h> #include <errno.h> /* GSM 03.38 6.2.1 Charachter packing */ @@ -148,4 +150,21 @@ int ms_pwr_dbm(enum gsm_band band, u_int8_t lvl) return -EINVAL; } +void generate_backtrace() +{ + int i, nptrs; + void *buffer[100]; + char **strings; + + nptrs = backtrace(buffer, ARRAY_SIZE(buffer)); + printf("backtrace() returned %d addresses\n", nptrs); + + strings = backtrace_symbols(buffer, nptrs); + if (!strings) + return; + for (i = 1; i < nptrs; i++) + printf("%s\n", strings[i]); + + free(strings); +} |