使用 gdb.value 更改 GDB 中的结构字段
Change struct field in GDB using a gdb.value
我正在 gdb 中定义一个方便的变量
>set $param = (T_packet*)malloc(sizeof(T_packet))
我可以通过 Python
检索它
>p = gdb_helper.parse_and_eval("$param")
<gdb.Value at 0x7f30b42f9170>
显示结构的字段
>python print(p.dereference())
{ID_PACKET = 0 , L_PACKET = 0}
尝试更改字段(C 等效项:p->ID_PACKET=1)
p.dereference()["ID_PACKET"] = 1
>"Setting of struct elements is not currently supported"
有没有办法使用 GDB Python API 更新 p 中字段 ID_Packet 的值?
目前无法使用 Value
API 设置值。这只是 gdb 中的一个小漏洞(我查看了但找不到这方面的错误,所以也许提交一个错误是一件好事)。
与此同时,您可以使用 gdb.parse_and_eval
解决它,但有点困难。这个想法是获取相关字段的地址,然后形成像 *(TYPE *) 0xADDR = VALUE
这样的表达式。或者,您可以使用 Inferior.write_memory
.
直接写入内存
这两种方法在某些情况下都会失败,例如,您不能以这种方式写入寄存器,从而阻止它在由于 SRA 优化而被拆分的结构上工作。
我正在 gdb 中定义一个方便的变量
>set $param = (T_packet*)malloc(sizeof(T_packet))
我可以通过 Python
检索它>p = gdb_helper.parse_and_eval("$param")
<gdb.Value at 0x7f30b42f9170>
显示结构的字段
>python print(p.dereference())
{ID_PACKET = 0 , L_PACKET = 0}
尝试更改字段(C 等效项:p->ID_PACKET=1)
p.dereference()["ID_PACKET"] = 1
>"Setting of struct elements is not currently supported"
有没有办法使用 GDB Python API 更新 p 中字段 ID_Packet 的值?
目前无法使用 Value
API 设置值。这只是 gdb 中的一个小漏洞(我查看了但找不到这方面的错误,所以也许提交一个错误是一件好事)。
与此同时,您可以使用 gdb.parse_and_eval
解决它,但有点困难。这个想法是获取相关字段的地址,然后形成像 *(TYPE *) 0xADDR = VALUE
这样的表达式。或者,您可以使用 Inferior.write_memory
.
这两种方法在某些情况下都会失败,例如,您不能以这种方式写入寄存器,从而阻止它在由于 SRA 优化而被拆分的结构上工作。