如何使用GDB Python API中的第二种Value构造器并构造合规的缓冲区对象
错误原因与解决方案
报错根因
你遇到的Size of type is larger than that of buffer object错误,核心是两个逻辑不匹配:
gdb.Type.array()方法仅传入一个参数时,该参数代表数组的最大下标,数组实际长度为参数值 + 1,比你预期的长度多1字节,自然超过了缓冲区大小。- 若字符串包含非ASCII字符,
len(str)统计的是Unicode字符数,而str.encode()后的字节数会大于字符数,用字符数定义数组长度会出现大小不匹配。
正确实现方式
只要保证传入的缓冲区(支持Python缓冲区协议的对象,包括bytes、bytearray、memoryview、array.array等)的字节长度≥目标gdb类型的字节大小即可,修正后的代码如下:
def make_str(self, input_str): # 追加字符串结束符 input_str += '\0' # 编码得到字节缓冲区 str_buf = bytearray(input_str.encode('utf-8')) # 显式指定数组上下界,保证数组长度和缓冲区长度完全匹配 char_arr_type = gdb.lookup_type('char').array(0, len(str_buf) - 1) return gdb.Value(str_buf, char_arr_type)
其他场景示例
如果需要构造其他基础类型的gdb.Value,直接构造对应长度的缓冲区即可,比如构造小端4字节int类型的对象:
# 构造值为0x1234的小端int缓冲区 int_buf = b'\x34\x12\x00\x00' int_type = gdb.lookup_type('int') int_val = gdb.Value(int_buf, int_type)
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

