1d2a6e165SVignesh Balasubramanianimport gdb 2d2a6e165SVignesh Balasubramanianimport os 3d2a6e165SVignesh Balasubramanianimport re 4d2a6e165SVignesh Balasubramanianimport traceback 5d2a6e165SVignesh Balasubramanianimport sys 6d2a6e165SVignesh Balasubramanian 7d2a6e165SVignesh Balasubramanian""" This module evaluates function parameters of those OMPD callbacks that need GDB API calls. 8d2a6e165SVignesh Balasubramanian""" 9d2a6e165SVignesh Balasubramanian 10d2a6e165SVignesh Balasubramanian""" Have the debugger print a string. 11d2a6e165SVignesh Balasubramanian""" 12f98ee40fSTobias Hieta 13f98ee40fSTobias Hieta 14d2a6e165SVignesh Balasubramaniandef _print(*args): 15d2a6e165SVignesh Balasubramanian # args is a tuple with just one string element 16d2a6e165SVignesh Balasubramanian print_string = args[0] 17d2a6e165SVignesh Balasubramanian gdb.execute('printf "%s\n"' % args[0]) 18d2a6e165SVignesh Balasubramanian 19f98ee40fSTobias Hieta 20d2a6e165SVignesh Balasubramanian""" Look up the address of a global symbol in the target. 21d2a6e165SVignesh Balasubramanian""" 22f98ee40fSTobias Hieta 23f98ee40fSTobias Hieta 24d2a6e165SVignesh Balasubramaniandef _sym_addr(*args): 25d2a6e165SVignesh Balasubramanian # args is a tuple consisting of thread_id and symbol_name 26d2a6e165SVignesh Balasubramanian thread_id = args[0] 27d2a6e165SVignesh Balasubramanian symbol_name = args[1] 28f98ee40fSTobias Hieta if thread_id >= 0: 29f98ee40fSTobias Hieta gdb.execute("thread %d\n" % thread_id, to_string=True) 30d2a6e165SVignesh Balasubramanian return int(gdb.parse_and_eval("&" + symbol_name)) 31d2a6e165SVignesh Balasubramanian 32f98ee40fSTobias Hieta 33d2a6e165SVignesh Balasubramanian""" Read string from the target and copy it into the provided buffer. 34d2a6e165SVignesh Balasubramanian""" 35f98ee40fSTobias Hieta 36f98ee40fSTobias Hieta 37d2a6e165SVignesh Balasubramaniandef _read_string(*args): 38d2a6e165SVignesh Balasubramanian # args is a tuple with just the source address 39d2a6e165SVignesh Balasubramanian addr = args[0] 40d2a6e165SVignesh Balasubramanian try: 41f98ee40fSTobias Hieta buf = gdb.parse_and_eval("(unsigned char*)%li" % addr).string() 42d2a6e165SVignesh Balasubramanian except: 43d2a6e165SVignesh Balasubramanian traceback.print_exc() 44d2a6e165SVignesh Balasubramanian return buf 45d2a6e165SVignesh Balasubramanian 46f98ee40fSTobias Hieta 47d2a6e165SVignesh Balasubramanian""" Read memory from the target and copy it into the provided buffer. 48d2a6e165SVignesh Balasubramanian""" 49f98ee40fSTobias Hieta 50f98ee40fSTobias Hieta 51d2a6e165SVignesh Balasubramaniandef _read(*args): 52d2a6e165SVignesh Balasubramanian # args is a tuple consisting of address and number of bytes to be read 53d2a6e165SVignesh Balasubramanian addr = args[0] 54d2a6e165SVignesh Balasubramanian nbytes = args[1] 55d2a6e165SVignesh Balasubramanian # print("_read(%i,%i)"%(addr, nbytes)) 56d2a6e165SVignesh Balasubramanian ret_buf = bytearray() 57d2a6e165SVignesh Balasubramanian # try: 58f98ee40fSTobias Hieta buf = gdb.parse_and_eval("(unsigned char*)%li" % addr) 59d2a6e165SVignesh Balasubramanian for i in range(nbytes): 60d2a6e165SVignesh Balasubramanian ret_buf.append(int(buf[i])) 61d2a6e165SVignesh Balasubramanian # except: 62d2a6e165SVignesh Balasubramanian # traceback.print_exc() 63d2a6e165SVignesh Balasubramanian return ret_buf 64d2a6e165SVignesh Balasubramanian 65d2a6e165SVignesh Balasubramanian 66d2a6e165SVignesh Balasubramanian""" Get thread-specific context. 67d2a6e165SVignesh BalasubramanianReturn -1 if no match is found. 68d2a6e165SVignesh Balasubramanian""" 69f98ee40fSTobias Hieta 70f98ee40fSTobias Hieta 71d2a6e165SVignesh Balasubramaniandef _thread_context(*args): 72d2a6e165SVignesh Balasubramanian # args is a tuple consisting of thread_id and the thread kind 73d2a6e165SVignesh Balasubramanian thread_id = args[1] 74d2a6e165SVignesh Balasubramanian pthread = False 75d2a6e165SVignesh Balasubramanian lwp = False 76d2a6e165SVignesh Balasubramanian if args[0] == 0: 77d2a6e165SVignesh Balasubramanian pthread = True 78d2a6e165SVignesh Balasubramanian else: 79d2a6e165SVignesh Balasubramanian lwp = True 80f98ee40fSTobias Hieta info = gdb.execute("info threads", to_string=True).splitlines() 81d2a6e165SVignesh Balasubramanian 82d2a6e165SVignesh Balasubramanian for line in info: 83d2a6e165SVignesh Balasubramanian if pthread: 84f98ee40fSTobias Hieta m = re.search(r"(0x[a-fA-F0-9]+)", line) 85d2a6e165SVignesh Balasubramanian elif lwp: 86f98ee40fSTobias Hieta m = re.search(r"\([^)]*?(\d+)[^)]*?\)", line) 87*cf00bb00SEisuke Kawashima if m is None: 88d2a6e165SVignesh Balasubramanian continue 89d2a6e165SVignesh Balasubramanian pid = int(m.group(1), 0) 90d2a6e165SVignesh Balasubramanian if pid == thread_id: 91d2a6e165SVignesh Balasubramanian return int(line[2:6], 0) 92d2a6e165SVignesh Balasubramanian return -1 93d2a6e165SVignesh Balasubramanian 94f98ee40fSTobias Hieta 95d2a6e165SVignesh Balasubramanian""" Test info threads / list threads / how to split output to get thread id 96d2a6e165SVignesh Balasubramanianand its size. 97d2a6e165SVignesh Balasubramanian""" 98f98ee40fSTobias Hieta 99f98ee40fSTobias Hieta 100d2a6e165SVignesh Balasubramaniandef _test_threads(*args): 101f98ee40fSTobias Hieta info = gdb.execute("info threads", to_string=True).splitlines() 102d2a6e165SVignesh Balasubramanian for line in info[1:]: 103d2a6e165SVignesh Balasubramanian content = line.split() 104d2a6e165SVignesh Balasubramanian thread_id = None 105d2a6e165SVignesh Balasubramanian # fetch pointer to id 106f98ee40fSTobias Hieta if content[0].startswith("*"): 107f98ee40fSTobias Hieta thread_id = content[3] 108d2a6e165SVignesh Balasubramanian else: 109f98ee40fSTobias Hieta thread_id = content[2] 110d2a6e165SVignesh Balasubramanian sizeof_tid = sys.getsizeof(thread_id) 111d2a6e165SVignesh Balasubramanian print(sizeof_tid) 112d2a6e165SVignesh Balasubramanian print(info) 113