| import gdb | |
| import os | |
| import re | |
| import traceback | |
| import sys | |
| """ This module evaluates function parameters of those OMPD callbacks that need GDB API calls. | |
| """ | |
| """ Have the debugger print a string. | |
| """ | |
| def _print(*args): | |
| # args is a tuple with just one string element | |
| print_string = args[0] | |
| gdb.execute('printf "%s\n"' % args[0]) | |
| """ Look up the address of a global symbol in the target. | |
| """ | |
| def _sym_addr(*args): | |
| # args is a tuple consisting of thread_id and symbol_name | |
| thread_id = args[0] | |
| symbol_name = args[1] | |
| if thread_id >= 0: | |
| gdb.execute("thread %d\n" % thread_id, to_string=True) | |
| return int(gdb.parse_and_eval("&" + symbol_name)) | |
| """ Read string from the target and copy it into the provided buffer. | |
| """ | |
| def _read_string(*args): | |
| # args is a tuple with just the source address | |
| addr = args[0] | |
| try: | |
| buf = gdb.parse_and_eval("(unsigned char*)%li" % addr).string() | |
| except: | |
| traceback.print_exc() | |
| return buf | |
| """ Read memory from the target and copy it into the provided buffer. | |
| """ | |
| def _read(*args): | |
| # args is a tuple consisting of address and number of bytes to be read | |
| addr = args[0] | |
| nbytes = args[1] | |
| # print("_read(%i,%i)"%(addr, nbytes)) | |
| ret_buf = bytearray() | |
| # try: | |
| buf = gdb.parse_and_eval("(unsigned char*)%li" % addr) | |
| for i in range(nbytes): | |
| ret_buf.append(int(buf[i])) | |
| # except: | |
| # traceback.print_exc() | |
| return ret_buf | |
| """ Get thread-specific context. | |
| Return -1 if no match is found. | |
| """ | |
| def _thread_context(*args): | |
| # args is a tuple consisting of thread_id and the thread kind | |
| thread_id = args[1] | |
| pthread = False | |
| lwp = False | |
| if args[0] == 0: | |
| pthread = True | |
| else: | |
| lwp = True | |
| info = gdb.execute("info threads", to_string=True).splitlines() | |
| for line in info: | |
| if pthread: | |
| m = re.search(r"(0x[a-fA-F0-9]+)", line) | |
| elif lwp: | |
| m = re.search(r"\([^)]*?(\d+)[^)]*?\)", line) | |
| if m is None: | |
| continue | |
| pid = int(m.group(1), 0) | |
| if pid == thread_id: | |
| return int(line[2:6], 0) | |
| return -1 | |
| """ Test info threads / list threads / how to split output to get thread id | |
| and its size. | |
| """ | |
| def _test_threads(*args): | |
| info = gdb.execute("info threads", to_string=True).splitlines() | |
| for line in info[1:]: | |
| content = line.split() | |
| thread_id = None | |
| # fetch pointer to id | |
| if content[0].startswith("*"): | |
| thread_id = content[3] | |
| else: | |
| thread_id = content[2] | |
| sizeof_tid = sys.getsizeof(thread_id) | |
| print(sizeof_tid) | |
| print(info) |