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):
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):
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):
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):
addr = args[0]
nbytes = args[1]
ret_buf = bytearray()
buf = gdb.parse_and_eval("(unsigned char*)%li" % addr)
for i in range(nbytes):
ret_buf.append(int(buf[i]))
return ret_buf
""" Get thread-specific context.
Return -1 if no match is found.
"""
def _thread_context(*args):
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
if content[0].startswith("*"):
thread_id = content[3]
else:
thread_id = content[2]
sizeof_tid = sys.getsizeof(thread_id)
print(sizeof_tid)
print(info)