This patch adds a new dexter command, DexDeclareAddress, which is used to test the relative values of pointer variables. The motivation for adding this command is to allow meaningful assertions to be made about pointers that go beyond checking variable availability and null equality. The full explanation and syntax is in Commands.md. Reviewed By: Orlando Differential Revision: https://reviews.llvm.org/D111447
59 lines
1.9 KiB
Python
59 lines
1.9 KiB
Python
# DExTer : Debugging Experience Tester
|
|
# ~~~~~~ ~ ~~ ~ ~~
|
|
#
|
|
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
# See https://llvm.org/LICENSE.txt for license information.
|
|
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
"""Commmand sets the path for all following commands to 'declared_file'.
|
|
"""
|
|
|
|
import os
|
|
|
|
from dex.command.CommandBase import CommandBase, StepExpectInfo
|
|
|
|
class DexDeclareAddress(CommandBase):
|
|
def __init__(self, addr_name, expression, **kwargs):
|
|
|
|
if not isinstance(addr_name, str):
|
|
raise TypeError('invalid argument type')
|
|
|
|
self.addr_name = addr_name
|
|
self.expression = expression
|
|
self.on_line = kwargs.pop('on_line')
|
|
self.hit_count = kwargs.pop('hit_count', 0)
|
|
|
|
self.address_resolutions = None
|
|
|
|
super(DexDeclareAddress, self).__init__()
|
|
|
|
@staticmethod
|
|
def get_name():
|
|
return __class__.__name__
|
|
|
|
def get_watches(self):
|
|
return [StepExpectInfo(self.expression, self.path, 0, range(self.on_line, self.on_line + 1))]
|
|
|
|
def get_address_name(self):
|
|
return self.addr_name
|
|
|
|
def eval(self, step_collection):
|
|
assert os.path.exists(self.path)
|
|
self.address_resolutions[self.get_address_name()] = None
|
|
for step in step_collection.steps:
|
|
loc = step.current_location
|
|
|
|
if (loc.path and os.path.exists(loc.path) and
|
|
os.path.samefile(loc.path, self.path) and
|
|
loc.lineno == self.on_line):
|
|
if self.hit_count > 0:
|
|
self.hit_count -= 1
|
|
continue
|
|
try:
|
|
watch = step.program_state.frames[0].watches[self.expression]
|
|
except KeyError:
|
|
pass
|
|
else:
|
|
hex_val = int(watch.value, 16)
|
|
self.address_resolutions[self.get_address_name()] = hex_val
|
|
break
|