如何将GDB格式化打印的结果按输出格式存储到内部变量以用于自定义Python命令
解决GDB中存储格式化二进制输出到内部变量的问题
首先得明确:GDB的自动变量(比如$17)确实只存储原始数值,p/t这类格式参数只是显示层面的修饰,不会改变变量存储的核心内容。不过要把格式化后的二进制字符串存下来给自定义Python命令用,有两种靠谱的实现方式:
方法1:用GDB内置命令捕获输出到变量
GDB的capture命令可以捕获其他命令的输出结果,然后把它存到一个自定义变量里。你可以这样操作:
# 捕获p/t的二进制输出,存到$bin_str变量中 capture set $bin_str = output p/t -123 # 验证变量内容,此时$bin_str就是二进制字符串 p $bin_str # 输出示例:$1 = "11111111111111111111111110000101"
之后直接把$bin_str传给你的自定义Python命令即可:
my_custom_python_command $bin_str
方法2:在Python脚本里直接处理(更推荐)
既然你要调用自定义Python命令,其实完全可以跳过GDB的自动变量依赖,直接在Python里实现和p/t一致的补码转换逻辑,这样更灵活也不容易出问题。
比如你的Python脚本可以写成这样:
import gdb class MyCustomPythonCommand(gdb.Command): def __init__(self): super().__init__("my_custom_python_command", gdb.COMMAND_USER) def invoke(self, arg, from_tty): # 解析传入的十进制数值 num = int(arg) # 模拟GDB p/t的32位补码输出(需要64位就改64) bits = 32 # 处理负数的补码转换 if num < 0: bin_str = bin((1 << bits) + num)[2:] else: bin_str = bin(num)[2:].zfill(bits) # 此时bin_str就是和p/t完全一致的二进制字符串 print(f"转换后的二进制:{bin_str}") # 这里可以添加你的自定义业务逻辑 # 注册命令到GDB MyCustomPythonCommand()
把这个脚本保存为gdb_bin_convert.py,在GDB中加载:
source gdb_bin_convert.py
之后直接传入十进制数值调用命令就行:
my_custom_python_command -123
这种方法的好处是逻辑完全可控,不用依赖GDB的捕获命令,还能根据需求调整位数(32位/64位),和GDB原生的p/t行为完全对齐。
内容的提问来源于stack exchange,提问作者Wakan Tanka
相关产品推荐
相关产品推荐

