我正在尝试使用python自动化Trace32函数。我正在尝试使用T32_WriteMemory()函数将值写入内存地址。有人可以帮助我如何继续这个功能吗?
以下是T32 Api pdf(api_remote.pdf)的参考资料:
int T32_WriteMemory(
uint32_t byteAddress
int access,
uint8_t *buffer,
int byteSize
);
byteAddress:开始写入的目标内存地址
access:内存访问说明符
缓冲区:输出
byteSize:要读取的字节数
答案 0 :(得分:5)
要通过TRACE32从python脚本写入内存,请执行以下操作:
详细说明:
<强> 1。在TRACE32上启用远程控制端口
将以下行添加到TRACE32配置文件(config.t32):
RCL=NETASSIST
PORT=20000
该区块之前和之后必须有空行。当然,您也可以为端口选择其他号码。使用这些设置启动的TRACE32 GUI将打开UDP / IP端口,以侦听对远程控制TRACE32的可能请求。
<强> 2。获取TRACE32远程访问的已编译共享库
您可以在<T32>/demo/api/capi/dll
的TRACE32安装中找到所需的共享库(在Windows上,这通常是C:\ t32 \ demo \ api \ capi \ dll)您也可以在{{ 3}}(搜索&#34; capi&#34;或&#34; python&#34;)
对于Windows,有t32api.dll和t32api64.dll。对于Linux,有t32api.so或t32api64.so。 (t32api64。*用于64位python解释器,而t32api。*用于32位python解释器。)
在下面我假设您将t32api-library放在与python脚本相同的目录中。
第3。在python脚本中加载t32api库
import platform
import ctypes
ostype = ctypes.sizeof(ctypes.c_voidp) * 8
if (platform.system()=='Windows') or (platform.system()[0:6]=='CYGWIN') :
# WINDOWS
t32api = ctypes.CDLL("./t32api64.dll" if ostype==64 else "./t32api.dll")
elif platform.system()=='Darwin' :
# Mac OS X
t32api = ctypes.CDLL("./t32api.dylib")
else :
# Linux
t32api = ctypes.CDLL("./t32api64.so" if ostype==64 else "./t32api.so")
在t32api-library与python脚本不在同一目录下,你必须适应路径。
<强> 4。通过t32api库连接到TRACE32 GUI
# Declare UDP/IP socket of the TRACE32 instance to access
t32api.T32_Config(b"NODE=",b"localhost")
t32api.T32_Config(b"PORT=",b"20000")
# Connect to TRACE32
error = t32api.T32_Init()
if error != 0 :
sys.exit("Can't connect to TRACE32!")
# Select to debugger component of TRACE32 (B:: prompt)
t32api.T32_Attach(1)
如果您在步骤1中选择了其他端口,则必须相应地更改行t32api.T32_Config(b"PORT=",b"20000")
。
<强> 5。声明T32_WriteMemory
的参数类型t32api.T32_WriteMemory.argtypes = [ctypes.c_uint32, ctypes.c_int, ctypes.c_char_p, ctypes.c_int]
t32api.T32_WriteMemory.restype = ctypes.c_int
第一行告诉python T32_WriteMemory是一个C函数,它有四个参数,类型为 uint32_t , int , char * 和 INT 。 第二行告诉python返回值的类型为 int 。
<强> 6。创建一个字节缓冲区,其中包含要以目标字节顺序写入的数据
wdata = 0x12345678 # <- Your own value here !
wbuffer = wdata.to_bytes(4, byteorder='little')
这里,0x12345678是我选择写的值。我通过TRACE32调试的目标CPU将其内存以little-endian字节顺序组织。所以我选择了&#34; byteorder =&#39; little&#39;&#34;在第二行中创建字节缓冲区。
<强> 7。从t32api库中调用T32_WriteMemory
# Set parameters for the memory access
byteAddress = 0x46c8 # <- Your address here !
access = 0x20
byteSize = 4 # amount of bytes to write (e.g. 4 bytes)
# Write data to memory via TRACE32
error = t32api.T32_WriteMemory(byteAddress, access, wbuffer, byteSize)
if error != 0 :
print("write failed")
access = 0x20
在CPU运行时启用内存访问(如果在TRACE32中启用了SYStem.MemAccess且CPU支持运行时访问),否则将其设置为0,或者查看TRACE32 API文档(api_remote.pdf) )其他价值观。
<强> 8。在结束脚本之前关闭与TRACE32的连接
t32api.T32_Exit()
读取内存是这样的:
# Declare argument types of T32_T32_ReadMemory
t32api.T32_T32_ReadMemory.argtypes = [ctypes.c_uint32,ctypes.c_int, ctypes.c_char_p,ctypes.c_int]
t32api.T32_T32_ReadMemory.restype = ctypes.c_int
# Create a buffer for the result
rbuffer = ctypes.create_string_buffer(byteSize)
# Request memory content via TRACE32
error = t32api.T32_ReadMemory(byteAddress, access, rbuffer, byteSize)
if error == 0 :
# Extract 32-bit value in little endian order from the buffer
data32 = int.from_bytes(rbuffer[0:4], byteorder='little')
print("read 0x%08X from D:0x%08X" % (data32, byteAddress))
else:
print("read failed")