trace32 使用 python - 使用函数 T32_ReadMemoryObj

trace32 using python - use function T32_ReadMemoryObj

代码前的一个问题:

T32_ReadMemory 和 T32_ReadMemoryObj 之间有什么区别,在哪些情况下我应该更喜欢其中一个? 据我从 API PDF 中可以看出,'Obj' 版本更高级并且具有更多访问选项和对 64 位地址的访问权限,但常规版本没有缺陷所以如果它有效我可以用,对吗?

对于代码:

localBuffer = (ctypes.c_uint8 * size)()

myBufferHandle = ?
myAddressHandle32 = ?

t32api.T32_RequestBufferObj(ctypes.byref(myBufferHandle), 0)
t32api.T32_RequestAddressObjA32(ctypes.byref(myAddressHandle32), addr)

t32api.T32_ReadMemoryObj(myBufferHandle, myAddressHandle32, size)

t32api.T32_CopyDataFromBufferObj(localBuffer, size, myBufferHandle)
t32api.T32_ReleaseBufferObj(ctypes.byref(myBufferHandle))

这是尝试将远程 API PDF 中的以下代码示例“翻译”为 python:

我卡在了问号标记的地方,我不知道如何创建 trace32 内部类型。我查找了 python 示例,但找不到。

是的你是对的,你不需要使用T32_ReadMemoryObj(),你可以使用T32_ReadMemory()。尽管如此,我还是建议使用 T32_ReadMemoryObj(),因为它使用起来稍微复杂一点,但提供了充分的灵活性。在我看来,主要优点是更好的访问 class 管理(字符串而不是幻数)和 64 位地址。在简单的用例中,您可能不需要这些。

关于你的T32_ReadMemoryObj():你只需要创建空指针。 T32_Request...Obj() 函数将创建对象并设置指向它们的指针。

localBuffer = (ctypes.c_uint8 * size)()

myBufferHandle = ctypes.c_void_p()
myAddressHandle32 = ctypes.c_void_p()

t32api.T32_RequestBufferObj(ctypes.byref(myBufferHandle), 0)
t32api.T32_RequestAddressObjA32(ctypes.byref(myAddressHandle32), addr)

t32api.T32_ReadMemoryObj(myBufferHandle, myAddressHandle32, size)

t32api.T32_CopyDataFromBufferObj(localBuffer, size, myBufferHandle)
t32api.T32_ReleaseBufferObj(ctypes.byref(myBufferHandle))